Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MPI秩确定_Mpi - Fatal编程技术网

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

我是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,&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列的工作是没有意义的。最终,您将花费所有的计算时间来切换进程的输入和输出。尽量不要拥有比计算核更多的等级