我正在尝试计算 2D gpu_array 的方差。缩减内核听起来是个好主意:
http://documen.tician.de/pycuda/array.html
但是,该文档暗示缩减内核只是将 2 个数组缩减为 1 个数组。如何将单个二维数组缩减为单个值?
我正在尝试计算 2D gpu_array 的方差。缩减内核听起来是个好主意:
http://documen.tician.de/pycuda/array.html
但是,该文档暗示缩减内核只是将 2 个数组缩减为 1 个数组。如何将单个二维数组缩减为单个值?
我想第一步是为这种情况定义方差。在 matlab 中,二维数组上的方差函数返回值的向量(一维数组)。但听起来你想要一个单值方差,所以正如其他人已经建议的那样,可能要做的第一件事是将二维数组视为一维。在 C 中,我们不需要任何特殊步骤来完成此操作。如果你有一个指向数组的指针,你可以像一维数组一样索引它。我假设您不需要有关如何处理具有 1D 索引的 2D 数组的帮助。
现在,如果它是你所追求的一维方差,我假设一个函数,如 variance(x)=sum((x[i]-mean(x))^2) 其中总和超过所有 i,就是你'之后(基于我对维基百科文章的阅读)。我们可以将其分解为 3 个步骤:
第 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);
}
请注意,您可能希望将缩减和上述代码组合到一个内核中。