2

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

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

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

4

1 回答 1

3

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

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

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

第 1 步和第 3 步都是经典的归约,它们对数组的所有元素求和。我不会在这里介绍这一点,而是向您指出Mark Harris 对该主题的出色处理以及一些CUDA 示例代码。对于第 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);
    }

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

于 2012-11-10T01:30:58.043 回答