为什么 OpenMPI 程序必须使用 `mpirun` 来执行?

Why do OpenMPI programs have to be executed using `mpirun`?

为什么 MPI(在此 post 中我指的是 OpenMPI)程序不能像其他任何程序一样执行,而是必须使用 mpirun 执行?

换句话说,为什么 MPI 不简单地提供 headers/packages/... 你可以导入,然后让你在自己的房子里做主人,让你使用 MPI 在您想要的时间和地点,在您的源代码中,并允许您编译您自己的包含并行处理的可执行文件?

我确实是个新手,但是比如我觉得传递给mpirun-np参数可以很容易地在源代码中修复,或者可以由程序本身提示,或者可以从配置文件中读入,或者可以简单地配置为使用所有可用的内核,其数量无论如何都将由周围的调度程序脚本确定,或者...... (当然,您可以争辩说让 mpirun 在某种意义上自动执行此操作有一定的便利性,但在我看来,这很难证明剥夺编码人员编写自己的可执行文件的可能性。)

例如,我真的没有什么经验,但是在 Python 中,您可以通过简单地调用 multiprocessing 模块的函数然后 运行 您的脚本来进行多处理,就像其他任何脚本一样。当然MPI提供的比Python的multiprocessing还多,但是如果比如MPI必须要启动后台服务,那我还是不明白为什么可以在源代码中调用 MPI 函数时不会自动执行此操作。

另一个可能很愚蠢的例子,CUDA 程序不需要 cudarun。并且有充分的理由,因为如果他们这样做了,并且如果您在程序的某些部分同时使用了 CUDAMPI,那么您现在必须执行 cudarun mpirun ./foo(或者可能 mpirun cudarun ./foo) 如果每个包都像这样工作,那么您很快就必须拥有计算机科学学位才能简单地执行程序。

所有这些可能都非常重要,因为您可以简单地将每个 MPI 可执行文件与相应的包装器脚本一起发送,但这有点烦人,我仍然对为什么做出这种设计选择感兴趣。

您可以随心所欲地启动进程,您需要有一些通道来在进程之间发送端口信息,命令行 arg 有效。我不得不手动启动进程,但使用预构建的通信器要容易得多,也不那么痛苦。如果你有充分的理由,你可以这样做。

我有一个问题,我在问题中编辑了一个最小的完整示例。关键调用是 MPI_Open_portMPI_Comm_acceptMPI_Comm_connectMPI_Intercomm_merge。您必须一次合并一个连接节点。如果你想继续这样做,请确保你对内部通信器和内部通信器之间的区别有一个很好的了解。这是给你的例子: