Упражнения по MPI

*/

Упражнение 1. Аварийное завершение программы.

  • Если программа запущена на трех процессах, то выводится какое-либо сообщение об успешной работе.

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

  • Перед вызовом MPI_Abort обязательно должна стоять функция синхронизации MPI_Barrier.

Упражнение 2. Прием неизвестных сообщений.

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

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

Упражнение 3. Прием сообщений от разных процессов.

  • Программа запускается на нескольких процессах (не более 8). Некоторый процесс отправляет нулевому массив целых чисел. Номер этого процесса определяется по датчику случайных чисел1.

  • Нулевой процесс выясняет с помощью функции MPI_Probe, от какого процесса пришло сообщение, затем с помощью функции MPI_Recv считывает его из системного буфера и выводит на печать, с указанием номера процесса-отправителя.

  • Такая передача «от случайного процесса нулевому» выполняется несколько раз (не более 10).

Упражнение 4. Обмен сообщениями между двумя процессами.

  • Обмен массивами небольшой размерности (до 100 элементов).

  • Пересылка данных: MPI_Send.

  • Прием данных: MPI_Recv.

  • Обмен односторонний: один процесс передает, другой принимает, затем наоборот.

  • По окончанию работы нужно вывести полученные данные.

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

Упражнение 5. Двусторонний обмен сообщениями.

  • Обмен массивами небольшой размерности (до 100 элементов).

  • Сделайте двусторонний обмен данными с помощью функции MPI_Sendrecv (передают и принимают оба процесса).

  • Данные должны быть разными для разных процессов.

  • По окончанию работы нужно вывести полученные данные.

 

Упражнение 6. Сдвиг данных по кольцу процессов.

  • Кольцо процессов: каждый процесс посылает сообщение (свой номер) следующему, последний процесс (номер N–1) посылает сообщение процессу с номером 0.

  • По окончанию работы каждый процесс выводит свой номер и полученное сообщение. Результат должен выглядеть так (для 3 процессов):

  1. 2

  2. 0

  3. 1

Упражнение 7. Пересылка данных по кольцу процессов.

  • Вначале нулевой процесс посылает некоторое число первому, первый выполняет над этим числом некоторое арифметическое действие (прибавление или отнимание некоторого числа, деление или умножение на что-либо…) и передает второму и так далее, последний процесс (номер N–1) посылает число процессу с номером 0.

  • Каждый процесс выполняет только три действия: прием числа, арифметическое действие, передача числа.

  • По окончанию работы каждый процесс выводит полученное и переданное число. Результат может выглядеть, например, так (для 3 процессов):

    1. передал 1 получил 3

    2. передал 2 получил 1

    3. передал 3 получил 2

Упражнение 8. Перераспределение данных.

  • Распределите элементы некоторого символьного массива (например, слова “Hello”) по нескольким процессам, по одной букве на каждый процесс.

  • Перешлите элементы массива так, чтобы порядок изменился на обратный. Например, изначально данные распределены так

Процесс

Данные

0

“H”

1

“e”

2

“l”

3

“l”

4

“o”

Результат пересылки должен быть таким:

Процесс

Данные

0

“o

1

“l”

2

“l”

3

“e”

4

“H”

  • Используйте для пересылки функцию MPI_Sendrecv.

Упражнение 9. Сборка распределенных данных.

  • Распределите элементы некоторого символьного массива (например, слова “Hello”) по нескольким процессам (по одной букве на каждый процесс). Изначально весь массив находится на одном процессе (номер 0). Сделайте это с помощью функции MPI_Scatter.

  • Соберите элементы распределенного массива на другом процессе (не нулевом). Сделайте это с помощью функции MPI_Gather.

Упражнение 10.Сложение массивов.

  • В каждом процессе завести вещественный (float) массив

  • Заполните его случайными числами.

  • Сложите все эти массивы с помощью функции MPI_Reduce.

  • Выведите на печать все исходные массивы и результат.

1 С помощью функции random():

rnd_num = random();

В начале программы выполняется инициализация датчика случайных чисел:

srandom(rank);