[cpp-threads] Relaxed reload example
Paul E. McKenney
paulmck at linux.vnet.ibm.com
Thu Aug 2 06:21:07 BST 2007
Hello, Sarita,
That is indeed very similar to the explanation I got from the Alpha
architects. It took them some time to convince me that their hardware
would really do such a thing. It then took me even longer to convince
them that no sane x86 programmer would conclude that from reading the
Alpha architecture manual. ;-)
Thanx, Paul
On Wed, Aug 01, 2007 at 09:20:30PM -0500, Sarita V Adve wrote:
> Another way this could happen in hardware is if the release barriers
> only ensure that invalidations are posted at other processors and
> acquire side barriers ensure that all posted invalidates actually affect
> their processor's cache. Then the said outcome can occur if the
> dereferenced address is cached and the invalidation isn't yet applied to
> the cached copy (because there is no memory barrier). There is no
> speculation here.
>
> Sarita
>
> > -----Original Message-----
> > From: cpp-threads-bounces at decadentplace.org.uk
> > [mailto:cpp-threads-bounces at decadentplace.org.uk] On Behalf
> > Of Paul E. McKenney
> > Sent: Wednesday, August 01, 2007 7:20 PM
> > To: Herb Sutter
> > Cc: C++ threads standardisation
> > Subject: Re: [cpp-threads] Relaxed reload example
> >
> > On Wed, Aug 01, 2007 at 03:16:49PM -0700, Herb Sutter wrote:
> > > > DEC Alpha would in fact permit this outcome.
> > >
> > > Why doesn't that surprise me? :-)
> >
> > ;-)
> >
> > > > I am not aware of any other CPU that permits this outcome.
> > >
> > > I was more specifically wondering what the draft C++MM said
> > about it. At
> > > least one subquestion would be whether relaxed reads can be
> > replicated
> > > (by the CPU, or the compiler, etc.). Not sure if there are
> > other ways
> > > the result could happen.
> >
> > The current C++MM does in fact allow this outcome. N2260 proposes
> > adding mechanism that permits the programmer to disallow this outcome
> > without incurring the overhead of an explicit fence. There will be a
> > new version of this document soon.
> >
> > This outcome could happen on non-Alpha platforms via value speculation
> > and other similar compiler optimizations. The order of events might
> > be as follows:
> >
> > T1. Correctly guess the value of the not-yet-assigned pointer.
> >
> > T1. Dereference the guess, pick up uninitialized fields from the
> > structure.
> >
> > T2. Initialize the fields in the structure.
> >
> > T2. Store-release the pointer to the new structure.
> >
> > T1. Validate the guessed value for the pointer. Since they
> > match, incorrectly conclude that the dereference operation
> > went smoothly.
> >
> > Can't say that I am a fan of such optimizations, but others disagree.
> >
> > Thanx, Paul
> >
> > --
> > cpp-threads mailing list
> > cpp-threads at decadentplace.org.uk
> > http://www.decadentplace.org.uk/cgi-bin/mailman/listinfo/cpp-threads
> >
More information about the cpp-threads
mailing list