我遇到了与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 的代码示例来解释为什么我们需要支持(如果你在链接中使用方法)指针?< / p>
答案 0 :(得分:3)
我的理解是CUDA只接受线性化的2D数组,所以实际上是一维数组。
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;
}
然后,您可以将其复制到设备存储器,如另一个答案。
此外,这个问题还有更多信息: Allocate 2D Array on Device Memory in CUDA
答案 1 :(得分:2)
将您的2D数组创建为一个new char[N*M]
在GPU cudaMalloc(... sizeof(char)*N*M)
上分配相同的内存
使用cudaMemcpy(... hostToDevice)