cudaMemcpy2D将值设置为0
我试图使用CudamAllocPicch和cudaMemcpy2D将二维数组从主机复制到设备,但我遇到了一个问题,它似乎将我的值设置为0 我将在浏览器中编写基本的代码。我知道从内核打印的值不是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 *
__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。我尝试以迭代方式分配内存,但得到了无效的指针错误。