Россия, Новосибирск, НГПУ, 2009 |
Коллективные (радиовещательные) обмены данными между MPI-процессами
Цель - изучить назначение и применение функций обмена данными MPI_Bcast, MPI_Gather, MPI_Scatter и др. между MPI-процессами.
Отличия операций коллективного обмена данными от коммуникаций типа "точка-точка" состоят в следующем:
- принимают/передают данные одновременно все процессы группы для указываемого коммуникатора;
- операция коллективного обмена выполняет одновременно и прием, и передачу данных, а потому она имеет параметры, часть из которых относится к приему данных, а часть - к их передаче;
- как правило, значения всех параметров (за исключением адресов буферов с данными) должны быть тождественны во всех процессах;
- для сообщений передаваемых посредством коллективного обмена, идентификаторы (tags) назначаются автоматически; кроме того, сообщения передаются, в действительности, не по указываемому коммуникатору, а с помощью временного коммуникатора-дубликата, чем обеспечивается изоляция операций коллективной передачи данных друг от друга и от операций типа "точка-точка".
Задача 1. Реализовать рассылку сообщения от процесса с заданным рангом (этот ранг является входным параметром задачи) всем другим процессам в группе с помощью функции MPI_Bcast. Реализовать эквивалентный вариант программы, в котором вместо функции MPI_Bcast используются функции синхронной передачи данных MPI_Send и MPI_Recv.
Задача 2. Реализовать посылку сообщений (например, значений ранга) от всех процессов в группе, процессу с заданным рангом (этот ранг является входным параметром программы) с помощью функции MPI_Gather. Реализовать эквивалентный вариант программы, в котором вместо функции MPI_Gather используются функции синхронной передачи данных MPI_Send и MPI_Recv.
Задача 3. Оттранслировать и выполнить с параметром -np 4 программу, представленную ниже, в которой функция MPI_Scatter используется для рассылки строк матрицы чисел с плавающей точкой по отдельным процессам. Дополнить эту программу фрагментом, в котором отдельные процессы суммируют все элементы полученной строки и возвращают полученные результаты корневому процессу с помощью функции MPI_Gather.