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

时间:2017-10-24 08:10:08

标签: mpi openmpi

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

换句话说,为什么MPI不能简单地提供您可以导入的标题/包/ ...然后让您在自己的家中成为主人,让您在使用时MPI你想要的地方,你的源代码,并允许你编译自己的并行处理包含可执行文件?

我真的是一个新手,但是,例如,我觉得传递给-np的{​​{1}}参数很容易在源代码中修复,或者可能由程序本身提示,或者可以从配置文件中读入,或者可以简单地配置为使用所有可用的核心,其数量将由周围的调度程序脚本决定,或者...... (当然,你可以说有mpirun在某种意义上自动执行此操作会有一定的便利,但在我看来,这很难证明,编写自己的可执行文件可能会失去编码器的可能性。 。)

例如,我真的没什么经验,但在Python中你可以通过简单地调用mpirun模块的函数然后像其他任何一样运行你的脚本来进行多处理。当然,multiprocessing提供的不仅仅是Python MPI,但如果multiprocessing例如必须启动后台服务,那么我仍然不明白为什么它可以& #39; t在源中调用MPI函数时自动执行此操作。

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

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

1 个答案:

答案 0 :(得分:1)

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

我有一个问题,我在这个问题中编辑了一个最小的完整示例。关键呼叫是MPI_Comm_acceptMPI_Comm_connectMPI_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