【问题标题】:Why do OpenMPI programs have to be executed using `mpirun`?为什么 OpenMPI 程序必须使用 `mpirun` 执行?
【发布时间】:2018-04-04 22:38:29
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 所以假设你想在两个节点AB上运行,而你只是在节点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

标签: mpi openmpi


【解决方案1】:

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

我有一个问题,我在问题中编辑了一个最小的完整示例。关键调用是MPI_Open_portMPI_Comm_acceptMPI_Comm_connectMPI_Intercomm_merge。您必须一次合并一个连接节点。如果您想了解这一点,请确保您对内部沟通者和内部沟通者之间的区别有一个很好的了解。这是给你的例子: Trying to start another process and join it via MPI but getting access violation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2013-03-12
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多