MPI_REDUCE with MPI_IN_PLACE does not always work
Dear MPI community, I found a problem when calling MPI_REDUCE with the keyword MPI_IN_PLACE in my Ftn95-code (using the INTEL-12 Ftn95-compiler). Depending on the MPI-implementation and the operating system the problem occurs or not. This is my experience so far: MPICH2 v.1.4.1p1 on Win7(64-bit) PC : It works Microsoft-MPI (v. of 12/11/2012) on WIN7(64-bit) PC : It fails (either assuming the contribution of the root to be zero (i.e. silently a wrong result!), or access violation or floating exception on the root in MPI_REDUCE ) OPENMPI v.1.6.2-2 on WIN7(64-bit) PC : It fails ( in the same manner as with MS-MPI) OPENMPI v.1.4.3 and 1.6.3 on 2 LINUX-Clusters : It works INTEL-MPI v. 4.0.3 and 4.1.0 on 2 LINUX-Clusters : It works My question is: Is the failing possibly caused by an erroneous ('dangerous') Ftn-coding causing some MPI implementations to fail and others not? Or is the problem actually caused by a bug in different MPI implementions? This is my Ftn95-coding: ! subroutine mpiw_reduce_sumfast_real8( rbuffarr, nelem ) ! !=============================================================================== ! ! sbr mpiw_reduce_sumfast_real8 is a wrapper for the MPI-routine MPI_REDUCE ! applied for summing element-wise a real(REAL8) 1d-array rbuffarr(nelem) ! from all processes of communicator commSPRAY ! and store the sums on master in the same array rbuffarr(nelem) , ! i.e. on the master we overwrite the original contribution of the master by: ! ! for i=1..nelem: rbuffarr(i) = SUM_over_iproc (rbuffarr(i) ) , with iproc=1,numprocs ! ! ! mpiw_reduce_sumfast_real8 calls : MPI_REDUCE ! ! last update: 03.09.2013 !=============================================================================== ! use MPIHEADER , only: MPI_SUM, MPI_IN_PLACE use NUMBER_MODEL, only: INT4,REAL8 use MPARAL , only: lmaster, commSPRAY, ierr_mpi, mpiusertype_REAL8 ! implicit none ! integer (INT4) , intent(IN) :: nelem real (REAL8), intent(INOUT), dimension(nelem) :: rbuffarr ! input on master&slaves, result only on master ! real (REAL8) :: rdummyarr(1) if(lmaster) then call MPI_REDUCE( MPI_IN_PLACE, rbuffarr, nelem, mpiusertype_REAL8, MPI_SUM & ,0_INT4, commSPRAY, ierr_mpi ) else ! slaves call MPI_REDUCE( rbuffarr, rdummyarr, nelem, mpiusertype_REAL8, MPI_SUM & ,0_INT4, commSPRAY, ierr_mpi ) endif ! return end subroutine mpiw_reduce_sumfast_real8 Note, that the problem is not dependent on the reduce-operator (here MPI_SUM) chosen. The problem does not occur, when I apply MPI_REDUCE without the MPI_IN_PLACE option. As a reference I cite here the MPI 2.2 standard (of Sept 4, 2009, p. 164): The "in place" option for intracommunicators is specified by passing the value MPI_IN_PLACE to the argument sendbuf at the root. In such a case, the input data is taken at the root from the receive buffer, where it will be replaced by the output data. Does my coding strictly conform to this? Greetings Michael Rachner
participants (1)
-
Michael.Rachner@dlr.de