2014-01-17 35 views
1

我新的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

通常情况下,如果您尝试考虑基于物理处理器/机器的MPI程序中的通信,那么您无法以正确的方式进行处理。大多数时候,每个级别映射到哪台实际机器并不重要。重要的是,您可以拨打mpiexecmpirun(它们通常是同一件事),MPI实施内的某些内容可启动n进程,这些进程可能位于本地,远程或两者的某个组合中,并将它们分配给队列。从理论上讲,这些等级可以任意分配,但通常是以某种可预测的方式(通常就像在整个可用主机组上进行循环一样)。在您的程序中,无论您是在host0还是host1上运行排名0,它通常没有什么区别。重要的是,你正在做0级的特定工作,需要1级的通信。

这就是说,有更多的罕见时间哪些级别映射到哪个处理器可能很重要。示例可能是:

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

这些都是高级示例。通常情况下,如果你遇到这种情况,你一直在使用MPI足够长的时间来知道你需要在这里做什么,所以我打赌你可能没有在这种情况下。

请记住,我的职位在哪里并不重要。重要的是我拥有合适的人数。

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