【发布时间】:2013-07-30 20:11:14
【问题描述】:
我正在尝试使用 cudaMallocPitch 和 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);
}
由于某种原因,内核一直在打印 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);
【问题讨论】:
-
d_array是float*类型,而内核参数是float**类型。此外,cudaMemcpy2D无法复制声明为float**的数组,因为它不会传染地存储在内存中。 -
抱歉,d_array 声明是一个错字。好的,那么我如何将浮点**从 CPU 复制到 GPU。我尝试迭代分配内存,但我得到了无效指针错误。
标签: cuda