Я пишу параллельную программу на фортране, используя MPI. Программа берет список чисел и перемножает его в таблицу времен, затем суммирует элементы строки, чтобы получить окончательный список (это упрощенная версия программы, которую я хочу написать, которую я использую для проверкираспараллеливание).
Способ, которым я вызывал функции MPI, не возвращает никакой ошибки, но я вижу, что сообщения внизу никогда не печатаются, в то время как на самом деле достигается только несколько операторов print * (когда я раскомментирую их, я просто использую их, чтобы увидеть, имеют ли частичные результаты смысл). Программа никогда не останавливается, я должен убить ее вручную.
program main
include "mpif.h"
real(8) :: sTime, eTime, elapsed
integer, parameter :: n = 10
integer :: x(n), vec(n)
integer :: myid, numprocs, rc
integer :: i, j, f, mysum, sum
call MPI_INIT( ierr )
call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
print *, 'Process ', myid, ' of ', numprocs, ' is alive'
x = (/ (i, i=1,n) /)
call MPI_BARRIER(MPI_COMM_WORLD,ierr)
if ( myid .eq. 0 ) then
sTime = MPI_Wtime()
endif
vec = -1
do i = myid+1, n, numprocs
mysum = 0
do j = myid+1, n, numprocs
f = x(i)*x(j)
mysum = mysum + f
!print*,myid,i,j,f,mysum
end do
!print*,myid,i,mysum
! collect all the partial sums
call MPI_REDUCE(mysum,sum,1,MPI_INTEGER,MPI_SUM,myid, &
& MPI_COMM_WORLD,ierr)
!print*,myid,i,sum
vec(i) = sum
end do
! node 0 prints the answer.
if (myid .eq. 0) then
eTime = MPI_Wtime()
print*,' Wall clock time = ', (eTime-sTime)
print*," Solution:", vec
endif
call MPI_FINALIZE(rc)
stop
end
Это то, что я получаю, если раскомментирую первый оператор print *:
Process 0 of 8 is alive
Process 6 of 8 is alive
Process 1 of 8 is alive
Process 2 of 8 is alive
Process 3 of 8 is alive
1 2 2 4 4
1 2 10 20 24
3 4 4 16 16
2 3 3 9 9
0 1 1 1 1
0 1 9 9 10
Process 5 of 8 is alive
Process 7 of 8 is alive
Process 4 of 8 is alive
5 6 6 36 36
7 8 8 64 64
4 5 5 25 25
6 7 7 49 49
Частичные результаты f,Мы правы, но это все, что напечатано. Третий отпечаток * никогда не печатается, даже если я раскомментирую его.
Что я делаю не так? Проблема в синхронизации или связи между процессами?