MPI 如何区分两台计算机?

计算科学 并行计算 C++ mpi 高性能计算
2021-12-17 19:47:08

我开始涉足 MPI。我对这个领域相当陌生,我目前正在阅读 MPI 标准。

我想在我拥有的集群上编写我的第一个 MPI 程序,一个简单的 hello world 程序。我不确定是否有人熟悉 IBM Bladecenter。据说,有一个中板将所有刀片连接在一起(如果有人可以在他们的经验中确认/否认这一点,那就太好了)。我打算使用发送和接收 C++ 命令运行一个简单的程序。我想我会在标准的点对点通信部分运行示例程序。我已经输入了下面的程序。

我的主要问题是,假设我有两台计算机(计算机 A 和计算机 B)以某种方式相互连接(您可以选择,但在这种情况下,它将是刀片中心,因此它们通过中间板连接)。通过MPI标准,计算机A如何通过连接与计算机B通信?另外,如果我在计算机 A 上运行我的程序,计算机 B 是否需要运行相同的程序?MPI 怎么知道排名是在计算机 B 上而不是在计算机 A 的其他线程上?MPI_Comm_rank 是否获得它可以看到的每个处理器/内核的排名?

鉴于我正在使用的示例程序,这是否适用于同一台计算机上的 2 个进程,或者这适用于 2 台计算机?如果不是,那么我将如何修改程序以适用于 2 台计算机或 n 台计算机?

#include "mpi.h"
main(int argc, char **argv)
{
     char message{20];
     int myRank;
     MPI_Status status;
     MPI_Init(&argc, &argv);
     MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
     if(myRank == 0)
     {
          strcpy(message, "Hello, there");
          MPI_SEND(message, strlen(message) + 1, MPI_CHAR, 1, 99, MPI_COMM_WORLD);
     }
     else if(myRank == 1)
     {
          MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);
          printf("recieved: %s:\n", message);
     }
     MPI_Finalize();
}

如果这些问题很明显,我深表歉意。同样,这是我第一次处理 MPI,任何帮助将不胜感激,谢谢

2个回答

该标准有意对这些问题保持沉默,宁愿将此类问题留给图书馆实施者来解决。没有必要对这些机制进行标准化。大多数网络硬件具有唯一(足够)标识符(MAC 地址或其他 GUID),并且大多数操作系统将主机名与每个节点相关联。这些一起足以让 MPI 库以一致的方式将任务分配给排名。

在大多数情况下,您不需要知道排名最终在哪里。MPI 标准不希望您担心它。MPI 程序内部的机制通常独立于安排,尽管库本身必须跟踪以将消息发送到幕后的正确位置。该标准的设计使您不必担心它的正确性,尽管可能存在一些性能差异。

  1. 比尔·巴特写的一切都是正确的。
  2. 您对 MPI 进程(或“等级”)和计算机感到困惑。如果您在未连接任何设备的 4 核机器上执行“mpirun -np 18 yourprogram”,则 MPI_Comm_size 仍会报告有 18 个 MPI 进程。不是 1 或 4。在某种程度上,您可以说 MPI 流程是一种软件构造。这与硬件的关系不是(如比尔所说)MPI 标准的关注点。