【问题标题】:Why is this cuda program printing 0?为什么这个 cuda 程序打印 0?
【发布时间】:2020-09-26 12:15:32
【问题描述】:

此代码正在打印“结果为 0”,似乎不是从设备复制结果。这是为什么呢?

__global__ void add_arrays(int *a, int *b, int *c, int size){
    int index = threadIdx.x + blockIdx.x * blockDim.x;

    //avoid accessing beyond the end of the array
    if (index < size)
        {    c[index] = a[index] + b[index];   }
}

#define N (2048 * 2048)
#define THREADS_PER_BLOCK 512

int main()
{

    int *a, *b, *c;          // local (host) copy
    int *d_a, *d_b, *d_c; // device copy
    int size = N * sizeof(int);

    //allocating space for device copies ON THE DEVICE
    CUDA_CHECK_RETURN(cudaMalloc((void **)&d_a, size));
    CUDA_CHECK_RETURN(cudaMalloc((void **)&d_b, size));
    CUDA_CHECK_RETURN(cudaMalloc((void **)&d_c, size));


    //allocating space for local copies ON THE HOST and initialize: a, b
    a = (int *)malloc(size); random_ints(a, N);
    b = (int *)malloc(size); random_ints(b, N);
    c = (int *)malloc(size); //random_ints(c, N);

    //copy inputs to device
    CUDA_CHECK_RETURN(cudaMemcpy(d_a, &a, size, cudaMemcpyHostToDevice));
    CUDA_CHECK_RETURN(cudaMemcpy(d_b, &b, size, cudaMemcpyHostToDevice));

    int num_block = (N + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK;
    add_arrays<<<num_block, THREADS_PER_BLOCK>>>(d_a, d_b, d_c, N);

    // Copy result back from Device to Host
    CUDA_CHECK_RETURN(cudaMemcpy(c, d_c, size, cudaMemcpyDeviceToHost));

    for (int i =0; i<N; ++i) {
        printf("Result is %d \n", *(c+i));
    }

【问题讨论】:

  • 为什么cudaMemcpy&amp;a的第二个参数? a 是一个与d_a 相同类型的指针,所以只需传递a

标签: cuda gpu


【解决方案1】:

您可能需要考虑在您的问题中发布一个完整的reproducible 示例,以便它包含您对CUDA_CHECK_RETURNrandom_ints 的定义、包含的标题等。如 cmets 中所述,您的代码中的明显问题虽然是这样的

cudaMemcpy(d_a, &a, size, cudaMemcpyHostToDevice)

应该是

cudaMemcpy(d_a, a, size, cudaMemcpyHostToDevice)

同样对于bab 是指针。

【讨论】:

  • 谢谢,当我有完整的代码时,SO 抱怨代码太多。
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多