gpt4 book ai didi

cuda - 如何计算 gpu_array 的方差?

转载 作者:行者123 更新时间:2023-12-04 05:24:51 25 4
gpt4 key购买 nike

我正在尝试计算 2D gpu_array 的方差。减少核听起来是个好主意:

http://documen.tician.de/pycuda/array.html

但是,该文档暗示缩减内核只是将 2 个数组缩减为 1 个数组。如何将单个二维数组减少为单个值?

最佳答案

我想第一步是为这种情况定义方差。在 matlab 中,二维数组上的方差函数返回值的向量(一维数组)。但听起来你想要一个单值方差,所以正如其他人已经建议的那样,可能要做的第一件事就是将二维数组视为一维数组。在 C 中,我们不需要任何特殊步骤来完成此操作。如果你有一个指向数组的指针,你可以像它是一个一维数组一样索引它。我假设您不需要 how to handle a 2D array with a 1D index 的帮助.

现在,如果它是你所追求的一维方差,我假设一个函数,如方差(x)=sum((x[i]-mean(x))^2) 其中总和是所有 i,就是你之后(根据我对 wikipedia article 的阅读)。我们可以将其分解为 3 个步骤:

  • 计算平均值(这是一个经典的减少 - 为数据集生成一个值 - 对所有元素求和然后除以元素数量)
  • 计算所有 i 的值 (x[i]-mean)^2 - 这是一个逐个元素的操作,产生一个与输入数据集大小(元素数)相等的输出数据集
  • 计算步骤 2 中生成的元素的总和 - 这是另一种经典的归约,因为为整个数据集生成了一个值。

  • 第 1 步和第 3 步都是经典的归约,它们对数组的所有元素求和。我不会在这里介绍那个领域,而是将您指向 Mark Harris' excellent treatment of the topic以及一些 CUDA sample code .对于第 2 步,我敢打赌您可以自己找出内核代码,但它看起来像这样:
    #include <math.h>
    __global__ void var(float *input, float *output, unsigned N, float mean){

    unsigned idx=threadIdx.x+(blockDim.x*blockIdx.x);
    if (idx < N) output[idx] = __powf(input[idx]-mean, 2);
    }

    请注意,您可能希望将缩减和上述代码组合到一个内核中。

    关于cuda - 如何计算 gpu_array 的方差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13313201/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com