如何在cudaPitchedPtr类型数据中使用数组
尝试在数据类型CUDAPITCHEDTPTR中使用数组时遇到问题。 我将数据从主函数传输到全局函数,并打印值。但是,当我在cudaMemset3D中将值设置为12时,打印的结果是0.0000。附件是我的密码。如果有人能帮助我,我真的很感激如何在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
#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,因此正在打印的结果完全正确。