为什么 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
。并且有充分的理由,因为如果他们这样做了,并且如果您在程序的某些部分同时使用了 CUDA
和 MPI
,那么您现在必须执行 cudarun mpirun ./foo
(或者可能 mpirun cudarun ./foo
) 如果每个包都像这样工作,那么您很快就必须拥有计算机科学学位才能简单地执行程序。
所有这些可能都非常重要,因为您可以简单地将每个 MPI 可执行文件与相应的包装器脚本一起发送,但这有点烦人,我仍然对为什么做出这种设计选择感兴趣。
您可以随心所欲地启动进程,您需要有一些通道来在进程之间发送端口信息,命令行 arg 有效。我不得不手动启动进程,但使用预构建的通信器要容易得多,也不那么痛苦。如果你有充分的理由,你可以这样做。
我有一个问题,我在问题中编辑了一个最小的完整示例。关键调用是 MPI_Open_port
、MPI_Comm_accept
、MPI_Comm_connect
和 MPI_Intercomm_merge
。您必须一次合并一个连接节点。如果你想继续这样做,请确保你对内部通信器和内部通信器之间的区别有一个很好的了解。这是给你的例子:
为什么 MPI
(在此 post 中我指的是 OpenMPI)程序不能像其他任何程序一样执行,而是必须使用 mpirun
执行?
换句话说,为什么 MPI
不简单地提供 headers/packages/... 你可以导入,然后让你在自己的房子里做主人,让你使用 MPI
在您想要的时间和地点,在您的源代码中,并允许您编译您自己的包含并行处理的可执行文件?
我确实是个新手,但是比如我觉得传递给mpirun
的-np
参数可以很容易地在源代码中修复,或者可以由程序本身提示,或者可以从配置文件中读入,或者可以简单地配置为使用所有可用的内核,其数量无论如何都将由周围的调度程序脚本确定,或者......
(当然,您可以争辩说让 mpirun
在某种意义上自动执行此操作有一定的便利性,但在我看来,这很难证明剥夺编码人员编写自己的可执行文件的可能性。)
例如,我真的没有什么经验,但是在 Python 中,您可以通过简单地调用 multiprocessing
模块的函数然后 运行 您的脚本来进行多处理,就像其他任何脚本一样。当然MPI
提供的比Python的multiprocessing
还多,但是如果比如MPI
必须要启动后台服务,那我还是不明白为什么可以在源代码中调用 MPI
函数时不会自动执行此操作。
另一个可能很愚蠢的例子,CUDA
程序不需要 cudarun
。并且有充分的理由,因为如果他们这样做了,并且如果您在程序的某些部分同时使用了 CUDA
和 MPI
,那么您现在必须执行 cudarun mpirun ./foo
(或者可能 mpirun cudarun ./foo
) 如果每个包都像这样工作,那么您很快就必须拥有计算机科学学位才能简单地执行程序。
所有这些可能都非常重要,因为您可以简单地将每个 MPI 可执行文件与相应的包装器脚本一起发送,但这有点烦人,我仍然对为什么做出这种设计选择感兴趣。
您可以随心所欲地启动进程,您需要有一些通道来在进程之间发送端口信息,命令行 arg 有效。我不得不手动启动进程,但使用预构建的通信器要容易得多,也不那么痛苦。如果你有充分的理由,你可以这样做。
我有一个问题,我在问题中编辑了一个最小的完整示例。关键调用是 MPI_Open_port
、MPI_Comm_accept
、MPI_Comm_connect
和 MPI_Intercomm_merge
。您必须一次合并一个连接节点。如果你想继续这样做,请确保你对内部通信器和内部通信器之间的区别有一个很好的了解。这是给你的例子: