如何在MPI客户机/服务器模式下管理客户机列表

如何在MPI客户机/服务器模式下管理客户机列表,mpi,openmpi,Mpi,Openmpi,我正在尝试实现一个MPI程序,让服务器节点将任务分配给客户端节点,但我是一名新生,不知道如何管理客户端列表,有人能帮我吗 让我详细描述一下: 服务器节点: MPI_COMM clients[4]; // store client communicators, but I am not sure this is correct or not! 多个客户端多次使用mpirun-np 1./mpiclient连接到服务器,而不是处理器大于1 我想这样做的原因是我想给每个客户发送不同的作业来计算 问题

我正在尝试实现一个MPI程序,让服务器节点将任务分配给客户端节点,但我是一名新生,不知道如何管理客户端列表,有人能帮我吗

让我详细描述一下:

服务器节点:

MPI_COMM clients[4]; // store client communicators, but I am not sure this is correct or not!
多个客户端多次使用
mpirun-np 1./mpiclient
连接到服务器,而不是处理器大于1

我想这样做的原因是我想给每个客户发送不同的作业来计算

问题2:如何获取客户端的属性

例如:
MPI\u Comm\u accept(端口名、MPI\u INFO\u NULL、0、MPI\u Comm\u SELF和客户端)

如何获取客户端名称或ip?

我不知道这里有最佳实践,但有几个选项

  • 提前知道您的IP地址列表。
  • 大多数情况下,人们使用静态IP地址池建立集群。这意味着很容易预测谁将连接,因此您可以为每个IP地址调用
    MPI\u COMM\u ACCEPT
    ,客户端将已经知道“服务器”的地址

  • 不要直接使用Connect/Accept
  • 可能没有必要经历直接管理所有连接的痛苦。您可能可以执行其他操作,如
    MPI\u COMM\u SPAWN(\u MULTIPLE)
    并直接从您的主节点生成您的子节点。这简化了对连接的管理,尽管您仍然需要处理MPI中一些奇怪的动态处理,特别是通信者之间的处理

  • 完全不要使用动态流程
  • 很多时候,第一次进入分布式编程,特别是MPI的人仍然有一个Socket参考框架。也就是说,他们希望建立自己的所有连接和通信管理。实际上,MPI和其他通信库的设计级别略高于此级别,让您可以忽略一些普通的通信管理,直接传递数据。通常在MPI作业中,您将为您的程序使用一个二进制文件,并让每个进程根据它们的级别决定它们将要做什么。例如:

    mpirun -np 5 ./my_prog
    
    ...
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    
    if (rank == 0) {
        /* Distribute work */
    } else {
        /* Get work from rank 0 */
    }
    ...
    
    如果您想为程序的不同部分分离代码,也可以通过这种方式运行多个二进制文件。运行此功能的方式因实现而异,但对于MPICH,其工作原理如下:

    mpiexec -n 1 ./my_prog1 : -n 4 ./my_prog2
    

    然后
    my_prog1
    将工作分配给运行
    my_prog2
    的所有其他进程。在这个模型中,所有进程仍然在同一个
    MPI\u COMM\u WORLD
    中结束,因此它们可以在程序开始时检查它们的排名并开始工作。

    MPI作业本质上是分布式的。将客户机连接到服务器是一项集体操作,即它涉及客户机作业的所有级别,因此没有与作业关联的单一主机名或IP,即使客户机是单实例。我不知道MPI中有任何可移植的机制来获取此类标识。您应该将内部通讯器视为客户端的ID。是否确实要/需要使用
    MPI\u Comm\u connect
    /
    MPI\u Comm\u accept
    ?大多数情况下,使用MPI的人在作业开始时启动所有进程
    mpirun-np 5./mpiapp
    ,并指定特定的级别来完成特定的任务。虽然你可以用MPI做MPMD,但我不会从这里开始。谢谢韦斯利。但是我如何管理客户呢?我试图在服务器方面使用&rank来区分它是哪个客户机,但rank并不是指客户机。我尝试使用worldSize(从MPI_Comm_size)来获得总共有多少个客户端,但总是得到1个(我猜是指服务器处理器),MPI不知道在哪台机器上运行列组。当您进入应用程序时,它应该是硬件不可知的。