Well,

With openmpi compiled with Fortran default integer*8, MPI_TYPE_2INTEGER seem to 
have an incorrect size. The attached Fortran program shows it,  

When run on openmpi with integer*8
 Size of MPI_INTEGER is                     8
 Size of MPI_INTEGER4 is                     4
 Size of MPI_INTEGER8 is                     8
 Size of MPI_2INTEGER is                     8           <-- Should be 16

When run on "normal" openmpi 
 Size of MPI_INTEGER is            4
 Size of MPI_INTEGER4 is            4
 Size of MPI_INTEGER8 is            8
 Size of MPI_2INTEGER is            8


Yves Secretan
yves.secre...@ete.inrs.ca

Avant d'imprimer, pensez à l'environnement
________________________________________
De : users-boun...@open-mpi.org [users-boun...@open-mpi.org] de la part de 
William Au [au_wai_ch...@hotmail.com]
Date d'envoi : 29 juin 2012 19:15
À : us...@open-mpi.org
Objet : Re: [OMPI users] fortran program with integer kind=8 using openmpi

My concern is how do the C side know fortran integer using 8 bytes?
My valgrind check show something like:

==8482== Invalid read of size 8
==8482==    at 0x5F4A50E: ompi_op_base_minloc_2integer (op_base_functions.c:631)
==8482==    by 0xBF70DD1: ompi_coll_tuned_allreduce_intra_recursivedoubling 
(op.h:498)
==8482==    by 0x5F031CB: PMPI_Allreduce (pallreduce.c:105)
==8482==    by 0x62E2F22: PMPI_ALLREDUCE (pallreduce_f.c:77)
==8482==    by 0x5C8934: mumps_276_ (mumps_part9.F:4667)
==8482==    by 0x54D89A: dmumps_ (dmumps_part1.F:157)
==8482==    by 0x43D358: dmumps_f77_ (dmumps_part3.F:6651)
==8482==    by 0x41420C: dmumps_c (mumps_c.c:422)
==8482==    by 0x412CB4: main (my_cExample_client.c:80)
==8482==  Address 0x7369608 is 0 bytes after a block of size 8 alloc'd
==8482==    at 0x4A0610C: malloc (vg_replace_malloc.c:195)
==8482==    by 0xBF709B9: ompi_coll_tuned_allreduce_intra_recursivedoubling 
(coll_tuned_allreduce.c:158)
==8482==    by 0x5F031CB: PMPI_Allreduce (pallreduce.c:105)
==8482==    by 0x62E2F22: PMPI_ALLREDUCE (pallreduce_f.c:77)
==8482==    by 0x5C8934: mumps_276_ (mumps_part9.F:4667)
==8482==    by 0x54D89A: dmumps_ (dmumps_part1.F:157)
==8482==    by 0x43D358: dmumps_f77_ (dmumps_part3.F:6651)
==8482==    by 0x41420C: dmumps_c (mumps_c.c:422)
==8482==    by 0x412CB4: main (my_cExample_client.c:80)


The fortran side:

      INTEGER IN( 2 ), OUT( 2 )

      CALL MPI_ALLREDUCE( IN, OUT, 1, MPI_2INTEGER, MPI_MINLOC,
     &                    COMM, IERR)

The compiler options will take care of IN be INTEGER*8, but will
it do the same for MPI_2INTEGER in the C side

Thanks.

Regards,

William



List-Post: users@lists.open-mpi.org
Date: Fri, 29 Jun 2012 07:03:18 -0400
From: Jeff Squyres <jsquy...@cisco.com>
Subject: Re: [OMPI users] fortran program with integer kind=8 using
        openmpi
To: <war...@atmos.washington.edu>, Open MPI Users <us...@open-mpi.org>
Message-ID: <6ffea644-3f39-4b6e-add6-3721f4855...@cisco.com>
Content-Type: text/plain; charset=iso-8859-1

On Jun 28, 2012, at 8:37 PM, David Warren wrote:

> You should not have to recompile openmpi, but you do have to use the correct 
> type. You can check the size of integers in your fortrana nd use MPI_INTEGER4 
> or MPI_INTEGER8 depending on what you get.

If you configure ompi with -fdefault-integer-8, then OMPI will assume that 
Fortran integers are always 8 bytes, so be sure to also compile all of your MPI 
applications the same way.  Indeed, you may want to configure OMPI with 
something like:

./configure FCFLAGS=-fdefault-integer-8 FFLAGS=-fdefault-integer-8 \
   --with-wrapper-fflags=-fdefault-integer-8 \
   --with-wrapper-fcflags=-fdefault-integer-8

This will add -fdefault-integer-8 to the mpif77 and mpif90 command lines 
automatically so that you *can't* compile without that flag.

Be aware that 8-byte Fortran integers *should work* in Open MPI, but it is 
probably not well tested.  You may well run into some issues; be sure to let us 
know if you run into bugs.  Sending small test programs that show the problem 
are usually the best way to help us identify/fix the precise problem.

> in gfortran use
> integer i
> if(sizeof(i) .eq. 8) then
>     mpi_int_type=MPI_INTEGER8
> else
>     mpi_int_type=MPI_INTEGER4
> endif

I don't think that this should be necessary -- as long as you configured OMPI 
with the 8-byte-integer setting, then MPI_INTEGER should represent an 8 byte 
integer.

--
Jeff Squyres
jsquy...@cisco.com
For corporate legal information go to: 
http://www.cisco.com/web/about/doing_business/legal/cri/


      subroutine check_one_type(t, s)

      implicit none

      integer t
      character*(*) s
      
      include 'mpif.h'
      
      integer i_size, i_error
!---------------------------------------------      
      
      call mpi_type_size(t, i_size, i_error)
      write(6,*) 'Size of ', s, ' is ', i_size
      
      return
      end
      
!---------------------------------------------      
!---------------------------------------------      
      program type_size
      
      include 'mpif.h'
      
      integer i_error
!---------------------------------------------      

      call mpi_init(i_error)
      
      call check_one_type(MPI_INTEGER,  'MPI_INTEGER')
      call check_one_type(MPI_INTEGER4, 'MPI_INTEGER4')
      call check_one_type(MPI_INTEGER8, 'MPI_INTEGER8')
      call check_one_type(MPI_2INTEGER, 'MPI_2INTEGER')
      
      end

Reply via email to