CUDA函数增加数组值

时间:2014-08-25 21:43:41

标签: cuda

当我在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;
 }

1 个答案:

答案 0 :(得分:3)

首先,每当您遇到CUDA代码时遇到问题,都应该使用proper cuda error checking

您可能会对与cudaMalloccudaMemcpy等功能相关的尺寸参数感到困惑。 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);
                 ^^

我认为你会有更好的结果。