【问题标题】:MPI rank determinationMPI 等级确定
【发布时间】:2014-02-06 08:26:01
【问题描述】:

我是 MPI 新手,经常在 MPI 代码中看到以下代码:

if (rank == 0) {
    MPI_Send(buf, len, MPI_CHAR, 1, 0, MPI_COMM_WORLD);
}
else {
    MPI_Recv(buf, len, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &status);
}

似乎排名决定了哪个进程正在发送和哪个进程正在接收。但 如何通过调用MPI_Comm_rank(MPI_COMM_WORLD, &rank); 确定进程的等级?
它与 mpirun 的命令行参数有关吗?
例如:

mpirun -n 2 -host localhost1,localhost2 ./a.out

(localhost1 是 0 级,localhost2 是 1 级?)
程序将如何确定谁是 0 级,谁是 1 级?
有没有办法让我指定诸如localhost1 正在发送而localhost2 正在接收?

【问题讨论】:

    标签: mpi


    【解决方案1】:

    通常,如果您试图在基于物理处理器/机器的 MPI 程序中考虑通信,那么您的方式就不是正确的。大多数时候,每个等级映射到哪台实际机器并不重要。重要的是您调用mpiexecmpirun(它们通常是同一件事),在您的MPI 实现中启动n 进程,这些进程可以位于本地、远程或两者的某种组合,并为他们分配等级。从理论上讲,这些等级可以任意分配,尽管它通常以某种可预测的方式(通常类似于整个可用主机组的循环)。在您的程序中,无论您是在host0 还是host1 上运行rank 0,通常都没有什么区别。重要的是你在 0 级做特定的工作,这需要从 1 级进行沟通。

    话虽如此,在更罕见的情况下,哪个等级映射到哪个处理器可能很重要。示例可能是:

    1. 如果您在某些节点上有 GPU 而在其他节点上没有 GPU,并且您需要特定等级才能控制 GPU。
    2. 您需要将某些进程映射到同一个物理节点,以优化共享内存等通信模式。
    3. 您在某些主机上暂存了需要映射到特定等级的数据。

    这些都是高级示例。通常,如果您处于其中一种情况,那么您使用 MPI 的时间已经足够长,知道您需要在这里做什么,所以我敢打赌,您可能不在这种情况下。

    请记住,我的排名在哪里并不重要。重要的是我有正确的数量。

    免责声明:话虽如此,您启动正确数量的进程确实很重要。我的意思是,如果您有 2 台主机,每台主机都有一个四核处理器,那么以 16 列开始工作是没有意义的。您最终将花费所有计算时间上下文来切换进程。尽量不要拥有多于计算核心的等级。

    【讨论】:

      【解决方案2】:

      当您调用 mpirun 时,会有一个流程管理器来确定您的流程的节点/等级属性。我建议你看看Controlling Process Placement with the Intel MPI library 和 openmpi 检查-npernode, -pernode 选项。 使用此Hello world test 来检查这是否是您想要的。

      如果您想切换流程工作,您也可以简单地更改条件 (rank==1)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 2012-07-08
        • 2021-05-27
        • 1970-01-01
        • 2014-01-11
        相关资源
        最近更新 更多