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个字段将复制到第二行,依此类推。
文档中有一些功能,即CudaMemcpy2D
和CudaMemcpy2DFromArray
,但我不太确定应该如何使用它们。
答案 0 :(得分:1)
您的分配方案(指针数组,单独分配)有可能在主机上创建不连续的分配。没有@SuppressWarnings("unchecked")
任何类型的操作(包括你提到的那些)可以针对任意不连续的区域,你的分配方案有可能创建。
简而言之,您的方法很麻烦。它可以工作,但需要一个循环来执行复制 - 基本上是“2D阵列”的每个“行”一个cudaMemcpy
操作。如果你选择这样做,大概你不需要帮助。这很简单。
我建议您修改主机分配以创建基础连续分配。这样的区域可以通过单个普通cudaMemcpy
调用来处理,但您仍然可以将其视为主机代码中的“2D数组”。
基本思想是创建一个正确的整体大小的单一分配,然后创建一组指向单个分配中特定位置的指针,其中每个“行”应该开始。然后使用初始双指针引用此指针数组。
这样的事情:
cudaMemcpy