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

UptoLike

94
End Do
End Do
End Do
C Каждый процесс отправляет свою рассчитанную полосу C
C и заполняет недостающие полосы данными, поступающими
C от других процессов
Call MPI_ALLTOALLV(C(1,1), Counts2, Shifts2,
$ MPI_DOUBLE_PRECISION, Cc(1,1), Counts,
$ Shifts, MPI_DOUBLE_PRECISION,
$ MPI_COMM_WORLD, Ierr)
if (Rank.eq.0) write(6,*) "A=",A
if (Rank.eq.0) write(6,*) "B=",B
if (Rank.eq.0) write(6,*) "C=",Cc
Call MPI_FINALIZE(Ierr)
End
Итак, сначала каждый процесс получает матрицу А и свой блок
матрицы В. Таким образом, на каждом процессе в массиве
первых его столбцах) появляются значения, соответствующие вы-
бранному блоку матрицы В. Обратите внимание, обращение к мат-
рице Bc несколько иное, чем в предыдущем примере к матрице В.
После проведения вычисления на каждом процессе содержится мат-
рица C с соответствующей рассчитанной полосой. После проведе-
ния «коллективного обмена информацией» на каждом процессе со-
держатся идентичные массивы Сc с результатом перемножения.
Обсудим подробнее вопросы о том, как подготавливается и про-
изводится сложный процесс обмена. В примере используются два
массива смещений Shifts, Shifts2 и два массива «размеров» пересы-
лаемых блоков. Содержимое этих массивов для случая использова-
ния трех процессов следующее:
Таблица 5.3 Значения массивов смещений и размеров блоков для
случая трех процессов
«0»-процесс «1»-процесс «2»-процесс
Counts 3300 3300 3400 3300 3300 3400 3300 3300 3400
Shifts 0 3300 6600 0 3300 6600 0 3300 6600
Counts2 3300 3300 3300 3300 3300 3300 3400 3400 3400
Shifts2 0 0 0 3300 3300 3300 6600 6600 6600