【发布时间】:2018-04-04 22:38:29
【问题描述】:
为什么MPI(在这篇文章中我指的是OpenMPI)程序不能像其他任何程序一样执行,而是必须使用mpirun 执行?
换句话说,为什么MPI 不简单地提供头文件/包/... 你可以导入然后让你在自己的房子里成为主人,让你在你想要的时间和地点使用MPI,在您的源代码中,并允许您编译自己的并行处理包含可执行文件?
我真的是一个新手,但是例如,我觉得传递给mpirun 的-np 参数可以很容易地在源代码中修复,或者可以由程序本身提示,或者可以读入从配置文件中,或者可以简单地配置为使用所有可用的内核,其数量将由周围的调度程序脚本决定,或者......
(当然,您可以争辩说让mpirun 在某种意义上自动执行此操作有一定的便利性,但在我看来,这很难证明编码人员编写自己的可执行文件的可能性。)
例如,我真的没有什么经验,但是在 Python 中,您可以通过简单地调用 multiprocessing 模块的函数然后像其他任何脚本一样运行您的脚本来进行多处理。当然,MPI 提供的不仅仅是 Python 的 multiprocessing,但是如果 MPI 例如必须启动后台服务,那么我仍然不明白为什么它不能在调用 MPI 函数时自动启动在源代码中。
再举一个可能很愚蠢的例子,CUDA 程序不需要cudarun。并且有一个很好的理由,因为如果他们这样做了,并且如果您在程序的某些部分中同时使用了CUDA 和MPI,那么您现在必须执行cudarun mpirun ./foo(或者可能是mpirun cudarun ./foo)并且如果每个包都有效像这样,您很快就必须拥有计算机科学学位才能简单地执行程序。
所有这些可能都非常重要,因为您可以简单地将每个 MPI 可执行文件与相应的包装脚本一起发送,但这有点烦人,我仍然会对做出这种设计选择的原因感兴趣。
【问题讨论】:
-
所以假设你想在两个节点
A和B上运行,而你只是在节点a.out -np 2 --host A,B上运行A,那么第二个MPI任务应该如何在节点@987654343上产生@ ? -
您在与运行
mpirun a.out相同的机器/节点上运行a.out(使用命令行参数),因此它们应该具有相同的创建任务和进程的可能性,对吧?它可能需要在a.out中进行一些杂乱的工作才能做到这一点,但是这项工作目前是在mpirun中完成的,所以为什么不能将它封装在对a.out中的某些MPI-library 函数的调用中? -
@GillesGouaillardet(该评论是给你的,让我通知你)
-
何时以及如何在节点
A上生成a.out在节点B上生成a.out?