尝试在数据类型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);
}
答案 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提问/回答感兴趣。