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

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


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


Содержание


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

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


Цели

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


Упражнение 1

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

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

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

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

  2. откомпилируйте программу, используя Makefile:

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

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

    mpirun -np 2 blocksends.exe message_length_in_number_of_floats(reals)

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


Упражнениеe 2

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

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

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

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

  1. Компиляция программы brecv.exe.

    для языка программирования C:

    nmake /f cbrcv.mak brecv.exe

    Определив, что использоваться будут два узла ровно, запустим программу. Она предоставит время, потраченное задачей 0 на блокирующую отправку.

  2. Отредактируйте brecv.c, чтобы заменить блокирующее получение на вызов MPI_Wait. Пошлите неблокирующее получение перед сном. Откомпилируйте и запустите код.

  3. Откомпилируйте новую программу (nbrecv.exe):

    для языка программирования C:

    nmake /f cbrcv.mak nbrecv.exe

    Определив, что использоваться будут два узла ровно, запустим программу. Она предоставит время, потраченное задачей 0 на неблокирующую отправку.

  4. Проанализируйте значительную разницу между 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 руководство.