These functions do exist in Open MPI, but your code is not quite correct. Here's a new version that is correct:

-----
program main
use mpi
implicit none
integer :: ierr, rank, size
integer :: mpi1_val
integer(kind = MPI_ADDRESS_KIND) :: mpi2_val
logical :: attr_flag

call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)

call MPI_COMM_GET_ATTR(MPI_COMM_WORLD, MPI_IO, mpi2_val, attr_flag, ierr)
call MPI_ATTR_GET(MPI_COMM_WORLD, MPI_IO, mpi1_val, attr_flag, ierr)

print *, "Hello, world, I am ", rank, " of ", size
call MPI_FINALIZE(ierr)
end
-----

Note three things:

1. attr_flag is supposed to be of type logical, not integer
2. In MPI-1 (MPI_ATTR_GET) the type of the value is integer
2. In MPI-2 (MPI_COMM_GET_ATTR), the type of the value is integer(kind=MPI_ADDRESS_KIND)

F90 is strongly typed, so the F90 compiler is correct in claiming that functions of the signature you specified were not found.

Make sense?

I'm not sure why your original code works with MPICH2 -- perhaps they don't have F90 bindings for these functions, and therefore they're falling through to the F77 bindings (where no type checking is done)...? If so, you're getting lucky that it works; perhaps sizeof(INTEGER) == sizeof(LOGICAL), and sizeof(INTEGER) == sizeof(INTEGER(KIND=MPI_ADDRESS_KIND)). That's a guess.



On Dec 5, 2008, at 4:49 AM, Jens wrote:

Hi,

I just switched from MPICH2 to openmpi because of sge-support, but I am
missing some mpi-functions for fortran 90.

Does anyone know why
MPI_COMM_GET_ATTR()
MPI_ATTR_GET()
are not available? They work fine with MPICH2.

I compiled openmpi 1.2.8/1.3rc on a clean CentOS 5.2 with GNU- compilers
and Intel 11.0. Both give me the same error:

GNU:
Error: There is no specific subroutine for the generic 'mpi_attr_get' at (1)

Intel 11.0:
hello_f90.f90(22): error #6285: There is no matching specific subroutine
for this generic subroutine call.   [MPI_ATTR_GET]
call MPI_ATTR_GET(MPI_COMM_WORLD, MPI_IO, attr_val, attr_flag, ierr)

Any ideas ...?

Greetings
Jens

--------------------------------
program main
use mpi
implicit none
integer :: ierr, rank, size
integer :: attr_val, attr_flag

call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)

call MPI_COMM_GET_ATTR(MPI_COMM_WORLD, MPI_IO, attr_val, attr_flag, ierr)
call MPI_ATTR_GET(MPI_COMM_WORLD, MPI_IO, attr_val, attr_flag, ierr)

print *, "Hello, world, I am ", rank, " of ", size
call MPI_FINALIZE(ierr)
end
-------------------------------
_______________________________________________
users mailing list
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users


--
Jeff Squyres
Cisco Systems

Reply via email to