ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
97
if (Rank.eq.0) write(6,*) "B=",B
if (Rank.eq.0) write(6,*) "C=",Cc
Call MPI_FINALIZE(Ierr)
End
Реализация умножения двух матриц
Рассмотрим задачу вычисления произведения матриц. Для решения использу-
ем самопланирующий алгоритм, в котором один процесс (главный) является ответ-
ственным за координацию работы других процессов (подчиненных).
В общей части программы описываются основные объекты задачи:
матрица
А
, матрица
B
, результирующая матрица
C
, определяется число процессов.
Задача разбивается на две части: главный процесс и подчиненные.
В задаче умножения матриц единица работы, которую нужно раздать процес-
сам, состоит из произведения строки матрицы
A
на матрицу
B
. Сначала главный
процесс передает матрицу
B
в каждый подчиненный процесс. Затем главный про-
цесс пересылает одну строку матрицы
A
в каждый подчиненный процесс. Главный
процесс, получая результат от очередного подчиненного процесса, передает ему но-
вую работу. Цикл заканчивается, когда все строки будут розданы, и от каждого под-
чиненного процесса получен результат. При передаче данных из главного процесса
в параметре tag указывается номер передаваемой строки. Этот номер после вычис-
ления произведения вместе с результатом будет отправлен в главный процесс, что-
бы главный процесс знал, где размещать результат. Подчиненные процессы посы-
лают результаты в главный процесс и параметр MPI_ANY_TAG в операции приема
главного процесса указывает, что главный процесс принимает строки в любой по-
следовательности. Параметр status обеспечивает информацию, относящуюся к полу-
ченному сообщению. В языке Fortran это массив целых чисел размера
MPI_STATUS_SIZE. Аргумент SOURCE содержит номер процесса, который послал
сообщение, по этому адресу главный процесс будет пересылать новую работу.
Аргумент TAG хранит номер обработанной строки, что обеспечивает правильное
размещение полученного результата. После рассылки процессом всех строк матри-
цы
А
, на запросы подчиненных процессов он отвечает сообщением с отметкой 200.
Каждый подчиненный процесс получает матрицу
B
. Затем организуется цикл,
состоящий в том, что подчиненный процесс получает очередную строку матрицы
А
,
формирует произведение строки и матрицы, посылает результат главному процессу,
получает новую строку и так далее.
Таким образом, в главном процессе можно выделить следующие основные
этапы: передачу матрицы
В
в каждый процесс, посылку строки матрицы
A
после
каждого получения результирующей строки матрицы
С
от процессов.