MPICH:如何使用publish_name使客户端应用程序可以lookup_name呢?

时间:2013-01-08 07:58:34

标签: c windows mpi mpich

在Windows(1.4.1p1)中使用MPICH学习MPI时,我发现了一些示例代码here。最初,当我运行服务器时,我必须复制生成的port_name并使用它启动客户端。这样,客户端就可以连接到服务器。我将其修改为在服务器中包含MPI_Publish_name()。启动名为aaaa的服务器后,启动MPI_Lookup_name()失败的客户端

Invalid service name (see MPI_Publish_name), error stack:
MPID_NS_Lookup(87): Lookup failed for service name aaaa

以下是剪切的代码:

server.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...*/
}

client.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_INFO实现任何东西。我会尝试openMPI但是我在构建它时遇到了麻烦。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我在Ubuntu的C上使用OpenMPI 1.6.5的客户端和服务器上传了一个工作版本,该服务器在这里使用了ompi-server名称服务器:

OpenMPI nameserver client server example in C

答案 1 :(得分:0)

(挖旧东西)
对于 MPICH,@daemondave 的代码实际上也应该有效。 但是,它仍然需要运行名称服务器。 对于 MPICH,可以使用 hydra_nameserver 代替 ompi-server。 然后必须使用 -nameserver HOSTNAME 为所有 mpirun/mpiexec 调用指定主机。

我在 github 创建了一个工作示例,它还提供了一个 shell 脚本来构建+运行示例。

P.S:ompi-server 变体似乎有些过时(并且包含一些错误)。
有关更新但仍然没有记录的替代方案,请参阅 this comment

答案 2 :(得分:-4)

这种发布名称,查找和连接它们的方法相对于正常的MPI使用而言是古怪的。

标准模式是使用mpirun指定一组节点,在这些节点上启动给定数量的进程。 mpirun

中解释了MPI_Init实现的常见实现的操作

一旦所有进程都作为单个并行作业的一部分启动,MPI库就会读取启动程序在MPI_COMM_WORLD期间提供的任何信息,以设置MPI_Send,这是一个关于所有进程组的通信器。这份工作。

使用该通信器,并行应用程序可以分发工作,交换信息等。它将使用常见的MPI_Recv和{{1}}例程,在它们的所有变体,集合操作等中执行此操作。