【问题标题】:Why should there be minimal work before MPI_Init?为什么在 MPI_Init 之前要做最少的工作?
【发布时间】:2018-06-08 15:30:50
【问题描述】:

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

MPI 标准没有说明程序在 MPI_INIT 之前或 MPI_FINALIZE 之后可以做什么。在 MPICH 实现中,您应该尽可能少做。

这背后的原因是什么?

在我看来,进程在开始相互通信之前进行大量计算似乎是完全合理的。

【问题讨论】:

    标签: mpi


    【解决方案1】:

    我相信它的措辞类似是为了允许在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 有一个远程 fork&exec 系统调用,在 MPI_Init() 中调用,所以在 MPI 之前只有一个任务(很可能也有一些限制)初始化。 MOSIX 可能也这样做了,但这只是猜测。
    【解决方案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 的第一条语句。

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 2011-06-20
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      相关资源
      最近更新 更多