Dear community

I get a segfault in the small Fortran program that is attached. I use one-sided communication and derived datatypes.

I tried it with different version of Open MPI. Versions 1.4.2 and 1.4.5 work, but with 1.6.1 and 1.6.3 it crashes.

Can anybody confirm this?

Many thanks
Stephan
program test
  implicit none
  include 'mpif.h'

  ! Variables
  integer :: iproc, nproc, ierr

  call mpi_init(ierr)
  call mpi_comm_size(mpi_comm_world, nproc, ierr)
  call mpi_comm_rank(mpi_comm_world, iproc, ierr)

  write(*,'(2(a,i0))') 'I am task ',iproc,' out of ',nproc

  call test_mpi_get(iproc, nproc)

  write(*,'(a,i0,a)') 'task ',iproc,' is at the end of the program'

  call mpi_finalize(ierr)


end program test



subroutine test_mpi_get(iproc, nproc)
  implicit none
  include 'mpif.h'

  ! Calling arguments
  integer,intent(in) :: iproc, nproc

  ! Local ariables
  integer,parameter :: n=1
  real(kind=8),dimension(n) :: sendbuf, recvbuf
  integer :: window, size_of_double, ierr, mpi_type, nsize, nelements

  ! Initialize sendbuf on process 0.
  if (iproc==0) then
      sendbuf=51.d0
  end if

  ! Size of a double precision number in bytes.
  call mpi_type_size(mpi_double_precision, size_of_double, ierr)

  ! Create the memory window at sendbuf.
  call mpi_win_create(sendbuf(1), int(n*size_of_double,kind=mpi_address_kind), size_of_double, &
       mpi_info_null, mpi_comm_world, window, ierr)

  ! Synchronize.
  call mpi_win_fence(0, window, ierr)

  ! Create a new derived datatype (should be identical to a double
  ! precision number).
  call mpi_type_create_hvector(1, 1, int(0,kind=mpi_address_kind), &
       mpi_double_precision, mpi_type, ierr)
  call mpi_type_commit(mpi_type, ierr)

  ! Size of the datatype in bytes.
  call mpi_type_size(mpi_type, nsize, ierr)

  ! Number of double precision elements that are communicated.
  nelements=nsize/size_of_double
  write(*,*)'nelements,nsize,size_of_double',nelements,nsize,size_of_double

  ! Communicate the data from process 0 to all other process, i.e. transfer them from 
  ! the memory window (at sendbuf) to the receive buffer (recvbuf).
  if (iproc/=0) then
      call mpi_get(recvbuf(1), nelements, &
           mpi_double_precision, 0, int(0,kind=mpi_address_kind), &
           1, mpi_type, window, ierr)
  end if

  ! Free the derived datatype. According to the MPI standard this should
  ! not affect the communication.
  call mpi_type_free(mpi_type, ierr)

  ! Synchronize. Here the code crashes with a segfault.
  call mpi_win_fence(0, window, ierr)

  ! Free the window.
  call mpi_win_free(window, ierr)

  ! Write the results.
  if (iproc/=0) then
      write(*,'(a,i0,a,es9.2)') 'process ',iproc,' received the value ',recvbuf(1)
  end if

end subroutine test_mpi_get



Reply via email to