[petsc-dev] PetscSFFetchAndOpBegin_Window

Jeff Hammond jeff.science at gmail.com
Wed Mar 11 14:25:30 CDT 2015


>> Permission to ask potentially dumb questions?
>
> Not dumb at all.

Thanks.  I was scared that Barry would tell me I should quit my job
(again) if I asked a dumb question :-)

And the high-level goal that brought me here was to understand PETSc's
use of MPI-3 features, including RMA.  If there's more of that on a
branch, please point me to it.  Bitbucket code search either doesn't
exist or I cannot find it.

>> 1) Implementing atomic read-modify-write using
>> Lock->Get->Accumulate->Unlock is W.R.O.N.G.  Get and Accumulate are
>> NOT guaranteed to be ordered within any epoch.  Ever.  You appear to
>> be leveraged the ordered channel semantics of MPICH's Ch3.  You need
>> to either use MPI-3 RMA's MPI_Get_accumulate (or MPI_Fetch_and_op) or
>> use a mutex ala MPICH's ROMIO and ARMCI-MPI's MPI-2 port.  See
>> http://dx.doi.org/10.1109/CCGRID.2005.1558687 for algorithm details.
>
> So the secret here is that the Windown implementation was written before
> MPI-3 was available and mostly exists as the proof of concept that
> demonstrated that the API was useful.  We pretty quickly made it
> non-default and told people to never use it because Open MPI datatypes
> were so broken and because we've never seen it be faster.  Of course
> it's dangerous to leave this incorrect code (relying on a side-effect of
> the MPICH implementation) lying around, but my feeling is that this
> isn't even a good (for performance) one-sided implementation, so it
> should get a more major overhaul if we have reason to believe that
> one-sided is a desirable interface (versus two-sided or neighborhood
> collectives).  What do you think?

It's not just MPICH-specific.  It will break on BG[PQ] since they use
ADI not Ch3.

If I were you, I'd ifdef it to MPI-3 only and use MPI_Get_accumulate,
which will fix all your problems at once, particularly if this code is
not used by default.

>> 2) 'sf->ranks[i]' is used in MPI_Win_lock, whereas the rest of the RMA
>> calls use ranks[i].  I assume this is innocuous, but unless you have a
>> mutex on 'sf', it is theoretically possible that sf->ranks[i] could be
>> changed by another thread in such a way as to lead to an undefined or
>> incorrect program.  If you prohibit this behavior as part of the
>> internal design contract, then it should be noted.
>
> sf->ranks is not mutated after setup.

Except due to DRAM SDC, rowhammer exploits, gamma ray muons... :-D

In any case, it will probably save you 0-10 cycles to use the
automatic variable rather than to dereference the struct pointer again
:-)

Best,

Jeff

-- 
Jeff Hammond
jeff.science at gmail.com
http://jeffhammond.github.io/



More information about the petsc-dev mailing list