如何在MPI客户机/服务器模式下管理客户机列表
我正在尝试实现一个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_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不知道在哪台机器上运行列组。当您进入应用程序时,它应该是硬件不可知的。