【问题标题】:Transfer part of array to CUDA memory将部分数组传输到 CUDA 内存
【发布时间】:2015-03-26 11:47:23
【问题描述】:

假设我在主机上有一个大小为N * M 的动态分配数组,我将其用作矩阵(即,作为二维数组)。现在,我将M 分为两部分,cpuMgpuM。我希望将该数组的一部分传输到 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 的方法是什么?

【问题讨论】:

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

标签: arrays memory cuda


【解决方案1】:

我很接近。我需要的可以使用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));

【讨论】:

    猜你喜欢
    • 2017-12-12
    • 1970-01-01
    • 2013-11-19
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多