我想执行一个简单的客户端/服务器应用程序,对服务器发布的名称进行客户端搜索(使用MPI_Lookup_name函数)。
我的节目是:
server.c
#include<mpi.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
MPI_Comm cliente;
MPI_Status status;
char portname[MPI_MAX_PORT_NAME];
int size, rank, msg;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Open_port(MPI_INFO_NULL, portname);
MPI_Publish_name("ocean", MPI_INFO_NULL, portname);
MPI_Comm_accept(portname, MPI_INFO_NULL, 0, MPI_COMM_SELF, &cliente);
printf("client connected\n");
MPI_Recv(&msg, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, cliente, &status);
printf("msg: %d\n", msg);
MPI_Comm_free(&cliente);
MPI_Close_port(portname);
MPI_Finalize();
return 0;
}
client.c
#include<mpi.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int size, rank;
int main(int argc, char *argv[])
{
MPI_Comm servidor;
int msg, tag, dest;
char portname[MPI_MAX_PORT_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Lookup_name("ocean", MPI_INFO_NULL, portname);
MPI_Comm_connect(portname, MPI_INFO_NULL, 0, MPI_COMM_WORLD,&servidor);
msg = 42; tag = 0; dest = 0;
MPI_Send(&msg, 1, MPI_INT, dest, tag, servidor);
MPI_Comm_disconnect(&servidor);
MPI_Finalize();
return 0;
}
和 makefile
EXECS=server client
MPICC?=mpicc
all: ${EXECS}
server: server.c
${MPICC} -o server -g server.c
client: client.c
${MPICC} -o client -g client.c
如果我这样做:
mpirun -np 1 ./server
服务器等待,然后我做
mpirun -np 1 ./client
我有:
*** An error occurred in MPI_Lookup_name
*** on communicator MPI_COMM_WORLD
*** MPI_ERR_NAME: invalid name argument
*** MPI_ERRORS_ARE_FATAL: your MPI job will now abort
我从http://www.mcs.anl.gov/research/projects/mpi/mpi-standard/mpi-report-2.0/node106.htm获取了这个例子。问题是:我做错了什么?服务器和客户端可以像我一样单独执行吗?