Тема: Двухточечные неблокирующие обмены.
Цель: Получить практические навыки по планированию операций обмена и взаимодействию процессов с использованием двухточечных неблокирующих обменов.
Задание к лабораторной работе
Необходимо переработать MPI-программу с предыдущей лабораторной работы №2, используя вместо блокирующих функций двухточечного обмена неблокирующие функции двухточечного обмена. Придерживаясь рекомендаций данных ниже.
2.1 Изучите содержимое файла MPI-программы vector.c. Изучите вспомогательные функции, описанные в данном файле.
2.2 Добавьте в начале функции main описание следующих переменных:
MPI_Request* requests = NULL; // массив идентификаторов запросов
MPI_Status* statuses = NULL; // массив статусов сообщений
2.3 Модифицируйте цикл отправки сообщений, дочерним процессам используя функцию неблокирующей отправки сообщения MPI_Isend. Перед циклом отправки сообщений необходимо выделить память для массивов идентификаторов обменов и статусов обменов, используя код:
requests = (MPI_Request*)malloc(sizeof(MPI_Request) * CommSize);
statuses = (MPI_Status*)malloc(sizeof(MPI_Status) * CommSize);
2.4 После цикла отправки сообщений дочерним процессам подождите завершения всех обменов, используя функцию MPI_Waitall. После того как отработает функция MPI_Waitall проверьте статусы возвращенных обменов, проанализировав содержимое массива statuses
2.5 Модифицируйте цикл приема сообщений, от дочерних процессов используя функцию неблокирующего приема сообщения MPI_Irecv. После цикла приема сообщений от дочерних процессов подождите завершения всех обменов, используя функцию MPI_Waitall. После того как отработает функция MPI_Waitall проверьте статусы возвращенных обменов, проанализировав содержимое массива statuses.
2.6 В начале функции calc объявите переменную:
MPI_Request request; // запрос
2.7 Замените вызов функции MPI_Probe(MASTER_PROCESS, TAG_VECTOR_DATA, MPI_COMM_WORLD, &MpiStatus) на следующий код:
while(flag == 0) { // ожидаем прихода данных
MPI_Iprobe(MASTER_PROCESS, TAG_VECTOR_DATA , MPI_COMM_WORLD, &flag, &MpiStatus); // здесь можно сделать любую полезную работу
// когда процесс простаивает в ожидании данных
// предупреждение: тут на консоль лучше ничего не выводить
// иначе повесите всю программу }
Подумайте, какую полезную работу при таком ожидании может выполнять дочерний процесс.
2.8 Замените вызов функции MPI_Recv на комбинацию вызовов MPI_Irecv и MPI_Wait с проверкой статуса завершения обмена.
2.9 Замените вызов функции MPI_Send на комбинацию вызовов MPI_Isend и MPI_Wait с проверкой статуса завершения обмена.
2.10 Перед возвратом из функции main освободите динамически выделенную память под массивы requests и statuses.
2.11 Произведите компиляцию приложения, при возникновении ошибок исправьте их.
Литература
Эндрю Таненбаум, Мартин ван Стеен Распределенные системы. Принципы и парадигмы = Andrew S. Tanenbaum, Maarten van Steen. "Destributed systems. Principles and paradigms. — Санкт-Петербург: Питер, 2003. — 877 с. — (Классика computer science). — ISBN 5-272-00053-6
С. Н. Андрианов, А. Б. Дегтярев 1 // ПАРАЛЛЕЛЬНЫЕ И РАСПРЕДЕЛЕННЫЕ ВЫЧИСЛЕНИЯ. — С.-Петерб.: Издательство С.-Петербургского университета, 2007. — 61 с.
А. А. Букатов, В. Н. Дацюк, А. И. Жегуло Программирование многопроцессорных вычислительных систем. — Ростов-на-Дону: ООО «ЦВВР», 2003. — 208 с. — ISBN 5-94153-062-5
Эндрюс Г.Р. Основы многопоточного, параллельного и распределенного программирования. Пер.с англ. — М.: Издательский дом «Вильямс», 2003.
Миллер Р., Боксер Л. Последовательные и параллельные алгоритмы. Пер. с англ. — М.: БИНОМ. Лаборатория знаний, 2006.
Богачёв К.Ю. Основы параллельного программирования. — М.: БИНОМ. Лаборатория знаний, 2003.