我有一个与CUDA有关的问题。我用
创建了一个2D数组char **WordMatrix = new char*[N]; // M and N set by the user
for(int i = 0; i < N; ++i)
{
WordMatrix[i] = new char[M];
}
我用循环填充数组。在我的问题所在:我无法在设备中分配内存并从主机复制到设备。
我看到了与此相关的其他问题,但我不理解其逻辑。比如这个话题:https://devtalk.nvidia.com/default/topic/410182/double-pointer-allocation/或者在这里。
我想了解如何使用cudaMemcpy和cudaMalloc和2D Array的代码示例也解释了为什么我们需要支持(如果您使用链接中的方法)指针?
我的理解是CUDA只接受线性化的2D数组,所以实际上是一个1D数组。
int *my_array = new int[height*width];
for (int h = 0; h < height; h++){
for (int w = 0; w < width; w++)
my_array[width * h + w] = value;
}
你可以把它复制到设备内存,就像在另一个答案。
同样,这个问题有更多的信息:
-
创建您的2D数组在一块
new char[N*M]
-
在GPU
cudaMalloc(... sizeof(char)*N*M)
上分配相同的内存 -
用
cudaMemcpy(... hostToDevice)
将CPU内存(1.)复制到GPU (2.)