【发布时间】:2018-06-08 15:30:50
【问题描述】:
MPICH 和 OpenMPI 的文档都提到应该在 MPI_Init 之前或 MPI_Finilize 之后完成最少的工作:
MPI 标准没有说明程序在 MPI_INIT 之前或 MPI_FINALIZE 之后可以做什么。在 MPICH 实现中,您应该尽可能少做。
这背后的原因是什么?
在我看来,进程在开始相互通信之前进行大量计算似乎是完全合理的。
【问题讨论】:
标签: mpi
MPICH 和 OpenMPI 的文档都提到应该在 MPI_Init 之前或 MPI_Finilize 之后完成最少的工作:
MPI 标准没有说明程序在 MPI_INIT 之前或 MPI_FINALIZE 之后可以做什么。在 MPICH 实现中,您应该尽可能少做。
这背后的原因是什么?
在我看来,进程在开始相互通信之前进行大量计算似乎是完全合理的。
【问题讨论】:
标签: mpi
我相信它的措辞类似是为了允许在MPI_Init 内产生其等级的 MPI 实现。这意味着在MPI_Init 之前,并非所有等级都在技术上保证存在。如果您打开了文件描述符或执行了其他对进程状态有副作用的事情,那将变得一团糟。
Afaik 目前没有主要的 MPI 实现这样做,但是 MPI 实现可能会将此要求用于其他技巧。
编辑:我没有发现任何证据,只记得很久以前,所以我不确定。我似乎找不到您从 MPICH 引用的 MPI 标准中的公式。但是,MPI 标准规定了您可以在 MPI_Init 之前调用哪些 MPI 函数:
在调用 MPI 初始化例程之前可以调用的唯一 MPI 函数是
MPI_GET_VERSION, MPI_GET_LIBRARY_VERSION, MPI_INITIALIZED, MPI_FINALIZED,以及带有前缀MPI_T_的任何函数。
【讨论】:
MPI_Init() 之前,所有任务(可能还不存在)都执行相同的计算,这可以看作是失去了并行性的机会,因此效率低下.
MPI_Init() 中调用,所以在 MPI 之前只有一个任务(很可能也有一些限制)初始化。 MOSIX 可能也这样做了,但这只是猜测。
MPICH 的MPI_Init documentation 给出了一些提示:
MPI 标准没有说明程序在 MPI_INIT 之前或 MPI_FINALIZE 之后可以做什么。在 MPICH 实现中,您应该尽可能少做。尤其要避免任何改变程序外部状态的事情,例如打开文件、读取标准输入或写入标准输出。
顺便说一句,我不希望MPI_Init 进行交流。这些会在以后发生。
而mpich/init.c implementation 是free software;您可以研究它的源代码并了解it is initializing 一些计时器、一些线程等......(这确实应该很早就发生了)。
在我看来,进程在开始相互通信之前进行大量计算似乎是完全合理的。
当然,但这些应该发生在MPI_Init 之后(但在一些MPI_Send 等之前)。
在某些supercomputers 上,MPI 可能使用专用硬件(如InfiniBand、Fibre Channel 等...),并且可能有一些硬件或操作系统原因需要很早就初始化它。因此,尽早致电MPI_Init 是有意义的。顺便说一句,它还被赋予了指向main 参数的指针,我想它会在您的main 进一步处理之前修改它们。那么对MPI_Init 的调用可能是你main 的第一条语句。
【讨论】: