156
print *, 'pi ist approximated with ', gsum *w
print *, 'time = ', time, ' seconds'
print *, 'mflops = ', mflops, ' on ', np, ' processors'
print *, 'mflops = ', mflops/np, ' for one processor'
endif
с Закрытие MPI
call MPI_FINALIZE(ierr)
end
13.2. Перемножение матриц
Рассмотренный в предыдущем разделе пример представляет
наиболее простой для распараллеливания тип задач, в которых в процессе
выполнения подзадач не требуется выполнять обмен информацией между
процессорами. Такая ситуация имеет место всегда, когда переменная
распараллеливаемого цикла не индексирует какие-либо массивы
(типичный случай – параметрические задачи). В задачах линейной
алгебры, в которых вычисления связаны с обработкой массивов, часто
возникают ситуации, когда необходимые для вычисления матричные
элементы отсутствуют на обрабатывающем процессоре. Тогда процесс
вычисления не может быть продолжен до тех пор, пока они не будут
переданы в память нуждающегося в них процессора. В качестве
простейшего примера задач этого типа рассмотрим задачу перемножения
матриц.
Достаточно подробно проблемы, возникающие при решении этой
задачи, рассматривались в главе 3 (раздел 3.3). В основном речь шла об
однопроцессорном варианте программы, но были также приведены данные
по производительности для двух вариантов параллельных программ.
Первый вариант был получен распараллеливанием обычной
однопроцессорной программы, без использования оптимизированных
библиотечных подпрограмм. В этом разделе мы рассмотрим именно эту
программу. Параллельная программа, которая базируется на библиотечных
подпрограммах библиотеки ScaLAPACK, будет рассмотрена в части 3.
Существует множество вариантов решения этой задачи на
многопроцессорных системах. Алгоритм решения существенным образом