【发布时间】:2016-03-26 16:25:02
【问题描述】:
我想在 main 方法中使用“printf”打印 d_t 全局二维数组变量。但我收到一个编译警告说:
不能在宿主函数中直接读取 __device__ 变量“d_t”
如何将全局二维数组变量从设备复制到主机,然后打印每一行的第一列?
__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;
}
【问题讨论】:
-
cudaMemcpy2D函数用于复制到或从倾斜分配(即使用cudaMallocPitch创建)。 Here 是cudaMemcpy2D的 API 文档。如果您在此 CUDA 标记上进行搜索,您会发现 许多 证明正确用法的问题和答案,例如 this one。使用proper CUDA error checking。
标签: cuda