将部分数组传输到 CUDA 内存
Transfer part of array to CUDA memory
假设我在主机上有一个大小为 N * M
的动态分配数组,我将其用作矩阵(即二维数组)。现在,我把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
and/or 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));
假设我在主机上有一个大小为 N * M
的动态分配数组,我将其用作矩阵(即二维数组)。现在,我把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
and/or 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));