在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但是我在构建它时遇到了麻烦。有什么建议吗?
答案 0 :(得分:1)
我在Ubuntu的C上使用OpenMPI 1.6.5的客户端和服务器上传了一个工作版本,该服务器在这里使用了ompi-server名称服务器:
答案 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}}例程,在它们的所有变体,集合操作等中执行此操作。