*/
Упражнение 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 процессов):
2
0
1
Упражнение 7. Пересылка данных по кольцу процессов.
Вначале нулевой процесс посылает некоторое число первому, первый выполняет над этим числом некоторое арифметическое действие (прибавление или отнимание некоторого числа, деление или умножение на что-либо…) и передает второму и так далее, последний процесс (номер N–1) посылает число процессу с номером 0.
Каждый процесс выполняет только три действия: прием числа, арифметическое действие, передача числа.
По окончанию работы каждый процесс выводит полученное и переданное число. Результат может выглядеть, например, так (для 3 процессов):
передал 1 получил 3
передал 2 получил 1
передал 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);