【问题标题】:MPI+CUDA : CPU-to-GPU data transfer with multiple CPU-host (MPI) and a single GPU (CUDA)MPI+CUDA:多 CPU 主机 (MPI) 和单 GPU (CUDA) 的 CPU 到 GPU 数据传输
【发布时间】:2012-07-07 00:07:56
【问题描述】:

我想改进 MPI-CPU 节点和单个 GPU 之间的“数据传输”算法。

对于 NUMPROCS 节点,每个 MPI 节点都有一个 Ntot/NUMPROCESS float4 的一维数组。

我的算法很简单:

1) 将一维数组 (MPI_GATHER) 聚集在主节点上的一个大数组(大小为 Ntot)中。

2) 使用主节点,通过 cudaMemcpy 函数将大数组发送到 GPU。 CUDA 内核与主节点一起启动。

是否可以避免第一步?我的意思是,每个 MPI 节点都通过 cudaMemcpy 发送其数组,并且连接直接在 GPU 的内存上完成。

【问题讨论】:

  • 参与MPI_GATHER的进程是否与GPU在同一物理主机上运行,​​还是通过网络进行通信?
  • Open MPI 支持某些操作的实验性直接 GPU 内存传输。 MPI_Gather 是支持的操作之一。代码在主干中,因此您应该从 SVN 源代码编译您自己的 Open MPI。见herehere
  • 我在四核 CPU 的 4 个核心上使用 MPI_gather。我的 GPU 是 GTX680。我使用 CUDA 4.2 和 MPICH2 版本 1.2.1p1
  • Open MPI 似乎是个好主意,但我没有找到任何 MPI+CUDA 教程...也许还有其他使用 cudastream 的解决方案?
  • 在主干 Open MPI 中,它通过将设备指针作为源数据缓冲区参数传递给 MPI_Gather 来工作。 Open MPI 检测到指针是设备指针,并在后台使用 CUDA 函数。

标签: cuda mpi


【解决方案1】:

由于您的 MPI-CPU 节点与 GPU 在同一物理主机上运行,​​因此您可以避免第一步。

您可以使用异步函数CudaMemcpyAsync() 进行第二步。该函数有一个流参数。它有助于同时进行 GPU 计算和memcpy

在每个进程中,你可以使用CudaSetDevice(devicenumber)来控制你选择的GPU。

有关详细信息,请参阅 CUDA 手册。

【讨论】:

    猜你喜欢
    • 2012-08-16
    • 2013-09-19
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2014-05-14
    相关资源
    最近更新 更多