4

While learning MPI using MPICH in windows (1.4.1p1) I found some sample code here. Originally, when I ran the server, I would have to copy the generated port_name and start the client with it. That way, the client can connect to the server. I modified it to include MPI_Publish_name() in the server instead. After launching the server with a name of aaaa, I launch the client which fails MPI_Lookup_name() with

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

Here are the snipped bits of code:

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; 

I cannot find any information about altering visibility of published names, if that is even the problem. MPICH seems to not have implemented anything with MPI_INFO. I would try openMPI but I am having trouble just building it. Any suggestions?

4

3 回答 3

1

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

C 中的 OpenMPI 名称服务器客户端服务器示例

于 2016-12-17T04:11:11.010 回答
1

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

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

PS:ompi-server 变体似乎有些过时(并且包含一些错误)。
有关更新但仍然有些未记录的替代方案,请参阅此评论

于 2021-03-30T12:19:38.910 回答
-5

相对于正常的 MPI 使用而言,这种发布名称、查找名称并连接到名称的方法很奇怪。

标准模式mpirun用于指定一组节点,在这些节点上启动给定数量的进程。实现的常见实现的操作mpirun另一个问题中解释

一旦所有进程都作为单个并行作业的一部分启动,MPI 库将读取启动器在设置期间提供的任何信息,该信息MPI_InitMPI_COMM_WORLD作业中所有进程组的通信器。

使用该通信器,并行应用程序可以分发工作、交换信息等。它将使用通用MPI_SendMPI_Recv例程,在它们的所有变体中,集体操作等等来做到这一点。

于 2013-08-15T17:28:12.977 回答