No clarification necessary. Standard is not user guide. Semantics are clear
from what is defined. Users who don't like the interface can write a
library that does what they want.

Jeff

On Thursday, February 11, 2016, Nathan Hjelm <hje...@lanl.gov> wrote:

>
> I should also say that I think this is something that may be worth
> clarifying in the standard. Either semantic is fine with me but there is
> no reason to change the behavior if it does not violate the standard.
>
> -Nathan
>
> On Thu, Feb 11, 2016 at 01:35:28PM -0700, Nathan Hjelm wrote:
> >
> > Jeff probably ran with MPICH. Open MPI's are consistent with our choice
> > of definition for size=0:
> >
> > query: me=1, them=0, size=0, disp=1, base=0x0
> > query: me=1, them=1, size=4, disp=1, base=0x1097e30f8
> > query: me=1, them=2, size=4, disp=1, base=0x1097e30fc
> > query: me=1, them=3, size=4, disp=1, base=0x1097e3100
> > query: me=2, them=0, size=0, disp=1, base=0x0
> > query: me=2, them=1, size=4, disp=1, base=0x109fe10f8
> > query: me=2, them=2, size=4, disp=1, base=0x109fe10fc
> > query: me=2, them=3, size=4, disp=1, base=0x109fe1100
> > query: me=2, them=PROC_NULL, size=4, disp=1, base=0x109fe10f8
> > query: me=3, them=0, size=0, disp=1, base=0x0
> > query: me=3, them=1, size=4, disp=1, base=0x1088f30f8
> > query: me=3, them=2, size=4, disp=1, base=0x1088f30fc
> > query: me=3, them=3, size=4, disp=1, base=0x1088f3100
> > query: me=3, them=PROC_NULL, size=4, disp=1, base=0x1088f30f8
> > query: me=0, them=0, size=0, disp=1, base=0x0
> > query: me=0, them=1, size=4, disp=1, base=0x105b890f8
> > query: me=0, them=2, size=4, disp=1, base=0x105b890fc
> > query: me=0, them=3, size=4, disp=1, base=0x105b89100
> > query: me=0, them=PROC_NULL, size=4, disp=1, base=0x105b890f8
> > query: me=1, them=PROC_NULL, size=4, disp=1, base=0x1097e30f8
> >
> > To be portable only use MPI_Win_shared_query and do not rely on the
> > return value of base if you pass size = 0.
> >
> > -Nathan
> >
> > On Thu, Feb 11, 2016 at 08:23:16PM +0000, Peter Wind wrote:
> > >    Thanks Jeff, that was an interesting result. The pointers are here
> well
> > >    defined, also for the zero size segment.
> > >    However I can't reproduce your output. I still get null pointers
> (output
> > >    below).
> > >    (I tried both 1.8.5 and 1.10.2 versions)
> > >    What could be the difference?
> > >    Peter
> > >    mpirun -np 4 a.out
> > >    query: me=0, them=0, size=0, disp=1, base=(nil)
> > >    query: me=0, them=1, size=4, disp=1, base=0x2aee280030d0
> > >    query: me=0, them=2, size=4, disp=1, base=0x2aee280030d4
> > >    query: me=0, them=3, size=4, disp=1, base=0x2aee280030d8
> > >    query: me=0, them=PROC_NULL, size=4, disp=1, base=0x2aee280030d0
> > >    query: me=1, them=0, size=0, disp=1, base=(nil)
> > >    query: me=1, them=1, size=4, disp=1, base=0x2aabbb9ce0d0
> > >    query: me=1, them=2, size=4, disp=1, base=0x2aabbb9ce0d4
> > >    query: me=1, them=3, size=4, disp=1, base=0x2aabbb9ce0d8
> > >    query: me=1, them=PROC_NULL, size=4, disp=1, base=0x2aabbb9ce0d0
> > >    query: me=2, them=0, size=0, disp=1, base=(nil)
> > >    query: me=2, them=1, size=4, disp=1, base=0x2b1579dd40d0
> > >    query: me=2, them=2, size=4, disp=1, base=0x2b1579dd40d4
> > >    query: me=2, them=3, size=4, disp=1, base=0x2b1579dd40d8
> > >    query: me=2, them=PROC_NULL, size=4, disp=1, base=0x2b1579dd40d0
> > >    query: me=3, them=0, size=0, disp=1, base=(nil)
> > >    query: me=3, them=1, size=4, disp=1, base=0x2ac8d2c350d0
> > >    query: me=3, them=2, size=4, disp=1, base=0x2ac8d2c350d4
> > >    query: me=3, them=3, size=4, disp=1, base=0x2ac8d2c350d8
> > >    query: me=3, them=PROC_NULL, size=4, disp=1, base=0x2ac8d2c350d0
> > >
> > >
> ----------------------------------------------------------------------
> > >
> > >      See attached.  Output below.  Note that the base you get for
> ranks 0 and
> > >      1 is the same, so you need to use the fact that size=0 at rank=0
> to know
> > >      not to dereference that pointer and expect to be writing into
> rank 0's
> > >      memory, since you will write into rank 1's.
> > >      I would probably add "if (size==0) base=NULL;" for good measure.
> > >      Jeff
> > >
> > >      $ mpirun -n 4 ./a.out
> > >
> > >      query: me=0, them=0, size=0, disp=1, base=0x10bd64000
> > >
> > >      query: me=0, them=1, size=4, disp=1, base=0x10bd64000
> > >
> > >      query: me=0, them=2, size=4, disp=1, base=0x10bd64004
> > >
> > >      query: me=0, them=3, size=4, disp=1, base=0x10bd64008
> > >
> > >      query: me=0, them=PROC_NULL, size=4, disp=1, base=0x10bd64000
> > >
> > >      query: me=1, them=0, size=0, disp=1, base=0x102d3b000
> > >
> > >      query: me=1, them=1, size=4, disp=1, base=0x102d3b000
> > >
> > >      query: me=1, them=2, size=4, disp=1, base=0x102d3b004
> > >
> > >      query: me=1, them=3, size=4, disp=1, base=0x102d3b008
> > >
> > >      query: me=1, them=PROC_NULL, size=4, disp=1, base=0x102d3b000
> > >
> > >      query: me=2, them=0, size=0, disp=1, base=0x10aac1000
> > >
> > >      query: me=2, them=1, size=4, disp=1, base=0x10aac1000
> > >
> > >      query: me=2, them=2, size=4, disp=1, base=0x10aac1004
> > >
> > >      query: me=2, them=3, size=4, disp=1, base=0x10aac1008
> > >
> > >      query: me=2, them=PROC_NULL, size=4, disp=1, base=0x10aac1000
> > >
> > >      query: me=3, them=0, size=0, disp=1, base=0x100fa2000
> > >
> > >      query: me=3, them=1, size=4, disp=1, base=0x100fa2000
> > >
> > >      query: me=3, them=2, size=4, disp=1, base=0x100fa2004
> > >
> > >      query: me=3, them=3, size=4, disp=1, base=0x100fa2008
> > >
> > >      query: me=3, them=PROC_NULL, size=4, disp=1, base=0x100fa2000
> > >
> > >      On Thu, Feb 11, 2016 at 8:55 AM, Jeff Hammond <
> jeff.scie...@gmail.com <javascript:;>>
> > >      wrote:
> > >
> > >        On Thu, Feb 11, 2016 at 8:46 AM, Nathan Hjelm <hje...@lanl.gov
> <javascript:;>> wrote:
> > >        >
> > >        >
> > >        > On Thu, Feb 11, 2016 at 02:17:40PM +0000, Peter Wind wrote:
> > >        > >    I would add that the present situation is bound to give
> > >        problems for some
> > >        > >    users.
> > >        > >    It is natural to divide an array in segments, each
> process
> > >        treating its
> > >        > >    own segment, but needing to read adjacent segments too.
> > >        > >    MPI_Win_allocate_shared seems to be designed for this.
> > >        > >    This will work fine as long as no segment as size zero.
> It can
> > >        also be
> > >        > >    expected that most testing would be done with all
> segments
> > >        larger than
> > >        > >    zero.
> > >        > >    The document adding "size = 0 is valid", would also make
> people
> > >        confident
> > >        > >    that it will be consistent for that special case too.
> > >        >
> > >        > Nope, that statement says its ok for a rank to specify that
> the
> > >        local
> > >        > shared memory segment is 0 bytes. Nothing more. The standard
> > >        > unfortunately does not define what pointer value is returned
> for a
> > >        rank
> > >        > that specifies size = 0. Not sure if the RMA working group
> > >        intentionally
> > >        > left that undefine... Anyway, Open MPI does not appear to be
> out of
> > >        > compliance with the standard here.
> > >        >
> > >        MPI_Alloc_mem doesn't say what happens if you pass size=0
> either.  The
> > >        RMA working group intentionally tries to maintain consistency
> with the
> > >        rest of the MPI standard whenever possible, so we did not
> create a new
> > >        semantic here.
> > >        MPI_Win_shared_query text includes this:
> > >        "If all processes in the group attached to the window specified
> size =
> > >        0, then the call returns size = 0 and a baseptr as if
> MPI_ALLOC_MEM
> > >        was called with size = 0."
> > >
> > >        >
> > >        > To be safe you should use MPI_Win_shared_query as suggested.
> You can
> > >        > pass MPI_PROC_NULL as the rank to get the pointer for the
> first
> > >        non-zero
> > >        > sized segment in the shared memory window.
> > >        Indeed!  I forgot about that.  MPI_Win_shared_query solves this
> > >        problem for the user brilliantly.
> > >        Jeff
> > >        --
> > >        Jeff Hammond
> > >        jeff.scie...@gmail.com <javascript:;>
> > >        http://jeffhammond.github.io/
> > >
> > >      --
> > >      Jeff Hammond
> > >      jeff.scie...@gmail.com <javascript:;>
> > >      http://jeffhammond.github.io/
> > >      _______________________________________________
> > >      users mailing list
> > >      us...@open-mpi.org <javascript:;>
> > >      Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
> > >      Link to this post:
> > >      http://www.open-mpi.org/community/lists/users/2016/02/28508.php
> >
> > > _______________________________________________
> > > users mailing list
> > > us...@open-mpi.org <javascript:;>
> > > Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
> > > Link to this post:
> http://www.open-mpi.org/community/lists/users/2016/02/28511.php
> >
>
>
>
> > _______________________________________________
> > users mailing list
> > us...@open-mpi.org <javascript:;>
> > Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
> > Link to this post:
> http://www.open-mpi.org/community/lists/users/2016/02/28513.php
>
>

-- 
Jeff Hammond
jeff.scie...@gmail.com
http://jeffhammond.github.io/

Reply via email to