The attached code is from the example on page 629-630 (17.1.15 Fortran
Derived Types) of MPI-3.  This compiles cleanly with MPICH and with OMPI
1.6.5, but not with the latest OMPI.  Arrays higher than rank 4 would
have a similar problem since they are not enumerated.  Did someone
decide that a necessarily-incomplete enumeration of types was "good
enough" and that other users should use some other workaround?

$ ~/usr/ompi/bin/mpifort -c struct.f90 
struct.f90:40.55:

  call MPI_SEND(foo, 1, newtype, dest, tag, comm, ierr)
                                                       1
Error: There is no specific subroutine for the generic 'mpi_send' at (1)
struct.f90:43.48:

  call MPI_GET_ADDRESS(fooarr(1), disp(1), ierr)
                                                1
Error: There is no specific subroutine for the generic 'mpi_get_address' at (1)
struct.f90:44.48:

  call MPI_GET_ADDRESS(fooarr(2), disp(2), ierr)
                                                1
Error: There is no specific subroutine for the generic 'mpi_get_address' at (1)
struct.f90:50.61:

  call MPI_SEND(fooarr, 5, newarrtype, dest, tag, comm, ierr)
                                                             1
Error: There is no specific subroutine for the generic 'mpi_send' at (1)


$ ~/usr/ompi/bin/ompi_info
                 Package: Open MPI jed@batura Distribution
                Open MPI: 1.9a1
  Open MPI repo revision: r29531M
   Open MPI release date: Oct 26, 2013
                Open RTE: 1.9a1
  Open RTE repo revision: r29531M
   Open RTE release date: Oct 26, 2013
                    OPAL: 1.9a1
      OPAL repo revision: r29531M
       OPAL release date: Oct 26, 2013
                 MPI API: 2.2
            Ident string: 1.9a1
                  Prefix: /home/jed/usr/ompi
 Configured architecture: x86_64-unknown-linux-gnu
          Configure host: batura
           Configured by: jed
           Configured on: Mon Jan  6 19:38:01 CST 2014
          Configure host: batura
                Built by: jed
                Built on: Mon Jan  6 19:49:41 CST 2014
              Built host: batura
              C bindings: yes
            C++ bindings: no
             Fort mpif.h: yes (all)
            Fort use mpi: yes (limited: overloading)
       Fort use mpi size: deprecated-ompi-info-value
        Fort use mpi_f08: no
 Fort mpi_f08 compliance: The mpi_f08 module was not built
  Fort mpi_f08 subarrays: no
           Java bindings: no
  Wrapper compiler rpath: runpath
              C compiler: gcc
     C compiler absolute: /usr/bin/gcc
  C compiler family name: GNU
      C compiler version: 4.8.2
            C++ compiler: g++
   C++ compiler absolute: /usr/bin/g++
           Fort compiler: /usr/bin/gfortran
       Fort compiler abs: 
         Fort ignore TKR: no
   Fort 08 assumed shape: no
      Fort optional args: no
            Fort BIND(C): no
            Fort PRIVATE: no
           Fort ABSTRACT: no
       Fort ASYNCHRONOUS: no
          Fort PROCEDURE: no
 Fort f08 using wrappers: yes
             C profiling: yes
           C++ profiling: no
   Fort mpif.h profiling: yes
  Fort use mpi profiling: yes
   Fort use mpi_f08 prof: no
          C++ exceptions: no
          Thread support: posix (MPI_THREAD_MULTIPLE: no, OPAL support: yes, 
OMPI progress: no, ORTE progress: yes, Event lib: yes)
           Sparse Groups: no
  Internal debug support: yes
  MPI interface warnings: yes
     MPI parameter check: runtime
