2015-11-29 93 views
0

我想实现一个MPI程序,它有一个服务器节点将任务分配给客户端节点,但我是新生,不知道如何管理客户名单,任何人都可以帮助我吗?如何在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_Comm_accept(portname,MPI_INFO_NULL,0,MPI_COMM_SELF,&client); 如何获取客户端名称或IP?

+0

MPI作业本质上是分布式的。将客户端连接到服务器是一种集体操作,即它涉及客户端作业的所有等级,因此即使客户端是单身人士,也不存在与作业相关联的单个主机名或IP。我不知道MPI中有任何便携式机制可以获得这种识别。你应该把对讲机当作客户的ID。 –

+0

您确定您确实需要/需要使用'MPI_Comm_connect' /'MPI_Comm_accept'吗?在大多数情况下,使用MPI的人在作业开始时启动所有进程mpirun -np 5。/ mpiapp,并指定某些等级来执行某些操作。当你*可以*用MPI进行MPMD时,它不是我开始的地方。 –

回答

1

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

  1. 提前知道您的IP地址列表。

大多数情况下,人们使用静态IP地址池设置群集。这意味着它很容易预测谁将连接,因此您可以为每个IP地址拨打MPI_COMM_ACCEPT,并且客户端已经知道“服务器”的地址。

  • 不要使用连接/接受直接
  • 它可能没有必要去通过直接管理所有连接的设备的疼痛。你也许可以做其他的事情,比如MPI_COMM_SPAWN(_MULTIPLE),并直接从你的主人产生你的孩子。这简化了管理连接,但您仍然需要处理MPI中动态处理的一些奇怪问题,特别是跨通信器。

  • 在所有
  • 很多时候不要使用动态过程,人们进入分布式编程,特别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结束,所以他们可以在程序开始时检查他们的等级并开始工作。

    +0

    谢谢韦斯利。但我如何管理客户端?我尝试在服务器方面使用&rank来区分它是哪个客户端,但rank并不是指客户端。我尝试使用worldSize(来自MPI_Comm_size)来获取总共有多少客户端,但总是得到1(我想这是指服务器处理器) – EricLin

    +0

    MPI没有关于在哪个机器上运行等级的概念。当你进入应用程序时,它应该是硬件不可知的。 –