我正在尝试实现一个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?
答案 0 :(得分:1)
我不知道这里有最佳做法,但有几种选择。
大多数情况下,人们都设置了一个带有静态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
中结束,因此他们可以在程序开始时检查他们的排名并开始工作。