我想使用" 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;
}
答案 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
调用非常相似。