CUDA:将1D阵列从GPU复制到主机上的2D阵列

时间:2016-02-26 19:28:58

标签: cuda

int main() {
    char** hMat,* dArr;

    hMat = new char*[10];
    for (int i=0;i<10;i++) {
        hMat[i] = new char[10];
    }
    cudaMalloc((void**)&dArr,100);

    // Copy from dArr to hMat here:

}

我在GPU上有一个数组dArr,我想将它复制到主机上的二维数组hMat,其中GPU数组中的前10个字段被复制到第一个主机矩阵中的行,接下来的10个字段将复制到第二行,依此类推。

文档中有一些功能,即CudaMemcpy2DCudaMemcpy2DFromArray,但我不太确定应该如何使用它们。

1 个答案:

答案 0 :(得分:1)

您的分配方案(指针数组,单独分配)有可能在主机上创建不连续的分配。没有@SuppressWarnings("unchecked")任何类型的操作(包括你提到的那些)可以针对任意不连续的区域,你的分配方案有可能创建。

简而言之,您的方法很麻烦。它可以工作,但需要一个循环来执行复制 - 基本上是“2D阵列”的每个“行”一个cudaMemcpy操作。如果你选择这样做,大概你不需要帮助。这很简单。

我建议您修改主机分配以创建基础连续分配。这样的区域可以通过单个普通cudaMemcpy调用来处理,但您仍然可以将其视为主机代码中的“2D数组”。

基本思想是创建一个正确的整体大小的单一分配,然后创建一组指向单个分配中特定位置的指针,其中每个“行”应该开始。然后使用初始双指针引用此指针数组。

这样的事情:

cudaMemcpy