MPI秩确定
我是MPI新手,我经常在MPI代码中看到以下代码:MPI秩确定,mpi,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\u Comm\u rank(MPI\u Comm\u WORLD
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\u Comm\u rank(MPI\u Comm\u WORLD,&rank)来确定进程的排名代码>
它是否与mpirun
的命令行参数相关
例如:
mpirun -n 2 -host localhost1,localhost2 ./a.out
(localhost1
为0级,localhost2
为1级?
程序将如何确定谁的排名为0,谁的排名为1
是否有一种方法可以让我指定这样的内容,即localhost1
正在发送,而localhost2
正在接收?当您调用mpirun时,有一个流程管理器来确定流程的节点/列组属性。我建议你看一看openmpi
检查选项。
用这个来检查这是否是你想要的
如果您想切换流程,也可以简单地更改条件(秩==1)。当您调用mpirun时,有一个流程管理器可以确定流程的节点/秩属性。我建议你看一看openmpi
检查选项。
用这个来检查这是否是你想要的
如果您想切换进程的工作方式,也可以简单地更改条件(秩==1)。通常,如果您试图考虑基于物理处理器/机器的MPI程序中的通信,您不会以正确的方式进行。大多数情况下,每个列组映射到哪个实际机器并不重要。重要的是调用mpiexec
或mpirun
(它们通常是同一件事),MPI实现中的某些东西启动n
进程,这些进程可以位于本地、远程或两者的某种组合,并为它们分配等级。理论上,这些等级可以任意分配,尽管通常是以某种可预测的方式分配的(通常类似于对可用的整个主机组进行循环)。在您的程序中,无论您是在host0
上运行秩0,还是在host1
上运行秩0,通常差别不大。重要的是,您正在等级0上执行特定的工作,这需要等级1的沟通
这就是说,很少有时候哪个列组映射到哪个处理器可能很重要。例如:
如果您在某些节点上有GPU,而在其他节点上没有GPU,并且您需要某些列组才能控制GPU
您需要将某些进程映射到同一物理节点,以优化诸如共享内存之类的通信模式
您在某些主机上暂存了需要映射到特定列组的数据
这些都是高级示例。通常情况下,如果您处于其中一种情况,那么您已经使用MPI足够长的时间,知道您在这里需要做什么,所以我打赌您可能不在这种情况下
记住,我的级别在哪里并不重要。重要的是我有合适的数量
免责声明:尽管如此,启动正确数量的进程确实很重要。我的意思是,如果你有两台主机,每台都有一个四核处理器,那么开始一个16列的工作是没有意义的。最终,您将花费所有的计算时间来切换进程的输入和输出。尽量不要拥有比计算核更多的列组。通常,如果您试图在基于物理处理器/机器的MPI程序中考虑通信,那么您的方式是不正确的。大多数情况下,每个列组映射到哪个实际机器并不重要。重要的是调用mpiexec
或mpirun
(它们通常是同一件事),MPI实现中的某些东西启动n
进程,这些进程可以位于本地、远程或两者的某种组合,并为它们分配等级。理论上,这些等级可以任意分配,尽管通常是以某种可预测的方式分配的(通常类似于对可用的整个主机组进行循环)。在您的程序中,无论您是在host0
上运行秩0,还是在host1
上运行秩0,通常差别不大。重要的是,您正在等级0上执行特定的工作,这需要等级1的沟通
这就是说,很少有时候哪个列组映射到哪个处理器可能很重要。例如:
如果您在某些节点上有GPU,而在其他节点上没有GPU,并且您需要某些列组才能控制GPU
您需要将某些进程映射到同一物理节点,以优化诸如共享内存之类的通信模式
您在某些主机上暂存了需要映射到特定列组的数据
这些都是高级示例。通常情况下,如果您处于其中一种情况,那么您已经使用MPI足够长的时间,知道您在这里需要做什么,所以我打赌您可能不在这种情况下
记住,我的级别在哪里并不重要。重要的是我有合适的数量
免责声明:尽管如此,启动正确数量的进程确实很重要。我的意思是,如果你有两台主机,每台都有一个四核处理器,那么开始一个16列的工作是没有意义的。最终,您将花费所有的计算时间来切换进程的输入和输出。尽量不要拥有比计算核更多的等级