如何在cudaPitchedPtr类型数据中使用该数组

时间:2013-04-23 03:48:31

标签: cuda gpu

尝试在数据类型cudaPitchedptr中使用数组时遇到问题。 我将数据从main函数传输到全局函数并打印该值。但是,当我在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);
}

1 个答案:

答案 0 :(得分:2)

问题是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 error checking

您可能也对this提问/回答感兴趣。