Пример 3.3 Следующий пример показывает простейший способ использования интерфейса клиент/сервер. Он вообще не использует имена сервисов.
Со стороны сервера:
char myportMPI_MAX_PORT_NAME;
MPI_Comm intercomm;
/* ... */
MPI_Open_port(MPI_INFO_NULL, myport);
printf(``port name is: %sn'', myport);
MPI_Comm_accept(myport, MPI_INFO_NULL, 0, MPI_COMM_SELF,
&intercomm);
/* выполнить что-либо с intercomm */
Сервер выводит имя порта на терминал, а пользователь должен ввести его при запуске клиента (предполагая, что реализация MPI поддерживает stdin таким образом, чтобы это работало).
Со стороны клиента:
MPI_Comm interconm;
char nameMPI_MAX_PORT_NAME;
printf(``enter port name: '');
gets(name);
MPI_Comm_connect(name, MPI_INFO_NULL, 0, MPI_COMM_SELF,
&intercomm);
Пример 3.4 В этом примере приложение ``ocean'' является ``серверной'' частью связной модели климата океан-атмосфера. Оно предполагает, что реализация MPI публикует имена.
Со стороны сервера:
MPI_Open_port(MPI_INFO_NULL, port_name);
MPI_Publish_name(``ocean'', MPI_INFO_NULL, port_name);
MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_SELF,
&intercomm);
/* выполнить что-либо с intercomm */
MPI_Unpublish_name(``ocean'', MPI_INFO_NULL, port_name);
Со стороны клиента:
MPI_Lookup_name(``ocean'', MPI_INFO_NULL, port_name);
MPI_Comm_connect( port_name, MPI_INFO_NULL, 0, MPI_COMM_SELF,
&intercomm);
Пример 3.5 Это простой пример приложения клиент/сервер. Сервер принимает только одно соединение в один момент времени и обслуживает это соединение до получения сообщения с тегом 1, то есть, пока клиент не потребует рассоединения. Сообщение с тегом 0 приказывает серверу завершиться. Сервер является отдельным процессом.
#include``MPI.h''
int main( int argc, char **argv )
MPI_Comm client;
MPI_Status status;
char port_nameMPI_MAX_PORT_NAME;
double bufMAX_DATA;
int size, again;
MPI_Init( &argc, &argv );
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (size != 1) error(FATAL, ``Server too big'');
MPI_Open_port(MPI_INFO_NULL, port_name);
printf (``server available at %sn'' ,port_name);
while (1)
MPI_Comm_accept( port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD,
&client );
again = 1;
while (again)
MPI_Recv( buf, MAX.DATA, MPI_DOUBLE,
MPI_ANY_SOURCE, MPI_ANY_TAG, client, &status );
switch (status.MPI_TAG)
case 0: MPI_Comm_free( &client );
MPI_Close_port(port_name);
MPI_Finalize();
return 0;
case 1: MPI_Comm_disconnect( &client);
again = 0;
break;
case 2: /* выполнить что-либо */
...
default:
/* Неизвестный тип сообщения */
MPI_Abort( MPI_COMM_WORLD, 1);
Здесь приведен код клиента:
#include``MPI.h''
int main( int argc, char **argv )
MPI_Comm server;
double bufMAX_DATA;
char port_nameMPI_MAX_PORT_NAME;
MPI_Init( &argc, &argv );
strcpy(port_name, argv1); /* предположим, что имя сервера*/
/* - аргумент командной строки */
MPI_Comm_connect(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD,
&server);
while (!done)
tag = 2; /* Выполнить действие */
MPI_Send(buf, n, MPI_DOUBLE, 0, tag, server );
/* и т.д. */
MPI_Send(buf, 0, MPI_DOUBLE, 0, 1, server);
MPI_Comm_disconnect(&server);
MPI_Finalize();
return 0;