高效的 MPI 集体非阻塞通信

计算科学 并行计算 正则 mpi
2021-12-24 12:37:27

我正面临 MPI (Fortran) 的问题。我在每个节点都有一个非常大的矩阵,它们在不同的节点上有所不同。在我计算的某个时刻,每个节点都需要来自所有其他节点的矩阵,以便 MPI 通信在每个节点之间进行。每个节点都是发送者,同时它也是接收者。矩阵大小已经太大,无法让我简单地从所有其他节点收集数据。目前我正在做的是与 结合MPI_ISENDMPI_RECV但我认为这可能不是最好的解决方案,因此,我想请教各位专家。

更具体地说,每个节点上的矩阵大小相同,但它们不是彼此的副本,它们的元素在不同的节点上是不同的。在某个时间点,每个节点都需要来自所有其他节点的矩阵。因此,每个节点应在从所有其他节点接收数据的同时发送自己的矩阵。

我将非常感谢您提出宝贵的建议和解决方案。

2个回答

MPI_ISEND 和 MPI_IRECV 通常用于进程之间的非阻塞通信。如果您想将数据发送到所有进程,即集体操作。可以使用 MPI_BCAST 或 MPI_IBCAST。

您所描述的(每个节点都需要每个其他节点的数据)完全由以下方式实现MPI_Allgather

<code>MPI_Allgather</code> 操作示意图

您可能期望MPI_Allgather比众多MPI_ISEND/MPI_IRECV配对更有效,因为让 MPI 了解您的预期通信模式可以使其优化信息流。

另一方面,如果每个节点的计算时间差异很大,MPI_ISEND/MPI_IRECV配对将允许您在节点完成操作时立即开始传输信息,这可能会减少延迟。

在此问题的答案中讨论了其中一些权衡

最好的办法是使用 Vampir 来分析您的交流,并解决您发现的问题。否则,请尝试两者并比较它们的性能。