您的分配方案(分配的指针数组)有可能在主机上创建不连续的分配。没有任何类型的操作(包括您提到的操作)可以针对您的分配方案有可能创建的任意不连续区域。
简而言之,你的方法很麻烦。可以使其工作,但需要一个循环来执行复制操作 - 对“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;
}