将2D阵列传递给CUDA设备并使用它

时间:2014-07-12 16:35:49

标签: c++ multidimensional-array cuda

我遇到了与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>

2 个答案:

答案 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)

  1. 将您的2D数组创建为一个new char[N*M]

  2. 在GPU cudaMalloc(... sizeof(char)*N*M)上分配相同的内存

  3. 使用cudaMemcpy(... hostToDevice)

  4. 将CPU内存(1.)复制到GPU(2.)