Высокопроизводительные вычисления на кластерах. Беликов Д.А - 92 стр.

UptoLike

92
Стоит обратить внимание на то, каким образом определяется
ширина полосы рассылаемых данных: Nr = (K+1)*Nm/Size-
K*Nm/Size. Так как при вычислении Nr используется целочислен-
ное деление, то значение Nr для разных процессов, вообще говоря,
разное и не равно Nm/Size.
Способ улучшения предложенного алгоритма напрашивается
сам собой если в определении полосы матрицы C используется
лишь такая же полоса матрицы В, а не вся матрица целиком, то каж-
дому процессу достаточно послать лишь свою полосу (рис. 5.5).
Так как ширина рассылаемой полосы различна для разных про-
цессов, то удобнее всего будет воспользоваться векторным вариан-
том функции распределения блоков данных по всем процессам –
функцией SCATTERV.
Сбор результатов умножения будет выполняться при вызове
функции MPI_ALLTOALLV, которая позволяет каждому процессу
распределять по всем процессам свои данные и одновременно полу-
чать данные других процессов, причем объем данных может быть
различным для разных процессов (эта функция является наиболее
мощной и гибкой из всего семейства коллективных операций MPI,
но одновременно и наиболее сложной в использовании).
Program Example
Implicit None
Include 'mpif.h'
Integer Rank, Size, Ierr, Nm, I, J, K, BCol, ECol, Nr
C Nm - порядок матрицы
Parameter(Nm=100)
Double Precision A(Nm,Nm), B(Nm,Nm), Bc(Nm,Nm),
$ C(Nm,Nm), Cc(Nm,Nm)
Integer Counts(0:Nm), Shifts(0:Nm),
$ Counts2(0:Nm), Shifts2(0:Nm)
A
B
C
1 2 3 4 5 6
Рис. 5.5 Умножение матриц (улучшенный алгоритм)