如何从主机访问设备2D数组全局变量

时间:2016-03-25 23:30:27

标签: cuda

我想使用" printf"打印d_t全局2D数组变量。内部主要方法。但我得到了一个编译警告说:

  

__device__变量" d_t"无法在主机功能中直接读取

如何将全局2D数组变量从设备复制到主机,然后打印每行的第一列?

__device__ double *d_t;

__device__ size_t d_gridPitch;


__global__ void kernelFunc()
{
    int i = blockIdx.x * blockDim.x + threadIdx.x;

    double* rowt = (double*)((char *)d_t + i * d_gridPitch);
    rowt[0] = rowt[0] + 40000;

}


int main()
{
    int size = 16;
    size_t d_pitchLoc;
    double *d_tLoc;

    cudaMallocPitch((void**)&d_tLoc, &d_pitchLoc, size * sizeof(double), size);
    cudaMemset2D(d_tLoc, d_pitchLoc, 0, size * sizeof(double), size);

    cudaMemcpyToSymbol(d_gridPitch, &d_pitchLoc, sizeof(int));
    cudaMemcpyToSymbol(d_t, & d_tLoc, sizeof(d_tLoc));

    kernelFunc<<<1,size>>>();

    for(int i=0; i< size; i++){
        double* rowt = (double*)((char *)d_t + i * d_gridPitch);
        printf("%.0f, ",rowt[0]);
    }

    cudaDeviceReset();

    return 0;
}

1 个答案:

答案 0 :(得分:1)

如评论中所示,cudaMemcpy2D API专为此任务而设计。您必须分配或静态定义主机内存缓冲区或容器,以充当来自设备的数据的存储,然后将该主机缓冲区的间距提供给cudaMemcpy2D调用。 API处理音调转换而无需在呼叫方进行任何进一步干预。

如果用以下内容替换打印循环:

double* h_t = new double[size * size];
cudaMemcpy2D(h_t, size * sizeof(double), d_tLoc, d_pitchLoc, 
        size * sizeof(double), size, cudaMemcpyDeviceToHost);
for(int i=0, j=0; i< size; i++){
    std::cout << h_t[i * size + j] << std::endl; 
}

[注意我在这里使用iostream进行打印。 CUDA使用C ++编译器来编译主机代码,您应该优先选择iostream函数而不是cstdio,因为它们不容易出错,并且支持在大多数平台上改进诊断。“

您可以看到API调用表单与我在上一个问题中为您提供的cudaMemset2D调用非常相似。