为什么OpenMPI程序必须使用“mpirun”执行?

为什么OpenMPI程序必须使用“mpirun”执行?,mpi,openmpi,Mpi,Openmpi,为什么MPI(在本文中我指的是OpenMPI)程序不能像其他程序一样执行,而必须使用mpirun执行 换句话说,MPI为什么不简单地提供头/包/。。。通过允许您在源代码中随时随地使用MPI,并允许您编译自己的并行处理包含的可执行文件,您可以导入并成为自己家中的主人 我确实是一个新手,但例如,我觉得传递给mpirun的-np参数可以很容易地在源代码中修复,或者可以由程序本身提示,或者可以从配置文件读取,或者可以简单地配置为使用所有可用的内核,其编号将由周围的调度程序脚本决定,或者。。。。 (当然,

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

换句话说,
MPI
为什么不简单地提供头/包/。。。通过允许您在源代码中随时随地使用
MPI
,并允许您编译自己的并行处理包含的可执行文件,您可以导入并成为自己家中的主人

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

例如,我确实没有什么经验,但在Python中,只需调用
多处理
模块的函数,然后像其他模块一样运行脚本,就可以进行多处理。当然,
MPI
比Python的
multiprocessing
提供了更多的功能,但是如果例如
MPI
必须启动后台服务,那么我仍然不理解为什么它不能在源代码中调用
MPI
函数时自动启动

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


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

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

我有一个问题,我在问题中编辑了一个最小的完整示例。关键调用是
MPI\u Open\u port
MPI\u Comm\u accept
MPI\u Comm\u connect
,以及
MPI\u intercom\u merge
。您必须一次合并一个连接节点。如果你想了解这一点,请确保你对内部沟通者和内部沟通者之间的区别有很好的了解。下面是一个例子:

假设您想在两个节点上运行
A
B
,您只需
A.out-np2——节点
A
上的主机A,B
,如何在节点
B
上生成第二个MPI任务?您正在运行
A.out
(使用命令行参数)在与您运行
mpirun a.out
相同的机器/节点上,因此它们应该具有相同的创建任务和流程的可能性,对吗?这可能需要在
a.out
中进行一些混乱的工作才能完成,但无论如何,这项工作目前是在
mpirun
中完成的,所以为什么不能将它封装在调用
a.out
中的一些
MPI
-库函数中?@GillesGouaillardet(该评论是给你的,让我通知你)在节点上
a.out
何时以及如何在节点
B
上生成
a.out