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

UptoLike

62
Sum = 0
Do I = 1,N
X = Al+(Bl-Al)*(I-0.5d0)/N
Sum = Sum + F(X)
End Do
C «0»-процесс получает частичные суммы и определяет
С результат
If (Rank.eq.0) Then
GSum = Sum
Do I=1,Size-1
Call MPI_RECV(ISum, 1, MPI_DOUBLE_PRECISION,
$ MPI_ANY_SOURCE, 0,
$ MPI_COMM_WORLD, Status, Ierr)
GSum = GSum + ISum
End Do
time2 = MPI_WTime()
GSum = GSum/(N*Size)
Write (6,*) 'Result=',GSum,' Error=',1-GSum,
$ ' Time=',time2 - time1
else
Call MPI_SEND(Sum, 1, MPI_DOUBLE_PRECISION, 0,
$ 0, MPI_COMM_WORLD, Ierr)
End If
Call MPI_FINALIZE(Ierr)
Stop
End
Изменение коснулось лишь одного оператора при приеме
«0»-процессом сообщений от других процессов на месте параметра,
отвечающего за номер процесса-отправителя, вместо явно перечис-
ляемого индекса I появилась константа MPI_ANY_SOURCE, ис-
пользование которой позволяет строить так называемые расширен-
ные запросы. В таком варианте «0»-процесс, определенно зная об-
щее число посылок, которые ему предстоит принять, не ожидает
прихода сообщения от конкретного процесса, а принимает то сооб-
щение, которое пришло раньше (в конце концов, не имеет же значе-
ния, в какой последовательности суммировать частичные суммы). В
ряде случаев, особенно в сложных программах с различной нагруз-