为什么MPI_Init之前应该有最少的工作?

时间:2018-06-08 15:30:50

标签: mpi

MPICH和OpenMPI的文件都提到在MPI_Init之前或MPI_Finilize之后应该完成的工作量很少:

  

MPI标准没有说明程序在MPI_INIT之前或MPI_FINALIZE之后可以执行的操作。在MPICH实现中,您应该尽可能少。

这背后的原因是什么?

对我来说,在开始彼此通信之前进行大量计算似乎是完全合理的。

2 个答案:

答案 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 implementationfree software;你可以研究它的源代码并理解it is initializing一些定时器,一些线程等等......(这应该确实很早发生)。

  

对我来说,在开始彼此通信之前进行大量计算似乎是完全合理的。

当然,但这些应该发生在MPI_Init之后(但在某些MPI_Send等之前)。

在某些supercomputers上,MPI可能会使用专用硬件(如InfiniBandFibre Channel等),并且可能会有一些硬件或操作系统原因要尽早初始化它。因此,尽早致电MPI_Init是有道理的。顺便说一句,它还给出了main参数的指针,我猜在main进一步处理之前它会修改它们。然后,对MPI_Init的调用可能是您main的第一个陈述。