当我在cuda中使用此代码时,它只增加a [0],a [1],a [2]其他为0(没有增加)
__global__ void inc2(int * a){
int i= threadIdx.x;
i%=10;
atomicAdd(&(a[i]),1);
}
当我写
__global__ void inc2(int * a){
int i= threadIdx.x;
i%=10;
atomicAdd(&(a[6]),1);
}
它没有增加[6]
出了什么问题?遗憾
所有代码都是这个
__global__ void inc2(int * a){
int i= threadIdx.x;
i%=10;
atomicAdd(&(a[6]),1);
}
int main()
{
//=============================================
int aaa[10]={0};
int *q;
cudaMalloc((void**)&q,100);
cudaMemcpy(q,aaa,10,cudaMemcpyHostToDevice);
inc2<<<100,100>>>(q);
cudaMemcpy(aaa,q,10,cudaMemcpyDeviceToHost);
printf("\n\n");
for(int i=0;i<10;i++){
printf("%d\t",aaa[i]);
}
cudaFree(q);
return 0;
}
答案 0 :(得分:3)
首先,每当您遇到CUDA代码时遇到问题,都应该使用proper cuda error checking。
您可能会对与cudaMalloc
或cudaMemcpy
等功能相关的尺寸参数感到困惑。 bytes 中的They represent a size。所以这个:
cudaMemcpy(aaa,q,10,cudaMemcpyDeviceToHost);
仅传输10个字节,即2.5 int
个数量。如果您想查看修改后的a[6]
值,则必须转移int
中前两个a
数量的数量。
如果您修改这些行:
cudaMemcpy(q,aaa,40,cudaMemcpyHostToDevice);
^^
和
cudaMemcpy(aaa,q,40,cudaMemcpyDeviceToHost);
^^
我认为你会有更好的结果。