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

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


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


Содержание


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

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

Чтобы изучать или найти ссылки по синтаксису вызовов MPI, получите доступ к стандарту передачи сообщений из
http://www-unix.mcs.anl.gov/mpi/ или из руководства программиста Межведомственного суперкомпьютерного центра (.zip ) Word


Цели

Настоящая лабораторная работа, во-первых, познакомит вас с использованием блокирующих и неблокирующих вызовов. Затем вы будете работать на простом коде, чтобы улучшить образцы декомпозиции и коммуникации данных.

Упражнение 1

Рабочий файл на C: deadlock.c
Файл решения на C: fixed.c

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

  1. Скомпилируйте эту тупиковую программу (deadlock). Например, для mpich в Unix, следует использовать команду:

    mpicc -o deadlock deadlock.c .
    Назначив для использования два узла и максимальное время исполнения 5 минут, запустите программу:

    mpirun -np 2 deadlock -maxtime 5 .
    Программа выдаст несколько строк выходных данных и затем встанет. Чтобы не ждать 5 минут до выброса по предельному времени счета, вам следует завершить запущенную задачу командой вида

    mkill deadlock.1,
    где deadlock -- имя задачи, а 1 -- ее номер.

  2. Прочитайте всю тупиковую программу (deadlock). Понимаете ли вы, почему она попадает в тупик?

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


Упражнение 2

Рабочие файлы для C: least-squares-pt2pt.c, xydata

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

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

    Есть в наличии также последовательная версия этой программы least-squares.c.

    Из-за способа, каким параллельное окружение управляет сигналом, стандартную функцию sleep() нельзя использовать. Поэтому, вызывается функция new_sleep, содержащаяся в файле new_sleep.c.

    • Откомпилировать программу.

      cc -c new_sleep.c

      mpicc least-squares-pt2pt.c new_sleep.o -o least-squares-pt2pt.exe

    • Запустите программу least-squares-pt2pt.exe с различным числом процессов (от 2 до 10). Обратите внимание, как экземпляры данных распределяются по процессам.

    Заметим, что: Все нижеследующие программы должны быть откомпилированы тем же способом, как программа "least-squares-pt2pt.exe", тем не менее, объектный код "new_sleep.o" следует создавать только однажды.

  2. Чтобы попрактиковаться в использовании неблокирующих отправки и получения, замените блокирующие вызовы отправки и получения в least-squares-pt2pt.c на неблокирующие вызовы.

    Файл решения на С запишите в: pt2pt-nblk-comm.c

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

    Перепишите шаги 2 и 3 программы least-squares-pt2pt.c, чтобы обеспечить наиболее равномерное распределение экземпляров данных по процессам. Когда существуют избыточные данные, некоторые процессы должны иметь n/numprocs, а некоторые иметь (n/numprocs) + 1 экземпляров данных.
    (Заметим: Предполагается целое деление для n/numprocs.)

    Файл решения на С запишите в: pt2pt-data-decomp.c

  4. На шаге 4 программы f least-squares-pt2pt.c процесс 0 получает все частные сумммы от других процессов. Перепишите шаг 4 используя двоичное дерево как описано ниже:

    • Используйте число процессов, которое равняктся двум в некоторой степени, например: 2, 4, или 8.
    • Разделите процессы на две группы. Тогда каждый процесс из второй группы посылает его частную смму некоторомц процссу в первой группе. Первая группа затем разделяется на две и этот шаг повторяется, пока процесс 0 не получит все частные суммы (предполагая, что процесс 0 находится в первой группе).
      нажмите зесь, чтобы получить иллюстрацию этого метода при использовании 8 процессов.

      (Заметим, что это может быть сделано с библиотекой коллектвных комммуникаций.)

    Файл решения на С запишите в: pt2pt-bi-reduc.c

  5. Как возможное (но необязательное) упражнение, скомбинируйте все зафиксированное в одну программу.

    Файл решения на С запишите в: pt2pt-combo.c


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