MPICH: Как опубликовать_имя, чтобы клиентское приложение могло его искать?
При изучении MPI с использованием MPICH в Windows (1.4.1p1) я нашел здесь пример кода. Первоначально, когда я запустил сервер, мне пришлось бы скопировать сгенерированный 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, но у меня проблемы с его сборкой. Какие-либо предложения?
3 ответа
Такой подход публикации имен, их поиска и подключения к ним является диковинным по сравнению с обычным использованием MPI.
Стандартный шаблон заключается в использовании mpirun
указать набор узлов, на которых нужно запустить определенное количество процессов. Операция общих реализаций mpirun
реализации объясняется в другом вопросе
Как только все процессы запущены как часть одного параллельного задания, библиотека MPI считывает любую информацию, предоставленную программой запуска MPI_Init
установить MPI_COMM_WORLD
коммуникатор над группой всех процессов в работе.
Используя этот коммуникатор, параллельное приложение может распределять работу, обмениваться информацией и так далее. Это будет сделано с использованием общего MPI_Send
а также MPI_Recv
подпрограммы, во всех их вариантах, коллективные операции и так далее.
Я загрузил рабочую версию, используя OpenMPI 1.6.5 клиента и сервера в C на Ubuntu, который использует сервер имен ompi-server здесь:
(раскапывая старый материал)
Для MPICH код @daemondave тоже должен работать. Однако для этого по-прежнему требуется запустить сервер имен. Для MPICH вместо использования ompi-server это можно сделать с помощью hydra_nameserver. Затем хост должен быть указан для всех вызовов mpirun/mpiexec с использованием
-nameserver HOSTNAME
.
Я создал рабочий пример на github, который также предоставляет сценарий оболочки для сборки + запуска примера.
PS: вариант с омпи-сервером кажется несколько устаревшим (и содержит несколько ошибок).
Обновленную, но все же несколько недокументированную альтернативу смотрите в этом комментарии.