MPI等级确定

时间:2014-01-17 05:32:55

标签: mpi

我是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正在接收的内容?

2 个答案:

答案 0 :(得分:3)

通常,如果您正在考虑基于物理处理器/机器的MPI程序中的通信,那么您就不会以正确的方式进行通信。大多数情况下,每个等级映射到哪个实际机器并不重要。重要的是你打电话给mpiexecmpirun(它们通常都是一样的),你的MPI实现中的某些东西会启动n进程,这些进程可能位于本地,远程或两者的某种组合,并赋予它们排名。从理论上讲,这些排名可以任意分配,虽然它通常以某种可预测的方式(通常类似于可用的整个主机组上的循环)。在您的计划中,无论您是在host0还是host1上运行排名0,通常都会产生很小的差异。重要的是你正在做0级的特定工作,这需要从1级进行沟通。

话虽这么说,但是更为罕见的是,哪个等级被映射到哪个处理器可能很重要。例子可能是:

  1. 如果某些节点上有GPU而不是其他节点,则需要某些级别才能控制GPU。
  2. 您需要将某些进程映射到同一物理节点,以优化共享内存等通信模式。
  3. 您需要在某些需要映射到特定排名的主机上暂存数据。
  4. 这些都是高级示例。通常如果你处于其中一种情况,你已经使用MPI足够长的时间来知道你需要做什么,所以我打赌你可能不在这种情况下。

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

    免责声明:所有这些都说明了,启动正确数量的流程并不重要。我的意思是,如果你有2个主机,每个主机都有一个四核处理器,那么开始一个16级的工作是没有意义的。您将最终花费所有计算时间上下文来切换流程。尽量不要拥有比计算核心更多的等级。

答案 1 :(得分:1)

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

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