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]
(即每行的最后两个)。