Параллельный код с MPI продолжает работать без результатов - PullRequest
0 голосов
/ 21 октября 2019

Я пишу параллельную программу на фортране, используя 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,Мы правы, но это все, что напечатано. Третий отпечаток * никогда не печатается, даже если я раскомментирую его.

Что я делаю не так? Проблема в синхронизации или связи между процессами?

...