我是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
正在接收的内容?
答案 0 :(得分:3)
通常,如果您正在考虑基于物理处理器/机器的MPI程序中的通信,那么您就不会以正确的方式进行通信。大多数情况下,每个等级映射到哪个实际机器并不重要。重要的是你打电话给mpiexec
或mpirun
(它们通常都是一样的),你的MPI实现中的某些东西会启动n
进程,这些进程可能位于本地,远程或两者的某种组合,并赋予它们排名。从理论上讲,这些排名可以任意分配,虽然它通常以某种可预测的方式(通常类似于可用的整个主机组上的循环)。在您的计划中,无论您是在host0
还是host1
上运行排名0,通常都会产生很小的差异。重要的是你正在做0级的特定工作,这需要从1级进行沟通。
话虽这么说,但是更为罕见的是,哪个等级被映射到哪个处理器可能很重要。例子可能是:
这些都是高级示例。通常如果你处于其中一种情况,你已经使用MPI足够长的时间来知道你需要做什么,所以我打赌你可能不在这种情况下。
请记住,我的队伍在哪里并不重要。重要的是我拥有正确的数量。
免责声明:所有这些都说明了,启动正确数量的流程并不重要。我的意思是,如果你有2个主机,每个主机都有一个四核处理器,那么开始一个16级的工作是没有意义的。您将最终花费所有计算时间上下文来切换流程。尽量不要拥有比计算核心更多的等级。
答案 1 :(得分:1)
当您致电mpirun时,会有一个流程管理器,用于确定流程的节点/等级属性。我建议你看看Controlling Process Placement with the Intel MPI library 和openmpi 检查-npernode, -pernode选项。 使用此Hello world test检查这是否是您想要的。
如果您想切换流程,也可以简单地更改条件(rank == 1)。