我的工作,我注意到即使我将相同数量的数据分散到每个进程,也需要更多时间将数据从根传输到最高级别的进程。我在分布式内存机上测试了这个。如果需要MWE,我将准备一个,但在此之前我想知道MPI_Scatter是否给予较低级别进程的特权。
答案 0 :(得分:1)
MPI标准没有说明这样的事情,因此MPI库可以自由地实现MPI_Scatter()
关于哪个任务可能比其他任务更早返回的方式。
Open MPI
可以执行线性分割或二项分散(默认情况下,基于通信器和消息大小选择算法)。
话虽这么说,所有数据都必须从根进程发送到其他节点,所以显然,首先会提供一些节点。如果root进程的排名为零,我希望最高级别的进程最后会收到数据(我不知道任何实现拓扑感知的MPI_Scatter()
的MPI库,但可能会在某一天出现)。如果根进程没有排名为零,那么MPI可能会在内部对排名重新编号(因此root总是虚拟排名为零),如果实现此模式,则接收数据的最后一个进程将是(root + size - 1) % size
。
如果从您的应用程序角度来看这不是最理想的,您始终可以选择以自己的方式重新实现MPI_Scatter()
(如果需要,可以调用提供的库PMPI_Scatter()
)。另一种方法是MPI_Comm_split()
(使用单一颜色)以重新编号,并使用新的通信器MPI_Scatter()