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

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


Лабораторная работа ╧ 3: основы MPI попарного обмена сообщениями II


Содержание


Предварительные требования

Работу следует делать после изучения MPI основы попарного обмена сообщениями II. Прежде чем приступить к этой работе необходимо завершить модуль и лабораторную работу по основам программирования в MPI.


Цели

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


Упражнение 1

Файл на C для работы:

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

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

  1. Прочитайте текст программы и отметьте сходство синтаксиса между вызовами отправки и дополнительными шагами, которые нужно сделать для осуществления буферизованной отправки и использования неблокирующих получений.
  2. Oткомпилируйте программу, используя Makefile:

 

для C: nmake /f cbrcv.mak blocksends.exe

 

  1. Запустите программу на 2 процессорах, используя различные длины сообщений. Команда для запуска имеет следующий вид:

 

mpirun -np 2 blocksends.exe message_length_in_number_of_floats(reals)

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

Упражнение 2

Файлы для работы на C:

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

Программа brecv.exe является весьма искусственной: в ней задача 0 осуществляет блокирующую отправку, а задача 1 бездействует в течение десяти секунд перед выполнением блокирующего получения. Вызов бездействия предназначен для имитации затрат времени на полезные вычисления.

Программа на C вызывает функцию new_sleep(), чтобы сымитировать некоторые вычисления.

  1. Компиляция программы brecv.exe для языка программирования C:

 

nmake /f cbrcv.mak brecv.exe

 

  1. Определив, что будут использоваться ровно два узла, запустим программу. Программа покажет время, потраченное задачей 0 на блокирующую отправку.
  2. Отредактируйте brecv.c, чтобы заменить блокирующее получение вызовом MPI_Wait. Пошлите неблокирующее получение перед началом бездействия. Откомпилируйте и запустите код.
  3. Откомпилируйте новую программу (nbrecv.exe)

 

      для C: nmake /f cbrcv.mak nbrecv.exe

 

  1. Определив, что использоваться будут два узла ровно, запустите программу. Программа покажет время, потраченное задачей 0  на неблокирующую отправку.
  2. Проанализируйте значительную разницу между brecv.exe и nbrecv.exe для разных значений известного в данной версии MPICH буферного предела (2048*4 байт - буфер по умолчанию для MPICH for Lynix):

 

mpirun -np 2 brecv.exe 2048

mpirun -np 2 brecv.exe 2049

mpirun -np 2 nbrecv.exe 2048

mpirun -np 2 nbrecv.exe 2049


 

 

 

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