MPI_Allreduce对于7个或更多进程而言速度较慢

MPI_Allreduce对于7个或更多进程而言速度较慢,mpi,openmpi,mpich,Mpi,Openmpi,Mpich,我已经编写了这个小的MPI\u Allreducebenchmark: 它可以与openmpi1.8.4和mpich1.4.1配合使用 结果(1列表示处理器数量,1列表示相应的挂钟时间)为或 使用MPICH 3.1.4,7、8或更多进程的挂钟时间增加:结果为 在一个真实的代码中(编辑:一个计算流体动力学软件),但对于上面所有3个MPI实现,我观察到7个、8个或更多进程都存在相同的问题,同时我希望我的代码可以扩展到至少8个或16个进程 因此,我试图了解小基准测试和MPICH 3.1.4会发生什么

我已经编写了这个小的
MPI\u Allreduce
benchmark:

它可以与
openmpi1.8.4
mpich1.4.1
配合使用

结果(1列表示处理器数量,1列表示相应的挂钟时间)为或

使用
MPICH 3.1.4
,7、8或更多进程的挂钟时间增加:结果为

在一个真实的代码中(编辑:一个计算流体动力学软件),但对于上面所有3个MPI实现,我观察到7个、8个或更多进程都存在相同的问题,同时我希望我的代码可以扩展到至少8个或16个进程

因此,我试图了解小基准测试和MPICH 3.1.4会发生什么

编辑 这是罗布·莱瑟姆在回答中给出的数字的放大图

在绿色矩形中,代码执行什么操作?
Mpi\u Allreduce
操作启动太晚

编辑
我在更简单的代码上发布了另一篇文章(正好是执行
MPI\u Barrier
)。

有趣的是,在OpenMPI或早期版本的MPICH中,您看不到这一点,但您的代码设置方式似乎肯定会给任何MPI集合带来问题

您为每个流程分配了可变的工作量。问题是引入了“伪同步”——其他MPI进程花在等待落后者赶上并参与集体进程上的时间

通过点对点的消息传递,成本是显而易见的,而且可能会随之而来

集体成本有一个额外的成本:有时进程被阻塞,等待参与进程向其发送一些需要的信息。在Allgather中,所有进程都对另一个进程具有数据依赖性

当您拥有可变大小的工作单元时,在最大/最慢的处理器完成之前,任何进程都无法取得进展

如果使用MPE仪器并在Jumpshot中显示轨迹,很容易看到这种效果:

我为工作添加了(请参见)红色框,紫色框是默认的allgather颜色。第二次迭代最清楚地表明了这一点:排名0几乎没有在allgather中花费时间。排名2、3、4和5的人必须等待慢球队迎头赶上。
.

您会说“……对于上述3种MPI实现,[您]观察到了相同的问题……”但您也会显示基准测试数据,表明您没有看到OpenMPI 1.8.4或MPICH 1.4.1的此问题;我不明白。在我的真实代码中,对于上面所有3个MPI实现:我的真实代码是一个计算流体动力学软件。很抱歉造成混淆,我将对问题进行编辑,以明确问题。您正在运行多少个物理内核?在我看来,可能只有4个实际内核,这就是为什么8个内核的性能相同,而(当模拟更多内核的开销增加时)16个内核的性能更差…在
otis
机器上,我在8个处理器上运行4个cpu内核:。但是这个程序只做usleep,没有真正的计算,所以这有关系吗?谢谢。MPI_Allreduce在8个进程中被阻止等待落后者的最长时间是:basetime*开销*niter/nproc=0.2*1.05*1000/8=26.25,但我得到了双倍。你在用jumpshot4可视化吗?我在!它已经被“社区支持”了好几年了,但我仍然对它有好感。我不得不在你的usleep周围手动添加电话。编辑了链接到修改代码的答案。因此,在您的图中,我希望MPI_Allreduce运行得非常快,也就是说,在所有之前的红色块完成后,立即启动红色块。Allreduce的语义阻止任何进程退出,直到所有进程都进入,是吗?例如,排名7如何从尚未进入ALLREDUCE的流程收集数据?在allreduce结束之前,任何红块(您的usleep)都不能开始。不过,您可能会发现MPI-3中的非阻塞集合很有趣!