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/18535.php
pgplVlb_OnWqP.pgp
Description: PGP signature