Вопросы и задания к главе 3

1.     Приведите примеры локальных и глобальных коммуникационных функций MPI.

2.     Напишите программу на Фортране или Си, включив в нее обрамляющие функции MPI (MPI_Init, MPI_Finalize) (стартовый шаблон для написания всех последующих параллельных программ).

3.     Напишите программу для определения общего числа процессоров (MPI_Comm_Size), индивидуального номера процесса (MPI_Comm_Rank).

4.     Напишите программу для вывода имен узлов кластера (MPI_Get_Processor_Name).

5.     Создайте и выполните на разном числе процессоров программу, которая выводит на экран сообщение ”my_id=k”, где k - ранг процесса.

6.     Приведите пример блокирующих операций передачи сообщений типа ”точка-точка”, который приводит параллельный алгоритм в тупиковую ситуацию.

7.     В чем отличие блокирующих и неблокирующих функций?

8.     Какого типа и какое значение возвращает функция MPI_Wtime ?

9.     Создайте и выполните на разном числе процессоров программу, используя блокирующие коммуникационные функции (MPI_Send, MPI_Recv), реализующую следующий алгоритм: на нулевом процессоре инициализируется переменная (Real a); нулевой процессор рассылает переменную а всем процессорам, включая самого себя; после получения переменной а, все процессора прибавляют к ней свой индивидуальный номер и передают на нулевой процессор; нулевой процессор получает от всех процессоров данные и формирует массив, который выводится в файл результатов (формат файла результатов – номер процессора, пересланное им значение переменной а).

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

11.     Напишите программу, используя блокирующие коммуникационные функции (MPI_Send, MPI_Recv), реализующую алгоритм передачи данных по кольцу: очередной процессор дожидается сообщения от предыдущего и потом посылает следующему процессору.

12.     Создайте программу, используя блокирующие коммуникационные функции (MPI_Send, MPI_Recv), реализующую алгоритм передачи данных по кольцу: все процессора одновременно посылают и принимают сообщения.

13.     Напишите программу, используя блокирующие коммуникационные функции (MPI_Send, MPI_Recv), реализующую алгоритм передачи данных по двум кольцам: нечетные процессора образуют 1 кольцо, четные – второе.

14.     Создайте программу, используя блокирующие коммуникационные функции (MPI_Send, MPI_Recv), реализующую алгоритм передачи данных от каждого процессора каждому.

15.     Создайте и выполните программу, используя коммуникационные функции (MPI_Ssend, MPI_Bsend, MPI_Rsend, MPI_Isend, MPI_Irecv), передающие одномерные и двумерные массивы (вектора и матрицы) между двумя процессорами. Проведите сравнение по скорости передачи данных в зависимости от применяемых функций и размера передаваемых данных.

16.     Создайте и выполните программу, используя коммуникационную функцию (MPI_Sendrecv), реализующую алгоритм передачи данных по кольцу. Получите графики пересылок данных между процессорами с помощью утилиты Jumphot.

17.     Создайте и выполните программу, используя коммуникационную функцию (MPI_Sendrecv), реализующую алгоритм передачи данных по двум кольцам: нечетные процессора образуют первое кольцо, четные – второе. Получите графики пересылок данных между процессорами с помощью утилиты Jumphot.

18.     В чем отличие функций MPI_Sendrecv и MPI_Sendrecv_replace?

19.     С какой целью используется функция MPI_Get_count ?

20.     С какой целью используется функция MPI_Probe ?

21.     Создайте программу, используя коммуникационную функцию (MPI_Bcast), реализующую алгоритм передачи данных от 0 процесса всем остальным.

22.     Создайте программу, используя коммуникационную функцию (MPI_Gather), реализующую алгоритм передачи частей массива от всех процессоров на нулевой процессор.

23.     Создайте программу, используя коммуникационную функцию (MPI_Allgather), реализующую алгоритм передачи частей массива от всех процессоров на все процессора.

24.     Создайте программу, используя коммуникационную функцию (MPI_Scatter), реализующую алгоритм передачи частей массива от нулевого процессора на все процессора.

25.     Используя функции для создания коммуникаторов, реализуйте следующий алгоритм: на нулевом процессоре задана переменная а, на первом процессоре – b; с помощью коммуникационной функции (MPI_Bcast) передайте переменную a – четным процессорам, переменную b – нечетным.

26.     Для какой передачи данных используется функция MPI_Alltoall ?

27.     Используя упаковку данных (функция MPI_Pack) и распаковку данных (функция MPI_Unpack), напишите программу,  реализующую алгоритм передачи четных элементов последовательности с одного процессора на другой. Проведите сравнение по скорости передачи данных с помощью производных типов данных, с помощью упаковки данных и простой передачей данных. Получите графики пересылок данных между процессорами с помощью утилиты Jumphot.

28.     Используя один из конструкторов (MPI_TYPE_...), напишите программу,  реализующую алгоритм передачи четных элементов последовательности с одного процессора на другой. Проведите сравнение по скорости передачи данных с помощью производных типов данных и без него. Получите графики пересылок данных между процессорами с помощью утилиты Jumphot.