Вычислительный центр им. А.А. Дородницына РАН    

Раздел виртуального курса
Параллельное программирование в интерфейсе MPI


Устойчивые запросы связи (постоянная коммуникация)


Содержание

  1. Обзор
  2. Внутренняя организация
  3. Использование
  4. Эффективность работы

Литература


1. Обзор

Если попарную функцию передачи сообщений неоднократно вызывают с теми же самыми параметрами, то устойчивые запросы связи (или постоянную, непрекращаемую, коммуникацию) можно использовать, чтобы избежать избыточность при установке сообщения всякий раз, когда его отправляют. Устойчивые запросы связи сокращают накладку коммуникации между параллельной задачей и сетевым адаптером, но не накладку между сетевыми адаптерами на различных узлах.

Один класс программ, который соответсвует устойчивым запросам связи, есть декомпозиция данных задач, в которых точки модифицируют основываясь на значениях соседних точек. Для многих итераций в этом случае задачи отправляют точки, которые ограничены соседней областью, и получают точки, которые граничат с ними. При каждой итерации местоположение, количество и тип данных сообщения, адресата или исходной задачи, и коммуникатора остаются теми же самыми. Те же самые тэгы сообщения могут использоваться, потому что устойчивый запрос связи (или постоянная коммуникация) требует, чтобы коммуникация была закончена в пределах каждой итерации цикла.

Устойчивый запрос связи является неблокирующим. Вы можете выбрать иметь ли вам обе стороны в коммуникации, использующей устойчивую связь, или только одну сторону.


2. Внутренняя организация

Объекты MPI – это внутренние представления важных объектов типа групп, коммуникаторов и типов данных.. Чтобы увеличивать безопасность программы, программисты не могут непосредственно создавать, переписывать, или разрушать объекты. Они управляются посредством указателей, которые возвращаются из или передаются в функции MPI. Примером указателя является MPI_COMM_WORLD, посредством которого осуществляется доступ к объекту - коммуникатору. Вы можете также пересчитать указатель запрос, возвращаемый неблокирующими коммуникационными вызовами.

Этот объект запроса, к которому обращен этот указатель, является внутренним представлением вызова отправки или получения. Он архивирует всю информацию, содержавшуюся в параметрах вызова передачи сообщений (но не данных сообщения непосредственно), плюс режим коммуникации и состояние сообщения.

Когда программа вызывает неблокирующую функцию передачи сообщения, такую как MPI_Isend, объект запроса создается и затем коммуникация стартует. Эти шаги эквивалентны двум другим вызовам MPI, MPI_Send_init и MPI_Start. Когда программа вызывает MPI_Wait, она ждет пока все необходимые локальные операции завершатся и затем освобождает память, используемую для запоминания объекта запроса. Этот второй шаг эквивалентен вызову MPI_Request_free.

Когда Вы называете неблокирующую функцию передачи сообщений много раз с теми же самыми параметрами, Вы неоднократно создаете тот же самый объект запроса. Точно так же, когда Вы ждете завершения этой связи, Вы неоднократно освобождаете объект запроса.

Идея по устойчивым запросам связи должна позволить объекту запроса сохранять устойчивость и многократно использоваться после вызова MPI_Wait. Вы создаете объект запроса однажды (используя MPI_Send_init), запускаете и завершаете коммуникацию столько раз, как необходимо (используя MPI_Start и MPI_Wait), и затем освобождаете объект запроса однажды (используя MPI_Request_free).


3. Использование

for (i=1; i<BIGNUM; i++)
{
MPI_Irecv (buf1, cnt, tp, src, tag, com, &req[0]);

MPI_Isend (buf2, cnt, tp, dst, tag, com, &req[1]);

MPI_Waitall (2, req, status);

do_work(buf1,buf2);
}


Открытый текст в вышеуказанном рабочем листе показывает вычислительный цикл, который использует неблокирующщее получение и неблокирующую отправку. Так как цикл повторен много раз, и параметры функций коммуникации не изменяются, эта программа может использовать устойчивые запрсы связи (постоянную коммуникацию), чтобы улучшить работу.

Выбранные поля на рабочес листе показывают шаги, требуемые чтобы конвертировать эту программу для использования устойчивых запросов связи как для отправки, так и для получения.

Шаг 1: Создание запросов

Первый шаг в конвертации программы состоит в инициализации устойчивых запросов связи. Это делеется вне цикла. получение инициализируется с помощью:

Есть четыре функции MPI для инициализации устойчивых отправок, соответствующих четырем режимам коммуникации:

Так как рабочий лист использует стандартный режим, устойчивый запрос создается, используя MPI_Send_init.

Функции инициализации создают устойчивые объекты и возвращают указатели (req[0] и req[1] в рабочем листе). Они не способствуют какой-либо передаче данных.

Функции инициализации (MPI_Send_init и ее варианты, а также MPI_Recv_init) имеют тот же лист параметров, как и неблокирующие вызовы передачи сообщений (функция MPI_Isend и ее варианты, а также MPI_Irecv). Когда добавляют функцию инициализации просто "заимствуют" лист параметров вызова передачи сообщений, который должен быть заменен.

В дополнение к созданию объектов запроса используя MPI_Send_init, иногда полезно использовать указатель запроса на пустой запрос MPI_REQUEST_NULL. Это упрощает написание кода, когда все задачи делают не точно ту же вещь и когда поведение может меняться во время запуска.

Шаг 2: Заменить получение и отправку

Второй шаг в переделке программы состоит в замене вызовов получения и отправки (которые создают запросы и стартуют коммуникацию) на вызовы, которые только стартуют коммуникацию, основанную на предсущствующих запросах.

Есть два вызова старта:

Это неблокирующие вызовы. Поэтому вызов MPI_Waitall в конце цикла сохраняется. Фактически требуется Ожидание между последовательными вызовами MPI_Start, которые используют тот же самый объект запроса – объект запроса не может проследить две связи сразу.

Шаг 3: Освобождение запросов

После выхода из цикла программа больше не нуждается вобъектах устойчивого запроса. Так как объекты устойчивого запроса не освобождены посредством Wait или Tes, они должны быть явно освобождены с помощью:


4. Эффективность работы

Улучшение во времени выполнения
Устойчивые в сравнении с Обычными коммуникациями
msize (байт) способ улучшение способ улучшение
8 async 19 % sync 15 %
4096 async 11 % sync 4.7 %
8192 async 5.9 % sync 2.9 %
800,000 - - sync 0 %
8,000,000 - - sync 0 %

Эти оценки времени были сделаны на очень простой программе, в которой, в пределах цикла, одна задача неоднократно посылает сообщение второй задаче. Для трех меньших размеров сообщения, число итераций цикла менялось между 10 000 и 1 000 000. Усовершенствование с устойчивыми запросами связи не изменялось с ростом числа итераций цикла, или для отправки в сравнении с получением.

Измерения были сделаны для асинхронной и синхронной передачи данных. Всякая асинхронная передача измерена, используя стандартный режим.


Литература

MPI Home Page at Argonne National Labs http://www.mcs.anl.gov/mpi

Message Passing Interface Forum (1995) MPI: A Message Passing Interface Standard. June 12, 1995. Доступен на русском языке в pdf-формате из сайта http://www.cluster.bsu.by/MPI_ALL.htm


© 2003 Вычислительный центр им. А.А.Дородницына Все права защищены.
Прочтите наше Copyright руководство.