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

时间:2015-11-29 18:05:40

标签: mpi openmpi

我正在尝试实现一个MPI程序,即让服务器节点将任务分配给客户端节点,但我是一个新生,并且不知道如何管理客户端列表,任何人都可以帮助我吗? / p>

让我更详细地说明一下:

服务器节点:

MPI_COMM clients[4]; // store client communicators, but I am not sure this is correct or not!

多个客户端使用mpirun -np 1 ./mpiclient多次连接到服务器,而不是大于1的处理器。

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

问题2:我如何获得客户的属性?

例如:MPI_Comm_accept(portname,MPI_INFO_NULL,0,MPI_COMM_SELF,&client); 我怎样才能获得客户名称或IP?

1 个答案:

答案 0 :(得分:1)

我不知道这里有最佳做法,但有几种选择。

  1. 提前了解您的IP地址列表。
  2. 大多数情况下,人们都设置了一个带有静态IP地址池的集群。这意味着很容易预测谁将连接,因此您可以为每个IP地址调用MPI_COMM_ACCEPT,并且客户端已经知道"服务器"的地址。

    1. 不要直接使用Connect / Accept
    2. 可能没有必要直接管理所有连接的痛苦。您可能可以执行其他操作,例如MPI_COMM_SPAWN(_MULTIPLE),并直接从您的主人那里生成您的孩子。这简化了管理连接,但您仍然需要处理MPI中的一些奇怪的动态处理,特别是交互操作。

      1. 根本不使用动态流程
      2. 很多时候,人们第一次进入分布式编程,特别是MPI,仍然有一个套接字参考框架。意思是,他们希望必须建立自己的所有连接和通信管理。实际上,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_COMM_WORLD中结束,因此他们可以在程序开始时检查他们的排名并开始工作。

相关问题