Open MPI logo

Open MPI User's Mailing List Archives

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

Subject: Re: [OMPI users] Parallel I/O doesn't work for derived datatypes with Fortran 90 interface
From: Jeff Squyres (jsquyres_at_[hidden])
Date: 2012-08-07 15:24:26


On Aug 7, 2012, at 3:13 PM, Paul Romano wrote:

> Thanks for your response Jeff. My offset is of kind MPI_OFFSET_KIND which leads me to believe it is the derived type that is causing the compilation error. I'm also able to successfully compile and run the same code using MPICH2.

That's because MPICH2 doesn't include an F90 interface for MPI_FILE_READ_AT, so it falls back to the F77-style matching (meaning: no parameter checking at all :-( ).

Alternatively, you could compile OMPI with f90-size set to "small", and then MPI_FILE_READ_AT won't be prototyped, and you should be ok.

> Out of curiousity, how is it that some of the more standard MPI routines in the F90 interface such as MPI_SEND are able to accept derived types for buffers whereas parallel I/O routines are not?

They aren't. You should run into the same issues with MPI_SEND as you do with MPI_FILE_READ AT...

FWIW, you might want to try OMPI's trunk tarball from last night with icc/icpc/ifort, and try the new "mpi" module. *All* MPI subroutines are prototyped in the "mpi" module (including those with choice buffers -- we did some magic to make that work). There's no more trivial/small/medium/large size "mpi" module.

    http://www.open-mpi.org/nightly/

Note that gfortran doesn't yet support the magic we need (although they're working on it), so if you use gfortran, you get essentially the same "mpi" module that is in OMPI 1.6.

If you're feeling adventurous, use the new mpi_f08 module. The Big Difference is that MPI handles have unique types (not INTEGER). For example:

    use mpi_f08
    type(MPI_Comm) :: comm
    comm = MPI_COMM_WORLD

But you can interchange the new handle types with legacy MPI code by accessing the MPI_VAL member; it's the same old INTEGER handle that you're used to.

    use mpi_f08
    type(MPI_Comm) :: comm
    integer :: old_style_comm_handle
    comm = MPI_COMM_WORLD
    old_style_comm_handle = comm%MPI_VAL
    comm%MPI_VAL = old_style_comm_handle

-- 
Jeff Squyres
jsquyres_at_[hidden]
For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/