Memory profiling support: no
Memory debugging support: no
         libltdl support: yes
   Heterogeneous support: no
 mpirun default --prefix: no
         MPI I/O support: yes
       MPI_WTIME support: gettimeofday
     Symbol vis. support: yes
   Host topology support: yes
          MPI extensions: 
   FT Checkpoint support: no (checkpoint thread: no)
   C/R Enabled Debugging: no
     VampirTrace support: yes
  MPI_MAX_PROCESSOR_NAME: 256
    MPI_MAX_ERROR_STRING: 256
     MPI_MAX_OBJECT_NAME: 64
        MPI_MAX_INFO_KEY: 36
        MPI_MAX_INFO_VAL: 256
       MPI_MAX_PORT_NAME: 1024
  MPI_MAX_DATAREP_STRING: 128
           MCA backtrace: execinfo (MCA v2.0, API v2.0, Component v1.9)
            MCA compress: bzip (MCA v2.0, API v2.0, Component v1.9)
            MCA compress: gzip (MCA v2.0, API v2.0, Component v1.9)
                 MCA crs: none (MCA v2.0, API v2.0, Component v1.9)
                  MCA db: hash (MCA v2.0, API v1.0, Component v1.9)
                  MCA db: print (MCA v2.0, API v1.0, Component v1.9)
               MCA event: libevent2021 (MCA v2.0, API v2.0, Component v1.9)
               MCA hwloc: external (MCA v2.0, API v2.0, Component v1.9)
                  MCA if: linux_ipv6 (MCA v2.0, API v2.0, Component v1.9)
                  MCA if: posix_ipv4 (MCA v2.0, API v2.0, Component v1.9)
         MCA installdirs: env (MCA v2.0, API v2.0, Component v1.9)
         MCA installdirs: config (MCA v2.0, API v2.0, Component v1.9)
          MCA memchecker: valgrind (MCA v2.0, API v2.0, Component v1.9)
              MCA memory: linux (MCA v2.0, API v2.0, Component v1.9)
               MCA pstat: linux (MCA v2.0, API v2.0, Component v1.9)
               MCA shmem: mmap (MCA v2.0, API v2.0, Component v1.9)
               MCA shmem: posix (MCA v2.0, API v2.0, Component v1.9)
               MCA shmem: sysv (MCA v2.0, API v2.0, Component v1.9)
               MCA timer: linux (MCA v2.0, API v2.0, Component v1.9)
                 MCA dfs: app (MCA v2.0, API v1.0, Component v1.9)
                 MCA dfs: orted (MCA v2.0, API v1.0, Component v1.9)
                 MCA dfs: test (MCA v2.0, API v1.0, Component v1.9)
              MCA errmgr: default_app (MCA v2.0, API v3.0, Component v1.9)
              MCA errmgr: default_hnp (MCA v2.0, API v3.0, Component v1.9)
              MCA errmgr: default_orted (MCA v2.0, API v3.0, Component v1.9)
              MCA errmgr: default_tool (MCA v2.0, API v3.0, Component v1.9)
                 MCA ess: env (MCA v2.0, API v3.0, Component v1.9)
                 MCA ess: hnp (MCA v2.0, API v3.0, Component v1.9)
                 MCA ess: singleton (MCA v2.0, API v3.0, Component v1.9)
                 MCA ess: slurm (MCA v2.0, API v3.0, Component v1.9)
                 MCA ess: tool (MCA v2.0, API v3.0, Component v1.9)
               MCA filem: raw (MCA v2.0, API v2.0, Component v1.9)
             MCA grpcomm: bad (MCA v2.0, API v2.0, Component v1.9)
                 MCA iof: hnp (MCA v2.0, API v2.0, Component v1.9)
                 MCA iof: mr_hnp (MCA v2.0, API v2.0, Component v1.9)
                 MCA iof: mr_orted (MCA v2.0, API v2.0, Component v1.9)
                 MCA iof: orted (MCA v2.0, API v2.0, Component v1.9)
                 MCA iof: tool (MCA v2.0, API v2.0, Component v1.9)
                MCA odls: default (MCA v2.0, API v2.0, Component v1.9)
                 MCA oob: tcp (MCA v2.0, API v2.0, Component v1.9)
                 MCA plm: rsh (MCA v2.0, API v2.0, Component v1.9)
                 MCA plm: slurm (MCA v2.0, API v2.0, Component v1.9)
                 MCA ras: loadleveler (MCA v2.0, API v2.0, Component v1.9)
                 MCA ras: simulator (MCA v2.0, API v2.0, Component v1.9)
                 MCA ras: slurm (MCA v2.0, API v2.0, Component v1.9)
               MCA rmaps: lama (MCA v2.0, API v2.0, Component v1.9)
               MCA rmaps: mindist (MCA v2.0, API v2.0, Component v1.9)
               MCA rmaps: ppr (MCA v2.0, API v2.0, Component v1.9)
               MCA rmaps: rank_file (MCA v2.0, API v2.0, Component v1.9)
               MCA rmaps: resilient (MCA v2.0, API v2.0, Component v1.9)
               MCA rmaps: round_robin (MCA v2.0, API v2.0, Component v1.9)
               MCA rmaps: seq (MCA v2.0, API v2.0, Component v1.9)
               MCA rmaps: staged (MCA v2.0, API v2.0, Component v1.9)
                 MCA rml: oob (MCA v2.0, API v2.0, Component v1.9)
              MCA routed: binomial (MCA v2.0, API v2.0, Component v1.9)
              MCA routed: debruijn (MCA v2.0, API v2.0, Component v1.9)
              MCA routed: direct (MCA v2.0, API v2.0, Component v1.9)
              MCA routed: radix (MCA v2.0, API v2.0, Component v1.9)
               MCA state: app (MCA v2.0, API v1.0, Component v1.9)
               MCA state: hnp (MCA v2.0, API v1.0, Component v1.9)
               MCA state: novm (MCA v2.0, API v1.0, Component v1.9)
               MCA state: orted (MCA v2.0, API v1.0, Component v1.9)
               MCA state: staged_hnp (MCA v2.0, API v1.0, Component v1.9)
               MCA state: staged_orted (MCA v2.0, API v1.0, Component v1.9)
               MCA state: tool (MCA v2.0, API v1.0, Component v1.9)
           MCA allocator: basic (MCA v2.0, API v2.0, Component v1.9)
           MCA allocator: bucket (MCA v2.0, API v2.0, Component v1.9)
                MCA bcol: basesmuma (MCA v2.0, API v2.0, Component v1.9)
                MCA bcol: ptpcoll (MCA v2.0, API v2.0, Component v1.9)
                 MCA bml: r2 (MCA v2.0, API v2.0, Component v1.9)
                 MCA btl: self (MCA v2.0, API v2.0, Component v1.9)
                 MCA btl: sm (MCA v2.0, API v2.0, Component v1.9)
                 MCA btl: tcp (MCA v2.0, API v2.0, Component v1.9)
                 MCA btl: vader (MCA v2.0, API v2.0, Component v1.9)
                MCA coll: basic (MCA v2.0, API v2.0, Component v1.9)
                MCA coll: hierarch (MCA v2.0, API v2.0, Component v1.9)
                MCA coll: inter (MCA v2.0, API v2.0, Component v1.9)
                MCA coll: libnbc (MCA v2.0, API v2.0, Component v1.9)
                MCA coll: ml (MCA v2.0, API v2.0, Component v1.9)
                MCA coll: self (MCA v2.0, API v2.0, Component v1.9)
                MCA coll: sm (MCA v2.0, API v2.0, Component v1.9)
                MCA coll: tuned (MCA v2.0, API v2.0, Component v1.9)
                 MCA dpm: orte (MCA v2.0, API v2.0, Component v1.9)
                MCA fbtl: posix (MCA v2.0, API v2.0, Component v1.9)
               MCA fcoll: dynamic (MCA v2.0, API v2.0, Component v1.9)
               MCA fcoll: individual (MCA v2.0, API v2.0, Component v1.9)
               MCA fcoll: static (MCA v2.0, API v2.0, Component v1.9)
               MCA fcoll: two_phase (MCA v2.0, API v2.0, Component v1.9)
                  MCA fs: ufs (MCA v2.0, API v2.0, Component v1.9)
                  MCA io: ompio (MCA v2.0, API v2.0, Component v1.9)
                  MCA io: romio (MCA v2.0, API v2.0, Component v1.9)
               MCA mpool: grdma (MCA v2.0, API v2.0, Component v1.9)
               MCA mpool: sm (MCA v2.0, API v2.0, Component v1.9)
                 MCA osc: pt2pt (MCA v2.0, API v2.0, Component v1.9)
                 MCA osc: rdma (MCA v2.0, API v2.0, Component v1.9)
                 MCA pml: v (MCA v2.0, API v2.0, Component v1.9)
                 MCA pml: bfo (MCA v2.0, API v2.0, Component v1.9)
                 MCA pml: cm (MCA v2.0, API v2.0, Component v1.9)
                 MCA pml: ob1 (MCA v2.0, API v2.0, Component v1.9)
              MCA pubsub: orte (MCA v2.0, API v2.0, Component v1.9)
              MCA rcache: vma (MCA v2.0, API v2.0, Component v1.9)
                 MCA rte: orte (MCA v2.0, API v2.0, Component v1.9)
                MCA sbgp: basesmsocket (MCA v2.0, API v2.0, Component v1.9)
                MCA sbgp: basesmuma (MCA v2.0, API v2.0, Component v1.9)
                MCA sbgp: p2p (MCA v2.0, API v2.0, Component v1.9)
            MCA sharedfp: individual (MCA v2.0, API v2.0, Component v1.9)
            MCA sharedfp: lockedfile (MCA v2.0, API v2.0, Component v1.9)
            MCA sharedfp: sm (MCA v2.0, API v2.0, Component v1.9)
                MCA topo: basic (MCA v2.0, API v2.1, Component v1.9)
           MCA vprotocol: pessimist (MCA v2.0, API v2.0, Component v1.9)

