mpi4py中的哪些操作是"同步"操作

时间:2014-12-16 17:07:18

标签: python multithreading loops reduce mpi4py

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

我正在使用n>运行此代码1个线程,在某些时候它们都进入for循环(所有核心都有相同的迭代次数)。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

其中许多都具有非阻塞等效物,您可以在其前面找到I(例如Isend),但这些并不是在mpi4py中全面实现的。

有关详情,请参阅mpi: blocking vs non-blocking

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