0

我在尝试使用数据类型 cudaPitchedptr 中的数组时遇到了问题。我将数据从主函数传输到全局函数并打印值。但是,当我在 cudaMemset3D 中将值设置为 12 时,打印的结果为 0.0000。附上我的代码。如果有人可以帮助我,我真的很感激。

 #include "cuda_runtime.h"
 #include "device_launch_parameters.h"
 #include "cuPrintf.cu"
 #include "stdio.h" 
 __global__ void printtest(double devptr[])
{

printf("%f\n",devptr[1]);
}




int main()
{

int width=191, height=192, depth=192;
cudaExtent extent= make_cudaExtent( width*sizeof(double),height,depth);
cudaPitchedPtr Ex;
cudaMalloc3D(&Ex,extent);

cudaMemset3D(Ex,12 ,extent);

printtest<<<1,1>>>( (double*) Ex.ptr);
}
4

1 回答 1

3

问题是cudaMemset3D用于将范围内的每个字节设置为一个值。说明中注意:

value- 为指定内存的每个字节设置的值

因此,您将分配区域中的每个字节设置为 12(十进制)。然后,您连续获取其中的 8 个字节,并尝试将其作为双精度浮点类型进行解释。你会得到不是你期望的结果。

如果你想看到一些有意义的东西,那么在你的之后cudaMalloc3D,而不是cudaMemset3D,插入这个代码:

  double myval = 1.3579f;  //or whatever value you want to see
  double *hostdata;
  hostdata = (double *)malloc(width*sizeof(double)* height*depth);
  if (hostdata == 0) {printf("malloc fail"); return 1;}
  hostdata[1] = myval;
  cudaMemcpy3DParms p = {0};
  p.srcPtr = make_cudaPitchedPtr(hostdata, width*sizeof(double), width, height);
  p.dstPtr = Ex;
  p.extent = extent;
  p.srcPos = make_cudaPos(0,0,0);
  p.dstPos = make_cudaPos(0,0,0);
  p.kind=cudaMemcpyHostToDevice;
  cudaMemcpy3D(&p);

我还建议在代码中的每次 api 调用和内核启动后使用cuda 错误检查。

您可能也对此问题/答案感兴趣。

于 2013-04-23T04:34:44.240 回答