MPICH:如何发布\u名称,以便客户端应用程序可以查找\u名称?
在windows(1.4.1p1)中使用MPICH学习MPI时,我发现了一些示例代码。最初,当我运行服务器时,我必须复制生成的MPICH:如何发布\u名称,以便客户端应用程序可以查找\u名称?,c,windows,mpi,mpich,C,Windows,Mpi,Mpich,在windows(1.4.1p1)中使用MPICH学习MPI时,我发现了一些示例代码。最初,当我运行服务器时,我必须复制生成的端口名称,并用它启动客户端。这样,客户机就可以连接到服务器。我将其修改为在服务器中包含MPI\u Publish\u name()。在启动名为aaaa的服务器后,我启动了一个客户端,该客户端使用MPI\u Lookup\u name()失败 Invalid service name (see MPI_Publish_name), error stack: MPID_NS_
端口名称
,并用它启动客户端。这样,客户机就可以连接到服务器。我将其修改为在服务器中包含MPI\u Publish\u name()
。在启动名为aaaa
的服务器后,我启动了一个客户端,该客户端使用MPI\u Lookup\u name()
失败
Invalid service name (see MPI_Publish_name), error stack:
MPID_NS_Lookup(87): Lookup failed for service name aaaa
以下是截取的代码位:
服务器.c
MPI_Comm client;
MPI_Status status;
char port_name[MPI_MAX_PORT_NAME];
char serv_name[256];
double buf[MAX_DATA];
int size, again;
int res = 0;
MPI_Init( &argc, &argv );
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Open_port(MPI_INFO_NULL, port_name);
sprintf(serv_name, "aaaa");
MPI_Publish_name(serv_name, MPI_INFO_NULL, port_name);
while (1)
{
MPI_Comm_accept( port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &client );
/*...snip...*/
}
客户c
MPI_Comm server;
double buf[MAX_DATA];
char port_name[MPI_MAX_PORT_NAME];
memset(port_name,'\0',MPI_MAX_PORT_NAME);
char serv_name[256];
memset(serv_name,'\0',256);
strcpy(serv_name, argv[1] )
MPI_Lookup_name(serv_name, MPI_INFO_NULL, port_name);
MPI_Comm_connect( port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &server );
MPI_Send( buf, 0, MPI_DOUBLE, 0, tag, server );
MPI_Comm_disconnect( &server );
MPI_Finalize();
return 0;
我找不到任何关于改变已发布名称可见性的信息,如果这是问题的话。MPICH似乎没有使用MPI_信息实现任何东西。我会尝试openMPI,但我在构建它时遇到了困难。有什么建议吗?相对于正常的MPI使用,这种发布名称、查找名称并连接到名称的方法非常奇怪 标准模式是使用
mpirun
指定一组节点,在这些节点上启动给定数量的进程。中说明了mpirun
实现的常见实现的操作
一旦所有进程作为单个并行作业的一部分启动,MPI库将读取启动器在MPI_Init
期间提供的任何信息,以设置MPI_COMM_WORLD
,即作业中所有进程组的通信器
使用该通信器,并行应用程序可以分发工作、交换信息等等。它将使用通用的
MPI_Send
和MPI_Recv
例程,在它们的所有变体中,使用集合操作,等等来实现这一点。我上传了一个使用OpenMPI 1.6.5的工作版本,在Ubuntu上使用C语言的客户端和服务器,在这里使用ompi服务器名服务器:
(挖掘旧东西)对于MPICH,@daemondave编写的代码实际上也可以工作。 但是,它仍然需要运行名称服务器。 对于MPICH,可以使用hydra_nameserver而不是使用ompi服务器。 然后,必须使用
-nameserver HOSTNAME
为所有mpirun/mpiexec调用指定主机
我在上创建了一个工作示例,它还提供了一个shell脚本来构建并运行该示例
附言:ompi服务器变体似乎有些过时(并且包含一些bug)。有关更新但仍有点未记录的替代方案,请参阅。我也有同样的问题。我认为只有在使用mpirun在多台计算机上启动一个程序时,通信才会起作用。我将发布一个新问题,也许我们很幸运。你能描述一下你正在努力实现的目标吗?如果您只是在学习MPI,我会注意到这是一个非常模糊的特性集,我从未在应用程序中看到或听说过它。换句话说,这可能不是你应该花费时间和精力的地方。@Novelocrat我想让客户端可靠地找到服务器,而不需要用户在启动时读取服务器发布的名称。已经有一段时间了,我忘记了很多事情。(对未来的读者)我对MPI进行了初步探索,以了解它能做些什么,但我运气不好,转而做了其他事情(最终使用boost asio满足我的工作分配需求)。重点是,启动MPI作业时,通常的模式是
mpirun
一次启动所有进程,然后他们就成为了MPI通信世界的一部分。他们可以在自己之间发送和接收消息,而无需应用程序的进一步设置。除非你正在做一些奇怪的事情,否则简单地启动并运行一个带有工作分配的并行程序应该是微不足道的。@Novelocrat如果我错了,请纠正我,但工作分配对其他计算机的网络不意味着吗?肯定mpirun
无法在其他计算机上启动进程?我的理解是,要让其他计算机加入世界
,它们需要知道服务器发布的端口。但是,当我在客户端上调用MPI\u Lookup\u name
时,他们仍然无法找到服务器所在的位置。(也许我应该复制端口号并将其提供给客户端,同时避免发布\u name/lookup\u name
)您发现此功能集不常用(因为您从未使用过),这并不意味着其他人没有使用它。该问题询问了为设置MPI客户机/服务器通信而发布名称的具体问题。事实上,这是一个非常常见的特性,特别是对于代码耦合系统,它被广泛使用,例如,在科学计算中,耦合两个(多个)独立的(不同的可执行文件)解算器。例如,如果要模拟流体/结构交互,则将耦合流体解算器和结构解算器。很抱歉,您的噪音太大了。-1
。这种情况如何:我在一个至少有两种不同处理器类型的集群上,我想使用这两种类型运行客户机/服务器或MPDM。但是,集群管理员只允许我提交一种或另一种类型的作业。使用名称发布机制,我可以单独启动程序,然后将它们连接起来。@victor:这将很好地利用原始问题中描述的功能。op显然是一个希望了解基本常见案例操作的新用户。