MPICH和OpenMPI的文件都提到在MPI_Init之前或MPI_Finilize之后应该完成的工作量很少:
MPI标准没有说明程序在MPI_INIT之前或MPI_FINALIZE之后可以执行的操作。在MPICH实现中,您应该尽可能少。
这背后的原因是什么?
对我来说,在开始彼此通信之前进行大量计算似乎是完全合理的。
答案 0 :(得分:3)
我认为,为了允许在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_
的任何函数。
答案 1 :(得分:2)
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
的第一个陈述。