CUDA找到数组元素的总和

时间:2014-06-05 04:47:15

标签: arrays cuda

你好我想用CUDA找到数组元素的总和。

__global__ void countZeros(int *d_A, int * B)
{
    int index = blockIdx.x * blockDim.x + threadIdx.x;
    B[0] = B[0]+d_A[index];
}

所以最后,B [0]应该包含所有元素的总和。但我注意到B [0]每次都等于零。所以最后它只包含最后一个元素。 为什么B [0]每次都变为零?

1 个答案:

答案 0 :(得分:3)

所有线程都写入B[0],有些线程可能正在尝试同时写入。这行代码:

B[0] = B[0]+d_A[index];

需要读取B[0]。如果多个线程同时执行此操作,您将得到奇怪的结果。

您可以通过以下方式进行简单修复:

atomicAdd(B, d_A[index]);

并且您应该得到明智的结果(假设您的代码中没有其他错误,您还没有显示。)请确保在调用此内核之前将B[0]初始化为某个已知值。

但是,如果你想有效地做到这一点,你应该研究cuda reduction sample或者只使用CUB

每次遇到CUDA代码时,请务必使用proper cuda error checking

因此,如果您仍然无法获得明智的结果,使用正确的cuda错误检查来检测您的代码,然后再询问"我做了这个更改,但它仍然没有。工作,为什么?"我无法告诉您原因,因为这是您展示的唯一代码片段。