Arrays 将阵列的一部分传输到CUDA内存

Arrays 将阵列的一部分传输到CUDA内存,arrays,memory,cuda,Arrays,Memory,Cuda,假设我在主机上有一个大小为N*M的动态分配数组,我将其用作矩阵(即2D数组)。现在,我将M分为两部分,cpuM和gpuM。我希望将该数组的一部分传输到GPU,即N*gpuM的(倾斜)数组。我该怎么做 到目前为止,我已经: cudaMemcpy3DParms cpy = { 0 }; cpy.srcPtr = make_cudaPitchedPtr(h_mat, M * sizeof(TYPE), gpuM, N); cpy.dstPtr = d_mat; cpy.extent = make_cu

假设我在主机上有一个大小为
N*M
的动态分配数组,我将其用作矩阵(即2D数组)。现在,我将
M
分为两部分,
cpuM
gpuM
。我希望将该数组的一部分传输到GPU,即
N*gpuM
的(倾斜)数组。我该怎么做

到目前为止,我已经:

cudaMemcpy3DParms cpy = { 0 };
cpy.srcPtr = make_cudaPitchedPtr(h_mat, M * sizeof(TYPE), gpuM, N);
cpy.dstPtr = d_mat;
cpy.extent = make_cudaExtent(gpuM * sizeof(TYPE), N, 1);
cpy.kind = cudaMemcpyHostToDevice;
cudaCheckError(cudaMemcpy3D(&cpy));
然而,这不起作用。我不知道在
M
维度(
cpuM
)中指定要跳过的元素数量,这显然是我需要的


那么,如何只将阵列的一部分复制到GPU呢?

我差一点就知道了。我所需要的可以用
srcPos
和/或
dstPos
完成,它们采用
cudaPos
结构,包含任何所需的偏移量。比如:

cudaMemcpy3DParms cpy = { 0 };
cpy.srcPtr = make_cudaPitchedPtr(h_mat, M * sizeof(TYPE), M, N);
cpy.srcPos = make_cudaPos(cpuM * sizeof(TYPE), 0, 0);
cpy.dstPtr = d_mat;
cpy.extent = make_cudaExtent(gpuM * sizeof(TYPE), N, 1);
cpy.kind = cudaMemcpyHostToDevice;
cudaCheckError(cudaMemcpy3D(&cpy));

你说“部分”是什么意思?要传输任意大小的子矩阵,还是只需要一半的列或行,。或者什么?一行中任意数量的元素中的部分。例如,如果矩阵是
4x5(NxM)
,我想要
cpuM=3
gpuM=2
,那么gpu将得到4x2矩阵,其中元素是原始矩阵的索引
[N][3]
[N][4]
(即每行的最后两个)。