Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在cudaPitchedPtr类型数据中使用数组_Cuda_Gpu - Fatal编程技术网

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

如何在cudaPitchedPtr类型数据中使用数组,cuda,gpu,Cuda,Gpu,尝试在数据类型CUDAPITCHEDTPTR中使用数组时遇到问题。 我将数据从主函数传输到全局函数,并打印值。但是,当我在cudaMemset3D中将值设置为12时,打印的结果是0.0000。附件是我的密码。如果有人能帮助我,我真的很感激 #include "cuda_runtime.h" #include "device_launch_parameters.h" #include "cuPrintf.cu" #include "stdio.h" __global__ void pr

尝试在数据类型CUDAPITCHEDTPTR中使用数组时遇到问题。 我将数据从主函数传输到全局函数,并打印值。但是,当我在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);
}
#包括“cuda_runtime.h”
#包括“设备启动参数.h”
#包括“cuPrintf.cu”
#包括“stdio.h”
__全局无效打印测试(双devptr[])
{
printf(“%f\n”,devptr[1]);
}
int main()
{
内部宽度=191,高度=192,深度=192;
cudaExtent extent=make_cudaExtent(宽度*尺寸(双精度)、高度、深度);
cudaPitchedPtr-Ex;
cudaMalloc3D(和Ex,范围);
cudaMemset3D(Ex,12,范围);
打印测试((双*)例如ptr);
}
问题在于,它用于将范围内的每个字节设置为一个值。说明中的注释:

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

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

如果您想看到一些有意义的内容,请在
cudamaloc3d
之后插入以下代码,而不是
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调用和内核启动后使用

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

问题在于,它用于将范围内的每个字节设置为一个值。说明中的注释:

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

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

如果您想看到一些有意义的内容,请在
cudamaloc3d
之后插入以下代码,而不是
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调用和内核启动后使用


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

您已将该值设置为1.22416778342e-250,因此正在打印的结果完全正确。您已将该值设置为1.22416778342e-250,因此正在打印的结果完全正确。