Debugging 我在CUDA中使用cudaMallocPitch和cudaMemcpy2D,但我没有得到正确的答案!

Debugging 我在CUDA中使用cudaMallocPitch和cudaMemcpy2D,但我没有得到正确的答案!,debugging,cuda,Debugging,Cuda,这是我的代码,初始化矩阵d_ref并将其复制到设备。我不确定我是否正确使用了CudamAllocPicch和cudaMemcpy2D,但我尝试了使用和第20页底部的 我在输出中得到的只是0 我的代码怎么了?这是做这项工作的最佳方式吗 提前谢谢 __host__ float *d_ref; float **h_ref = new float* [width]; for (int i=0;i<width;i++) h_ref[i]= new float [height];

这是我的代码,初始化矩阵d_ref并将其复制到设备。我不确定我是否正确使用了CudamAllocPicch和cudaMemcpy2D,但我尝试了使用和第20页底部的

我在输出中得到的只是0

我的代码怎么了?这是做这项工作的最佳方式吗

提前谢谢

__host__    

float *d_ref;

float **h_ref = new float* [width];
for (int i=0;i<width;i++)
    h_ref[i]= new float [height];

for (int i=0;i<width;i++){
    for (int j=0;j<height;j++){
        h_ref[i][j]=ref_list[j][i]; //transpose
    }   
}

size_t ref_pitch;

cudaMallocPitch(&d_ref, &ref_pitch, width * sizeof(float), height);

cudaMemcpy2D(d_ref, ref_pitch, h_ref, width*sizeof(float),width*sizeof(float), height*sizeof(float), cudaMemcpyHostToDevice);


lowerBound<<<grid, block>>>(d_ref, ...




__global__ void lowerBound (float* d_ref, ....


    float* ref = (float*)((char*)d_ref + blockIdx.x * ref_pitch);

    cuPrintf(" %f \n",ref[threadIdx.x]);

对cudaMemcpy2D的调用假定h_ref是连续存储的'width'x'height'浮点元素的2D数组,而实际上它是'width'指针的1D数组


与其将矩阵表示为向量的1D数组,我建议将其存储在“宽度”x“高度”浮点的1D数组中,并基于行、列使用宏进行访问。

对cudaMemcpy2D的书面调用假设h_ref是连续存储的“宽度”x“高度”浮点元素的2D数组,实际上,它是一个1D“宽度”指针数组

与其将矩阵表示为一维向量数组,我建议将其存储在“宽度”x“高度”浮动的一维数组中,并使用宏根据行、列进行访问。

在这一行:

cudaMemcpy2Dd_ref,ref_pitch,h_ref,width*sizeoffloat,width*sizeoffloat,height*sizeoffloat,CUDAMEMCPyHOSTTO device

你为什么要把高度乘以船的尺寸?你传输的数据太多了

在这一行中:

cudaMemcpy2Dd_ref,ref_pitch,h_ref,width*sizeoffloat,width*sizeoffloat,height*sizeoffloat,CUDAMEMCPyHOSTTO device


你为什么要把高度乘以船的尺寸?你传输的数据太多了

谢谢!我解决了这个问题,在cudaMemcpy2D中的h_ref旁边加了一颗星星。cudaMemcpy2Dd_ref,ref_pitch,h_ref,widthsizeoffloat,width*sizeoffloat,hight,cudamemcpyhostto设备;请注意,不能保证href[i]指向的各个列向量将连续存储,因此即使在更改代码后,代码仍可能随时失败。好的!我还是有问题。显然它没有正确复制。我将数组的定义从动态更改为静态,但仍然不起作用。我知道更改为1D是一种解决方案,但如何使用CudamAllocPicch和cudaMemcpy2D?应该有一种在2D中实现的方法…谢谢!我解决了这个问题,在cudaMemcpy2D中的h_ref旁边加了一颗星星。cudaMemcpy2Dd_ref,ref_pitch,h_ref,widthsizeoffloat,width*sizeoffloat,hight,cudamemcpyhostto设备;请注意,不能保证href[i]指向的各个列向量将连续存储,因此即使在更改代码后,代码仍可能随时失败。好的!我还是有问题。显然它没有正确复制。我将数组的定义从动态更改为静态,但仍然不起作用。我知道更改为1D是一种解决方案,但如何使用CudamAllocPicch和cudaMemcpy2D?应该有一种在2D中实现的方法…真的!参数高度不是以字节为单位,而是仅垂直行数为真!参数高度不以字节为单位,但仅以垂直行数为单位