Kawashima-san,

we always duplicate the communicator, and use the CID of the duplicated communicator, so bottom line,
there cannot be more than one window per communicator.

i will double check about using PID. if a broadcast is needed, i would rather use the process name of rank 0 in order to avoid a broadcast.

Cheers,

Gilles

On 2/3/2016 8:40 AM, Kawashima, Takahiro wrote:
Nathan,

Is is sufficient?
Multiple windows can be created on a communicator.
So I think PID + CID is not sufficient.

Possible fixes:
- The root process creates a filename with a random number
   and broadcast it in the communicator.
- Use per-communicator counter and use it in the filename.

Regards,
Takahiro Kawashima,
MPI development team,
Fujitsu

Hmm, I think you are correct. There may be instances where two different
local processes may use the same CID for different communicators. It
should be sufficient to add the PID of the current process to the
filename to ensure it is unique.

-Nathan

On Tue, Feb 02, 2016 at 09:33:29PM +0900, Gilles Gouaillardet wrote:
    Nathan,
    the sm osc component uses communicator CID to name the file that will be
    used to create shared memory segments.
    if I understand and correctly, two different communicators coming from the
    same MPI_Comm_split might share the same CID, so CID (alone) cannot be
    used to generate a unique per communicator file name
    Makes sense ?
    Cheers,
    Gilles

    ---------- Forwarded message ----------
    From: Peter Wind <peter.w...@met.no>
    Date: Tuesday, February 2, 2016
    Subject: [OMPI users] shared memory under fortran, bug?
    To: us...@open-mpi.org

    Enclosed is a short (< 100 lines) fortran code example that uses shared
    memory.
    It seems to me it behaves wrongly if openmpi is used.
    Compiled with SGI/mpt , it gives the right result.

    To fail, the code must be run on a single node.
    It creates two groups of 2 processes each. Within each group memory is
    shared.
    The error is that the two groups get the same memory allocated, but they
    should not.

    Tested with openmpi 1.8.4, 1.8.5, 1.10.2 and gfortran, intel 13.0, intel
    14.0
    all fail.

    The call:
       call MPI_Win_allocate_shared(win_size, disp_unit, MPI_INFO_NULL,
    comm_group, cp1, win, ierr)

    Should allocate memory only within the group. But when the other group
    allocates memory, the pointers from the two groups point to the same
    address in memory.

    Could you please confirm that this is the wrong behaviour?

    Best regards,
    Peter Wind
program shmem_mpi

    !
    ! in this example two groups are created, within each group memory is 
shared.
    ! Still the other group get allocated the same adress space, which it 
shouldn't.
    !
    ! Run with 4 processes, mpirun -np 4 a.out


    use mpi

    use, intrinsic :: iso_c_binding, only : c_ptr, c_f_pointer

    implicit none
!   include 'mpif.h'

    integer, parameter :: nsize = 100
    integer, pointer   :: array(:)
    integer            :: num_procs
    integer            :: ierr
    integer            :: irank, irank_group
    integer            :: win
    integer            :: comm = MPI_COMM_WORLD
    integer            :: disp_unit
    type(c_ptr)        :: cp1
    type(c_ptr)        :: cp2
    integer            :: comm_group

    integer(MPI_ADDRESS_KIND) :: win_size
    integer(MPI_ADDRESS_KIND) :: segment_size

    call MPI_Init(ierr)
    call MPI_Comm_size(comm, num_procs, ierr)
    call MPI_Comm_rank(comm, irank, ierr)

    disp_unit = sizeof(1)
    call MPI_COMM_SPLIT(comm, irank*2/num_procs, irank, comm_group, ierr)
    call MPI_Comm_rank(comm_group, irank_group, ierr)
!   print *, 'irank=', irank, ' group rank=', irank_group

    if (irank_group == 0) then
       win_size = nsize*disp_unit
    else
       win_size = 0
    endif

    call MPI_Win_allocate_shared(win_size, disp_unit, MPI_INFO_NULL, 
comm_group, cp1, win, ierr)
    call MPI_Win_fence(0, win, ierr)

    call MPI_Win_shared_query(win, 0, segment_size, disp_unit, cp2, ierr)

    call MPI_Win_fence(0, win, ierr)
    CALL MPI_BARRIER(comm, ierr)! allocations finished
!   print *, 'irank=', irank, ' size ', segment_size

    call c_f_pointer(cp2, array, [nsize])

    array(1)=0;array(2)=0
    CALL MPI_BARRIER(comm, ierr)!
77 format(4(A,I3))
    if(irank<num_procs/2)then
       if (irank_group == 0)array(1)=11
       CALL MPI_BARRIER(comm, ierr)
       print 77, 'Group 0, rank', irank, ':  array ', array(1), ' ',array(2)
       CALL MPI_BARRIER(comm, ierr)!Group 1 not yet start writing
       CALL MPI_BARRIER(comm, ierr)!Group 1 finished writing
       print 77, 'Group 0, rank', irank, ':  array ', array(1),' ',array(2)
       if(array(1)==11.and.array(2)==0)then
          print *,irank,' correct result'
       else
          print *,irank,' wrong result'
       endif
    else
       CALL MPI_BARRIER(comm, ierr)
       CALL MPI_BARRIER(comm, ierr)!Group 0 finished writing
       print 77, 'Group 1, rank', irank, ':  array ', array(1),' ',array(2)
       if (irank_group == 0)array(2)=22
       CALL MPI_BARRIER(comm, ierr)
       print 77, 'Group 1, rank', irank, ':  array ', array(1),' ',array(2)
       if(array(1)==0.and.array(2)==22)then
          print *,irank,' correct result'
       else
          print *,irank,' wrong result'
       endif
    endif

    call MPI_Finalize(ierr)

end program
_______________________________________________
devel mailing list
de...@open-mpi.org
Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/devel
Link to this post: 
http://www.open-mpi.org/community/lists/devel/2016/02/18538.php


Reply via email to