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

UptoLike

67
Include 'mpif.h'
Integer Size, Rank, Ierr, I, N
Double Precision Sum, GSum, A, B, time1, time2,
$ Al, Bl, X, F, Buffer(0:100)
C Пределы интегрирования
Parameter (A=0.d0, B=1.d0)
C Подынтегральная функция
F(x)=DLog(1/x)
Call MPI_Init(Ierr)
Call MPI_COMM_SIZE(MPI_COMM_WORLD, Size, Ierr)
Call MPI_COMM_RANK(MPI_COMM_WORLD, Rank, Ierr)
C «0»-процесс засекает время
If (Rank.eq.0) time1 = MPI_WTime()
C Каждый процесс определяет свои пределы интегрирования
C и число интервалов разбиения
Al = A+(B-A)*Rank/Size
Bl = Al+(B-A)/Size
N = 1000000
C Каждый процесс определяет свою частичную сумму ...
Sum = 0
Do I = 1,N
X = Al+(Bl-Al)*(I-0.5d0)/N
Sum = Sum + F(X)
End Do
C «0»-процесс получает частичные суммы со всех процессов ...
Call MPI_GATHER(Sum, 1, MPI_DOUBLE_PRECISION,
$ Buffer, 1, MPI_DOUBLE_PRECISION, 0,
$ MPI_COMM_WORLD, Ierr)
C ... и суммирует их
If (Rank.eq.0) Then
GSum = 0
Do I = 0,Size-1
GSum = GSum+Buffer(I)
End Do
GSum = GSum/(N*Size)