2013-07-19 8 views
7

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?

Odpowiedz

14

tracisz bardzo ważną część jak operacja redukcji w miejscu pracuje w MPI (patrz pogrubiony tekst):

Gdy komunikator jest intracommunicator można przeprowadzić operację zmniejszenia in- miejsce (bufor wyjściowy jest używany jako bufor wejściowy). Zmienną należy użyć jako wartości root processsendbuf. W tym przypadku dane wejściowe są pobierane w katalogu głównym z bufora odbiorczego, gdzie zostaną zastąpione danymi wyjściowymi.

inne procesy muszą jeszcze dostarczyć swoje lokalne bufory jak sendbuf, nie MPI_IN_PLACE:

IF (me_world == 0) THEN 
    CALL mpi_reduce(MPI_IN_PLACE, buffer, counts, MPI_REAL, MPI_SUM, 0, MPI_COMM_WORLD, ierr) 
ELSE 
    CALL mpi_reduce(buffer, buffer, counts, MPI_REAL, MPI_SUM, 0, MPI_COMM_WORLD, ierr) 
END IF 

można bezpiecznie przechodzić buffer zarówno sendbuf i recvbuf w procesach non-korzeniowych ponieważ MPI_REDUCE nie pisze do recvbuf w tych procesach.

+0

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

+0

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. –

+0

@ 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. –