Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

Subject: [OMPI users] MPI_BCAST and fortran subarrays
From: Patrick Begou (Patrick.Begou_at_[hidden])
Date: 2011-12-12 10:35:54


I've got a strange problem with Fortran90 and MPI_BCAST call on a large
application. I've isolated the problem in this short program samples.
With fortran we can use subarrays in functions calls. Example, with passing a
subarray to the "change" procedure:

MODULE mymod
IMPLICIT NONE
CONTAINS
   SUBROUTINE change(tab,i)
     IMPLICIT NONE
     INTEGER, INTENT(INOUT),DIMENSION(:)::tab
     INTEGER, INTENT(IN) :: i
     tab(:)=i
   END SUBROUTINE change
END MODULE mymod

PROGRAM toto
   USE mymod
   IMPLICIT NONE
   INTEGER, PARAMETER::nx=6, ny=4
   INTEGER, DIMENSION(nx,ny):: tab
   INTEGER::i

   tab=-1
   DO i=1,nx
     CALL change(tab(i,:),i)
   ENDDO
   PRINT*,tab
END PROGRAM toto

But If I use subarrays with MPI_BCAST() like in this example:

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

It doesn't work! With openMPI 1.2.8 (OpenSuse 11.4 X86_64) I have random
segfault: it works sometime, with few cpus (2, 4, 8...) and does'nt work
sometime with a larger number of cpus (32, 48, 64...). With OpenMPI 1.4.4 (build
from sources) it hangs (most of the array tab remains at the -1 initialization
value).
Such procedure calls are allowed with fortran90 so I do not understand why they
fail here. I have to use a buffer array (called tabl in the following program)
to solve the problem.

PROGRAM bide
USE mpi
    IMPLICIT NONE
    INTEGER :: nbcpus
    INTEGER :: my_rank
    INTEGER :: ierr,i,buf
    INTEGER, ALLOCATABLE:: tab(:,:)
    INTEGER::tab1(4)

     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
     tab1=-1
     DO i=0,nbcpus-1
        IF(my_rank.EQ.i) tab1=my_rank
        CALL MPI_BCAST(tab1,4,MPI_INTEGER,i,MPI_COMM_WORLD,ierr)
        tab(i,:)=tab1
     ENDDO
     IF (my_rank .EQ. 0) print*,tab
     CALL MPI_FINALIZE(ierr)

END PROGRAM bide

Any idea about this behavior ?

Patrick

-- 
===============================================================
|  Equipe M.O.S.T.         | http://most.hmg.inpg.fr          |
|  Patrick BEGOU           |       ------------               |
|  LEGI                    | mailto:Patrick.Begou_at_[hidden] |
|  BP 53 X                 | Tel 04 76 82 51 35               |
|  38041 GRENOBLE CEDEX    | Fax 04 76 82 52 71               |
===============================================================