将数据从GPU复制到CPU - CUDA

时间:2018-01-09 21:31:56

标签: cuda

我在将数据从GPU复制到CPU时遇到问题。一开始我在GPU空间中创建变量:

__device__ float gpu_array;

在这个GPU函数中,我想将od.fS [gi](value = 0,43 ...)中的数据复制到gpu_array:

__global__ void Collide(.....){
....

//Streaming
    od.fS[gi] = fi_S;
    od.fN[gi] = fi_N;
    od.fE[gi] = fi_E;
    od.fW[gi] = fi_W;

    gpu_array = od.fC[gi];
}

此处结束是将数据从GPU复制到CPU的功能:

void showData(){

cudaDeviceSynchronize();

float* temp_array = NULL;
cudaMemcpyFromSymbol((void**)&temp_array, "gpu_array", sizeof(temp_array), 0, cudaMemcpyDeviceToHost);

float* cpu_array = (float*)malloc(sizeof(float));
cudaMemcpy(cpu_array, temp_array, sizeof(float), cudaMemcpyDeviceToHost);
printf("h_array: %f\n", *cpu_array);
}

最后复制但错误的值(0.00000,-0.00000等)。我究竟做错了什么?

1 个答案:

答案 0 :(得分:0)

使用cudaMemcpyFromSymbol时存在多个问题:

float* temp_array = NULL;
cudaMemcpyFromSymbol((void**)&temp_array, "gpu_array", sizeof(temp_array), 0, cudaMemcpyDeviceToHost);
  • 您尚未为temp_array
  • 指向的数据分配存储空间
  • 我们不再使用设备符号名称周围的引号
  • 目标指针应该只是一个指针,而不是指针的地址
  • cpu_array周围的剩余代码完全没必要

正确使用将是这样的:

void showData(){

  cudaDeviceSynchronize();

  float* temp_array = (float *)malloc(sizeof(float));
  cudaMemcpyFromSymbol(temp_array, gpu_array, sizeof(float));

  printf("h_array: %f\n", *temp_array);
}