MPICH:如何发布名称,使客户端应用程序可以lookup_name呢?

Windows(1.4.1p1)中使用MPICH学习MPI时,我在这里find了一些示例代码。 最初,当我运行服务器时,我将不得不复制生成的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实现任何东西。 我会尝试打开MPI,但我只是build立它的麻烦。 有什么build议么?

这种发布名称,查找和连接它们的方法与正常的MPI使用相比是异乎寻常的。

标准模式是使用mpirun来指定一组节点来启动给定数量的进程。 另一个问题解释了mpirun实现的常见实现的操作

一旦进程全部作为单个并行作业的一部分启动,MPI库将读取MPI_Init期间提供的任何信息,以设置MPI_COMM_WORLD ,这是作业中所有进程组的通信者。

使用该通信器,并行应用程序可以分配工作,交换信息等等。 这将使用常见的MPI_SendMPI_Recv例程,所有变体,集体操作等等来完成。

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

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