183
c Инициализация дескрипторов для 3-х матриц
CALL DESCINIT( DESCA,N,N,NB,NB,0,0, ICTXT, MAX(1,NP), INFO )
CALL DESCINIT( DESCB,N,N,NB,NB,0,0, ICTXT, MAX(1,NP), INFO )
CALL DESCINIT( DESCC,N,N,NB,NB,0,0, ICTXT, MAX(1,NP), INFO )
*
lda = DESCA(9)
с Вызов процедуры генерации матриц A и B
call pmatgen(a, DESCA, np, nq, b, DESCB, nprow, npcol, myrow, mycol)
t1 = MPI_Wtime()
*
* Вызов процедуры перемножения матриц
CALL PDGEMM('N', 'N', N, N, N, ONE, A, 1, 1, DESCA, B,1,1, DESCB,
$ ZERO, C, 1, 1, DESCC)
*
time(2) = MPI_Wtime( ) - t1
с Печать угловых элементов матрицы C
c с помощью служебной подпрограммы
if (IAM.EQ.0) write(*,*) 'Matrix C...'
CALL PDLAPRNT( 1, 1, C, 1, 1, DESCC, 0, 0, 'C', 6, MEM )
CALL PDLAPRNT( 1, 1, C, 1, N, DESCC, 0, 0, 'C', 6, MEM )
CALL PDLAPRNT( 1, 1, C, N, 1, DESCC, 0, 0, 'C', 6, MEM )
CALL PDLAPRNT( 1, 1, C, N, N, DESCC, 0, 0, 'C', 6, MEM )
c Вычисление времени, затраченного на перемножение,
c и оценка производительности в Mflops
total = time(2)
time(4) = ops/(1.0d6*total)
if (IAM.EQ.0) then
write(6,80) lda
80 format(' times for array with leading dimension of', i4)
write(6,110) time(2), time(4)
110 format(2x,'Time calculation: ', f12.4, ' sec.',
$ ' Mflops = ', f12.4)
end if
c Закрытие BLACS-процессов
CALL BLACS_GRIDEXIT( ICTXT )
CALL BLACS_EXIT(0)
9998 FORMAT( 2X, A5, ' : ', I6 )
9999 FORMAT(2X, 60A )
500 continue
stop
end
subroutine pmatgen(a, DESCA, np, nq, b, DESCB, nprow, npcol,
$ myrow, mycol)
integer n, i, j, DESCA(*), DESCB(*), nprow, npcol, myrow, mycol
double precision a(*), b(*)
nb = DESCA(5)
c Заполнение локальных частей матриц A и B,
с матрица A формируется по алгоритму A(I,J) = I, a
c матрица B(I,J) = 1./J
c Здесь имеются в виду глобальные индексы.