MPI_Allgather получает мусор - PullRequest
       36

MPI_Allgather получает мусор

0 голосов
/ 04 января 2019

У меня есть следующий код:

              real          :: s_s, d_s, s_r(size), d_r(size)
              integer       :: k, k_r(size)

              ! - size = number of processors
              ! - Do something to initialise s_s, d_s, k
              write(*,*) "SENDING >>>>"
              write(*,*) s_s, d_s
              call MPI_Allgather( s_s, 1, MPI_REAL,
 &                 s_r, 1, MPI_REAL, MPI_COMM_PGM, mpi_err)

              call MPI_Allgather( d_s, 1, MPI_REAL,
 &                 d_r, 1, MPI_REAL, MPI_COMM_PGM, mpi_err)

              call MPI_Allgather ( k, 1, MPI_INTEGER,
 &                 k_r, 1, MPI_INTEGER, MPI_COMM_PGM, mpi_err)


              write(*,*) "RECEIVED <<<<"
              write(*,*) s_r, d_r, kr

Это генерирует следующий вывод:

SENDING >>>>
  -1803.80339864908       0.616157856320407     
 RECEIVED <<<<
  6.953077622513053E-310  3.565412685916647E-314  1.221334434576037E-314
  1.498827614035474E-314  6.952991536467244E-310  6.953288052096687E-310
  6.953108563966064E-310  2.350861403096908E-314           4           1
           2           3

kr собирается правильно, однако, s_r и d_r, кажется, получают нежелательные.Может ли это быть из-за типов данных MPI?Я пробовал с MPI_REAL MPI_REAL8 и MPI_DOUBLE, но это не сработало.Кроме того, mpi_err = MPI_SUCCESS

Что я мог сделать, чтобы решить эту проблему?

РЕДАКТИРОВАТЬ 1 Я работал над следующей программой-прототипом:

program allgather
  implicit none

  include "mpif.h"

  real a(4)
  integer rank,size,ierr
  real as(4)
  real ar(16)
  integer i, j, k,z 

  a=1
  call MPI_INIT(ierr)
  call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
  call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)
  if(size.ne.4)then 
     write(*,*)'Error!:# of processors must be equal to 4'
     write(*,*)'Programm aborting....'
     call MPI_ABORT(ierr)
  endif

  do k=1,4
     if ( rank == (mod(k, size))) then
        a(k)  = k
     else
        a(k)  = 0.0 
     endif
  enddo

  write(*,*) "Rank :", rank
  write(*,*) a

  call MPI_Allgather(a, 4, MPI_REAL, ar,
 &     4,
 &     MPI_REAL, MPI_COMM_WORLD, ierr)

  write(*,*) "Recieved array"
  write(*,*) ar

  do i = 1, 16
     if ( ar(i) /= 0.0 ) then
        z = mod(i, size)
        if ( z == 0 ) then
           a( size ) = ar(i)
        else
           a ( z ) = ar(i)
        endif
     endif
  enddo

  write(*,*) "---------"
  write(*,*) a
  write(*,*) "---------"

  call MPI_FINALIZE(ierr)
  end

И это приводит к ожидаемым результатам, то есть ar не собирает мусор.Я не могу, однако, сказать разницу между реализациями.

1 Ответ

0 голосов
/ 04 января 2019

Оказывается, для проекта использовался тип данных MPI_FLT.Странно, что MPI_FLT работает, а не MPI_REALx, где x = 4,8, также не MPI_FLOAT.Я добавил grep-ed MPI_FLT в проект, чтобы увидеть, как он определен, но нигде в проекте не появился.

Используемая мной версия OpenMPI:

$ mpirun --version
mpirun (Open MPI) 3.0.0

Используемый мной компилятор:

$ mpifort --version
ifort (IFORT) 19.0.1.144 20181018

В будущем редактировании я подробно остановлюсь на причине.

...