你好我想用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]每次都变为零?
答案 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错误检查来检测您的代码,然后再询问"我做了这个更改,但它仍然没有。工作,为什么?"我无法告诉您原因,因为这是您展示的唯一代码片段。