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

Reply via email to