subroutine foobar
  use mpi

  type, BIND(C) :: mytype
     integer :: i
     real :: x
     double precision :: d
     logical :: l
  end type mytype

  type(mytype) :: foo, fooarr(5)
  integer :: blocklen(4), type(4)
  integer(KIND=MPI_ADDRESS_KIND) :: disp(4), base, lb, extent

  call MPI_GET_ADDRESS(foo%i, disp(1), ierr)
  call MPI_GET_ADDRESS(foo%x, disp(2), ierr)
  call MPI_GET_ADDRESS(foo%d, disp(3), ierr)
  call MPI_GET_ADDRESS(foo%l, disp(4), ierr)

  base = disp(1)
  disp(1) = disp(1) - base
  disp(2) = disp(2) - base
  disp(3) = disp(3) - base
  disp(4) = disp(4) - base

  blocklen(1) = 1
  blocklen(2) = 1
  blocklen(3) = 1
  blocklen(4) = 1
  type(1) = MPI_INTEGER
  type(2) = MPI_REAL
  type(3) = MPI_DOUBLE_PRECISION
  type(4) = MPI_LOGICAL

  call MPI_TYPE_CREATE_STRUCT(4, blocklen, disp, type, newtype, ierr)
  call MPI_TYPE_COMMIT(newtype, ierr)

  ! call MPI_SEND(foo%i, 1, newtype, dest, tag, comm, ierr)
  ! or
  call MPI_SEND(foo, 1, newtype, dest, tag, comm, ierr)
  ! expects that base == address(foo%i) == address(foo)

  call MPI_GET_ADDRESS(fooarr(1), disp(1), ierr)
  call MPI_GET_ADDRESS(fooarr(2), disp(2), ierr)
  extent = disp(2) - disp(1)
  lb = 0
  call MPI_TYPE_CREATE_RESIZED(newtype, lb, extent, newarrtype, ierr)
  call MPI_TYPE_COMMIT(newarrtype, ierr)

  call MPI_SEND(fooarr, 5, newarrtype, dest, tag, comm, ierr)

end subroutine foobar

Attachment: pgpPlEoB9ffem.pgp
Description: PGP signature

Reply via email to