2016-02-26 63 views
-1
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,我想将其复制到2D阵列hMat主机上,其中在第一10个字段GPU阵列被复制到主机矩阵的第一行,接下来的10个字段被复制到第二行,依此类推。CUDA:从GPU复制1D阵列以二维阵列上的主机

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

回答

1

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

简而言之,你的方法很麻烦。可以使其工作,但需要一个循环来执行复制操作 - 对“2D数组”的每个“行”操作实质上是一个cudaMemcpy操作。如果你选择这样做,可能你不需要帮助。这很直接。

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

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

事情是这样的:

#include <stdio.h> 

typedef char mytype; 

int main(){ 

    const int rows = 10; 
    const int cols = 10; 

    mytype **hMat = new mytype*[rows]; 
    hMat[0] = new mytype[rows*cols]; 
    for (int i = 1; i < rows; i++) hMat[i] = hMat[i-1]+cols; 

    //initialize "2D array" 

    for (int i = 0; i < rows; i++) 
    for (int j = 0; j < cols; j++) 
     hMat[i][j] = 0; 

    mytype *dArr; 
    cudaMalloc(&dArr, rows*cols*sizeof(mytype)); 

    //copy to device 
    cudaMemcpy(dArr, hMat[0], rows*cols*sizeof(mytype), cudaMemcpyHostToDevice); 

    //kernel call 


    //copy from device 
    cudaMemcpy(hMat[0], dArr, rows*cols*sizeof(mytype), cudaMemcpyDeviceToHost); 

    return 0; 
}