【问题标题】:Passing a 2D Array to CUDA Device and Using it [duplicate]将二维数组传递给 CUDA 设备并使用它[重复]
【发布时间】:2014-09-03 02:25:53
【问题描述】:

我有一个与 CUDA 相关的问题。我创建了一个二维数组:

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 的代码示例来了解如何做到这一点,还解释了为什么我们需要支持(如果您使用链接中的方法)指针?

【问题讨论】:

    标签: c++ multidimensional-array cuda


    【解决方案1】:

    我的理解是 CUDA 只接受线性化的二维数组,所以真的是一维数组。

    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.

    【讨论】:

    • "CUDA 只接受线性化二维数组" 这是不正确的。 CUDA 可以处理二维数组。标记的重复问题证明了这一点。但是通常不建议这样做。
    【解决方案2】:
    1. 一次性创建二维数组new char[N*M]

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

    3. 使用cudaMemcpy(... hostToDevice)将 CPU 内存 (1.) 复制到 GPU (2.)

    【讨论】:

    • 这种不是创建一维数组吗?
    猜你喜欢
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2017-04-20
    • 2018-09-11
    • 2017-09-20
    相关资源
    最近更新 更多