Default OpenMPI is openmpi-1.2.8-17.4.x86_64
# module load openmpi
# mpif90 ess.F90&& mpirun -np 4 ./a.out
0 1 2 3 0 1
2 3 0 1 2 3 0
1 2 3
# module unload openmpi
The result is Ok but sometime it hangs (when I require are a lot of processes)
With OpenMPI 1.4.4 and gfortran from gcc-fortran-4.5-19.1.x86_64
# module load openmpi-1.4.4-gcc-gfortran
# mpif90 ess.F90&& mpirun -np 4 ./a.out
0 -1 -1 -1 0 -1
-1 -1 0 -1 -1 -1 0
-1 -1 -1
# module unload openmpi-1.4.4-gcc-gfortran
Node 0 only update the global array with it's subarray. (i only print node 0
result)
With OpenMPI 1.4.4 and ifort 10.1.018 (yes, it's quite old, I have the latest
one but it isn't installed!)
# module load openmpi-1.4.4-gcc-intel
# mpif90 ess.F90&& mpirun -np 4 ./a.out
ess.F90(15): (col. 5) remark: LOOP WAS VECTORIZED.
0 -1 -1 -1 0 -1
-1 -1 0 -1 -1 -1
0 -1 -1 -1
# mpif90 -check arg_temp_created ess.F90&& mpirun -np 4 ./a.out
gives a lot of messages like:
forrtl: warning (402): fort: (1): In call to MPI_BCAST1DI4, an array temporary
was created for argument #1
So a temporary array is created for each call. So where is the problem ?
About the fortran compiler, I'm using similar behavior (non contiguous
subarrays) in MPI_sendrecv calls and all is working fine: I ran some intensive
tests from 1 to 128 processes on my quad-core workstation. This Fortran
solution was easier than creating user defined data types.
Can you reproduce this behavior with the test case ? What are your OpenMPI and
Gfortran/ifort versions ?
Thanks again
Patrick
The test code:
PROGRAM bide
USE mpi
IMPLICIT NONE
INTEGER :: nbcpus
INTEGER :: my_rank
INTEGER :: ierr,i,buf
INTEGER, ALLOCATABLE:: tab(:,:)
CALL MPI_INIT(ierr)
CALL MPI_COMM_RANK(MPI_COMM_WORLD,my_rank,ierr)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD,nbcpus,ierr)
ALLOCATE (tab(0:nbcpus-1,4))
tab(:,:)=-1
tab(my_rank,:)=my_rank
DO i=0,nbcpus-1
CALL MPI_BCAST(tab(i,:),4,MPI_INTEGER,i,MPI_COMM_WORLD,ierr)
ENDDO
IF (my_rank .EQ. 0) print*,tab
CALL MPI_FINALIZE(ierr)
END PROGRAM bide
-- =============================================================== | Equipe
M.O.S.T. | http://most.hmg.inpg.fr | | Patrick BEGOU | ------------ | | LEGI |
mailto:[email protected] | | BP 53 X | Tel 04 76 82 51 35 | | 38041
GRENOBLE CEDEX | Fax 04 76 82 52 71 |
===============================================================
Thanks all for your anwers. yes, I understand well that it is a non contiguous
memory access problem as the MPI_BCAST should wait for a pointer on a valid
memory zone. But I'm surprised that with the MPI module usage Fortran does not
hide this discontinuity in a contiguous temporary copy of the array. I've spent
some time to build openMPI with g++/gcc/ifort (to create the right mpi module)
and ran some additional tests:
- [OMPI users] MPI_BCAST and fortran subarrays Patrick Begou
- Re: [OMPI users] MPI_BCAST and fortran subarrays Gustavo Correa
- Re: [OMPI users] MPI_BCAST and fortran subarrays David Warren
- Re: [OMPI users] MPI_BCAST and fortran subarra... Edmund Sumbar
- Re: [OMPI users] MPI_BCAST and fortran subarra... Patrick Begou
- Re: [OMPI users] MPI_BCAST and fortran sub... Gustavo Correa
- Re: [OMPI users] MPI_BCAST and fortra... David Warren
- Re: [OMPI users] MPI_BCAST and fo... Gustavo Correa
- Re: [OMPI users] MPI_BCAST an... Patrick Begou
- [OMPI users] "almost the... Joao Amaral
- Re: [OMPI users] "almost... Ralph Castain
- Re: [OMPI users] "almost... Jeff Squyres
- Re: [OMPI users] "almost... Joao Amaral
- Re: [OMPI users] MPI_BCAST an... Jeff Squyres
