cudaMemcpy2D将值设置为0

cudaMemcpy2D将值设置为0,cuda,Cuda,我试图使用CudamAllocPicch和cudaMemcpy2D将二维数组从主机复制到设备,但我遇到了一个问题,它似乎将我的值设置为0 我将在浏览器中编写基本的代码。我知道从内核打印的值不是0。有什么想法吗 __global__ void kernel(float **d_array) { printf("%f", d_array[0][0]); } void kernelWrapper(int rows, int cols, float **array) { float *

我试图使用CudamAllocPicch和cudaMemcpy2D将二维数组从主机复制到设备,但我遇到了一个问题,它似乎将我的值设置为0

我将在浏览器中编写基本的代码。我知道从内核打印的值不是0。有什么想法吗

__global__ void kernel(float **d_array) {
    printf("%f", d_array[0][0]);
}

void kernelWrapper(int rows, int cols, float **array) {
    float **d_array;
    size_t pitch;
    cudaMallocPitch((void**) &d_array, &pitch, rows*sizeof(float), cols);
    cudaMemcpy2D(d_array, pitch, array, rows*sizeof(float), rows*sizeof(float), cols, cudaMemcpyHostToDevice);
    kernel<<<1,1>>>(d_array);
}
\uuuu全局\uuuuu无效内核(浮点**d\u数组){
printf(“%f”,d_数组[0][0]);
}
void kernelWrapper(整数行、整数列、浮点**数组){
浮点**d_数组;
大小和间距;
cudaMallocPitch((void**)和d_数组,以及节距,行*sizeof(float),cols);
cudaMemcpy2D(d_数组、音高、数组、行*sizeof(float)、行*sizeof(float)、cols、cudaMemcpyHostToDevice);
内核(d_数组);
}
出于某种原因,内核一直在打印0.0000。当我测试打印主机阵列的第一个元素时,我知道第一个元素不是0。发生了什么事

编辑: 我也尝试了这段代码,但得到了无效的指针错误

cudaMalloc(d_array, rows*sizeof(float*));
for (int i = 0; i < rows; i++) {
    cudaMalloc((void**) &d_array[i], cols*sizeof(float));
}
cudaMemcpy(d_array, array, rows*sizeof(float*), cudaMemcpyHostToDevice);
cudamaloc(d_数组,行*sizeof(float*);
对于(int i=0;i
不管名称如何,都不会将双订阅的C主机阵列(
**
)复制到双订阅的(
**
)设备阵列。您会注意到,它希望向它传递单指针(
*
),而不是双指针(
**
cudaMemcpy2D
用于复制平坦的跨步数组,而不是二维数组。跨越式访问的概念有两个固有的维度,这就是名称的来源

一般来说,尝试将2D数组从主机复制到设备要比仅仅一个API调用复杂得多。建议您展平阵列,以便可以使用单个指针(
*
)引用它,然后API调用将起作用。有很多例子说明了正确使用CudammCPY2D,所以,只需搜索它们

此外,当您在使用cuda代码时遇到困难时,您应该对所有CUDAAPI调用和内核调用执行此操作


如果确实要直接复制二维阵列,请查看一个工作示例。这并不简单。

d_数组
float*
类型,而内核参数是
float**
类型。另外,使用
cudaMemcpy2D
无法复制声明为
float**
的数组,因为它没有被传染地存储在内存中。很抱歉,d_数组声明是一个输入错误。好的,那么如何将浮点**从CPU复制到GPU。我尝试以迭代方式分配内存,但得到了无效的指针错误。