Ilekroć próbuję wywołać mpi_reduce
z mpi_in_place
jako bufor wysyłania, ulega awarii. Włóknina google ujawnia, że był to problem w Mac OS dla OMPI 1.3.3 - ale jestem na CentOS z OMPI 1.6.3 (z gfortran 4.4.6).W miejscu mpi_reduce awarie z OpenMPI
Poniższe awarii programu:
PROGRAM reduce
USE mpi
IMPLICIT NONE
REAL, DIMENSION(2, 3) :: buffer, gbuffer
INTEGER :: ierr, me_world
INTEGER :: buf_shape(2), counts
CALL mpi_init(ierr)
CALL mpi_comm_rank(mpi_comm_world, me_world, ierr)
buffer = 1.
IF (me_world .EQ. 0) PRINT*, "buffer: ", buffer
buf_shape = SHAPE(buffer)
counts = buf_shape(1)*buf_shape(2)
CALL mpi_reduce(MPI_IN_PLACE, buffer, counts, mpi_real, mpi_sum, 0, mpi_comm_world, ierr)
IF (me_world .EQ. 0) PRINT*, "buffer: ", buffer
CALL mpi_finalize(ierr)
END PROGRAM reduce
Błąd MPI:
MPI_ERR_ARG: invalid argument of some other kind
który nie jest bardzo pomocne.
Czy brakuje mi informacji o tym, jak należy wywoływać numer mpi_reduce
? Czy to działa z innymi implementacjami kompilatorów/MPI?
Dzięki, to poprawiono! Źle zrozumiałem, że dokumentacja "MPI_IN_PLACE", ponieważ myślałem, że zbiorowa komunikacja musi być wywołana przez wszystkie procesy z dokładnie tymi samymi argumentami. – Yossarian
Ups, jesteś naprawdę pewien? Właśnie zajrzałem do mojego kodu produkcyjnego i mam wiele przykładów niewłaściwego użycia i nie spotkałem się z żadnym problemem. –
@ VladimirF, istnieje kilka operacji zbiorowych, w których '' MPI_IN_PLACE' musi być określony jako bufor wysyłania przez wszystkie stopnie, np. 'MPI_ALLTOALL' lub' MPI_ALLREDUCE'. Standard wymienia właściwe użycie dla każdej operacji oddzielnie. –