为什么MPI
(我将在本文中指代OpenMPI)程序不能像其他程序一样执行,而是必须使用mpirun
执行?
换句话说,为什么MPI
不能简单地提供您可以导入的标题/包/ ...然后让您在自己的家中成为主人,让您在使用时MPI
你想要的地方,你的源代码,并允许你编译自己的并行处理包含可执行文件?
我真的是一个新手,但是,例如,我觉得传递给-np
的{{1}}参数很容易在源代码中修复,或者可能由程序本身提示,或者可以从配置文件中读入,或者可以简单地配置为使用所有可用的核心,其数量将由周围的调度程序脚本决定,或者......
(当然,你可以说有mpirun
在某种意义上自动执行此操作会有一定的便利,但在我看来,这很难证明,编写自己的可执行文件可能会失去编码器的可能性。 。)
例如,我真的没什么经验,但在Python中你可以通过简单地调用mpirun
模块的函数然后像其他任何一样运行你的脚本来进行多处理。当然,multiprocessing
提供的不仅仅是Python MPI
,但如果multiprocessing
例如必须启动后台服务,那么我仍然不明白为什么它可以& #39; t在源中调用MPI
函数时自动执行此操作。
对于另一个可能很愚蠢的例子,MPI
程序不需要CUDA
。并且有充分的理由,因为如果他们这样做,并且如果您在程序的某些部分中同时使用了cudarun
和CUDA
,那么现在必须执行MPI
(或者可能{{1}如果每个包都像这样工作,你很快就必须拥有计算机科学学位才能简单地执行一个程序。
所有这些可能都非常重要,因为您可以使用相应的包装脚本简单地发送每个MPI可执行文件,但这有点烦人,我仍然会对为什么做出这样的设计感兴趣。
答案 0 :(得分:1)
你可以随心所欲地启动进程,你需要有一些通道来在进程之间发送端口信息,命令行arg可行。我不得不手动启动流程,但使用预构建的通信器要容易得多,也不那么痛苦。如果你有充分的理由,你可以这样做。
我有一个问题,我在这个问题中编辑了一个最小的完整示例。关键呼叫是MPI_Comm_accept
,MPI_Comm_connect
,MPI_Intercomm_merge
和 PING google.com (216.58.217.206) 56(84) bytes of data. --- google.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 4.258/4.532/4.907/0.274 ms
。您必须一次合并一个连接节点。如果你想要追求这一点,请确保你对内部和内部通信器之间的区别有一个很好的了解。以下是您的示例:
Trying to start another process and join it via MPI but getting access violation