1

我正在使用从中导入 MPI 的 mpi4py 编写 python 代码。然后,我设置了全局通信器 MPI.COMM_WORLD 并存储在变量 comm 中。

我正在使用 n > 1 个线程运行此代码,并且在某些时候它们都进入了一个 for 循环(所有内核都有相同数量的迭代要通过)。

在 for 循环中,我有一个“comm.reduce(...)”调用。这似乎适用于少数核心,但随着问题规模的增加(比如 64 个核心),我体验到我的程序“挂起”。

所以我想知道这是否与 reduce(...) 调用有关。我知道这个调用需要所有线程(也就是说,假设我们总共运行了 2 个线程。如果一个线程进入循环但另一个没有出于某种原因,程序将挂起,因为 reduce(...) 调用等待对于两个线程)。

我的问题是: reduce 调用是“同步”任务吗,即它是否像“comm.Barrier()”调用一样工作?而且,如果可能,更一般地说,同步任务是什么(如果有的话,除了障碍)?

4

1 回答 1

3

是的,标准的 MPI reduce 调用是阻塞的(所有线程必须在任何线程可以继续之前与 root 通信)。其他阻塞调用是 Allgather、Allreduce、AlltoAll、Barrier、Bsend、Gather、Recv、Reduce、Scatter 等。

其中许多具有非阻塞等效项,您会发现它们前面有一个 I(Isend eg),但这些并没有在 mpi4py 中全面实现。

有关更多信息,请参阅mpi:blocking vs non-blocking

不确定你的挂断情况。可能是处理器拥挤的问题——在 4 核桌面上运行 64 线程作业可能会很吵。

于 2014-12-16T18:36:51.817 回答