From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Will Deacon <will.deacon@arm.com>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
"c++std-parallel@accu.org" <c++std-parallel@accu.org>,
"linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>,
"gcc@gcc.gnu.org" <gcc@gcc.gnu.org>,
p796231 <Peter.Sewell@cl.cam.ac.uk>,
"mark.batty@cl.cam.ac.uk" <Mark.Batty@cl.cam.ac.uk>,
Peter Zijlstra <peterz@infradead.org>,
Ramana Radhakrishnan <Ramana.Radhakrishnan@arm.com>,
David Howells <dhowells@redhat.com>,
Andrew Morton <akpm@linux-foundation.org>,
Ingo Molnar <mingo@kernel.org>,
"michaelw@ca.ibm.com" <michaelw@ca.ibm.com>
Subject: Re: Compilers and RCU readers: Once more unto the breach!
Date: Thu, 21 May 2015 15:02:32 -0700 [thread overview]
Message-ID: <20150521220232.GZ6776@linux.vnet.ibm.com> (raw)
In-Reply-To: <CA+55aFxse3wTkfLMdotb+FO+_6EN32sseC0gpBaSnJ2KmbNUhQ@mail.gmail.com>
On Thu, May 21, 2015 at 01:42:11PM -0700, Linus Torvalds wrote:
> On Thu, May 21, 2015 at 1:02 PM, Paul E. McKenney
> <paulmck@linux.vnet.ibm.com> wrote:
> >
> > The compiler can (and does) speculate non-atomic non-volatile writes
> > in some cases, but I do not believe that it is permitted to speculate
> > either volatile or atomic writes.
>
> I do *not* believe that a compiler is ever allowed to speculate *any*
> writes - volatile or not - unless the compiler can prove that the end
> result is either single-threaded, or the write in question is
> guaranteed to only be visible in that thread (ie local stack variable
> etc).
>
> Quite frankly, I'd be much happier if the C standard just said so outright.
So would I. ;-)
The usual example is the following, where x is non-volatile and
non-atomic:
if (a)
x = 42;
else
x = 7;
The current rules allow this to be transformed as follows:
x = 7;
if (a)
x = 42;
So the variable x takes on the value 7 momentarily when it otherwise
would not have.
At least C11 now prohibits "drive-by" speculative writes, where the
compiler writes a larger size and then fixes things up afterwards.
> Also, I do think that the whole "consume" read should be explained
> better to compiler writers. Right now the language (including very
> much in the "restricted dependency" model) is described in very
> abstract terms. Yet those abstract terms are actually very subtle and
> complex, and very opaque to a compiler writer.
>
> If I was a compiler writer, I'd absolutely detest that definition.
> It's very far removed from my problem space as a compiler writer, and
> nothing in the language *explains* the odd and subtle abstract rules.
> It smells ad-hoc to me.
>
> Now, I actually understand the point of those odd and abstract rules,
> but to a compiler writer that doesn't understand the background, the
> whole section reads as "this is really painful for me to track all
> those dependencies and what kills them".
>
> So I would very much suggest that there would be language that
> *explains* this. Basically, tell the compiler writer:
>
> (a) the "official" rules are completely pointless, and make sense
> only because the standard is written for some random "abstract
> machine" that doesn't actually exist.
>
> (b) in *real life*, the whole and only point of the rules is to make
> sure that the compiler doesn't turn a data depenency into a control
> dependency, which on ARM and POWERPC does not honor causal memory
> ordering
>
> (c) on x86, since *all* memory accesses are causal, all the magical
> dependency rules are just pointless anyway, and what it really means
> is that you cannot re-order accesses with value speculation.
>
> (c) the *actual* relevant rule for a compiler writer is very simple:
> the compiler must not do value speculation on a "consume" load, and
> the abstract machine rules are written so that any other sane
> optimization is legal.
>
> (d) if the compiler writer really thinks they want to do value
> speculation, they have to turn the "consume" load into an "acquire"
> load. And you have to do that anyway on architectures like alpha that
> aren't causal even for data dependencies.
I am certainly more than willing to add this sort of wording to
the document.
> I personally think the whole "abstract machine" model of the C
> language is a mistake. It would be much better to talk about things in
> terms of actual code generation and actual issues. Make all the
> problems much more concrete, with actual examples of how memory
> ordering matters on different architectures.
>
> 99% of all the problems with the whole "consume" memory ordering comes
> not from anything relevant to a compiler writer. All of it comes from
> trying to "define" the issue in the wrong terms.
I certainly cannot deny that there seems to be significant confusion
in the discussion thus far.
Thanx, Paul
next prev parent reply other threads:[~2015-05-21 22:02 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-20 0:55 Compilers and RCU readers: Once more unto the breach! Paul E. McKenney
2015-05-20 1:57 ` Linus Torvalds
2015-05-20 2:10 ` Linus Torvalds
2015-05-20 2:41 ` Paul E. McKenney
2015-05-20 11:47 ` Will Deacon
2015-05-20 12:15 ` Paul E. McKenney
2015-05-20 15:46 ` Will Deacon
2015-05-20 15:54 ` Andrew Haley
2015-05-20 18:16 ` [c++std-parallel-1632] " Paul E. McKenney
2015-05-21 14:22 ` Michael Matz
2015-05-21 15:10 ` Paul E. McKenney
2015-05-21 16:17 ` Michael Matz
2015-05-21 18:37 ` Paul E. McKenney
2015-05-20 18:16 ` Paul E. McKenney
2015-05-21 19:24 ` Will Deacon
2015-05-21 20:02 ` Paul E. McKenney
2015-05-21 20:42 ` Linus Torvalds
2015-05-21 22:02 ` Paul E. McKenney [this message]
2015-05-22 6:43 ` Ingo Molnar
2015-05-22 10:43 ` Richard Kenner
2015-05-22 13:11 ` Paul E. McKenney
2015-05-22 13:12 ` Paul E. McKenney
2015-05-26 17:37 ` [c++std-parallel-1641] " Torvald Riegel
2015-05-22 17:30 ` Will Deacon
2015-05-22 18:55 ` Paul E. McKenney
2015-05-20 13:18 ` David Howells
2015-05-20 13:30 ` Paul E. McKenney
2015-05-20 13:37 ` David Howells
2015-05-20 13:44 ` Ramana Radhakrishnan
2015-05-20 14:03 ` Paul E. McKenney
2015-05-20 14:15 ` Ramana Radhakrishnan
2015-05-20 15:12 ` Paul E. McKenney
2015-05-20 15:46 ` David Howells
2015-05-20 14:02 ` [c++std-parallel-1624] " Paul E. McKenney
2015-05-20 2:34 ` Paul E. McKenney
2015-05-20 7:34 ` [c++std-parallel-1614] " Jens Maurer
2015-05-20 9:03 ` Richard Biener
2015-05-20 12:02 ` Paul E. McKenney
2015-05-20 12:01 ` [c++std-parallel-1616] " Paul E. McKenney
2015-05-26 17:08 ` [c++std-parallel-1611] " Torvald Riegel
2015-05-27 1:41 ` [c++std-parallel-1651] " Paul E. McKenney
2015-07-14 0:44 ` Paul E. McKenney
2015-09-22 17:00 ` Paul E. McKenney
[not found] ` <CAPUmR1aqV_cQWjE8qC9x2sfmW-1ocKKMtCgNbjZH0cJ-AO2WTg@mail.gmail.com>
2015-09-23 23:26 ` [c++std-parallel-2008] " Paul E. McKenney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150521220232.GZ6776@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=Mark.Batty@cl.cam.ac.uk \
--cc=Peter.Sewell@cl.cam.ac.uk \
--cc=Ramana.Radhakrishnan@arm.com \
--cc=akpm@linux-foundation.org \
--cc=c++std-parallel@accu.org \
--cc=dhowells@redhat.com \
--cc=gcc@gcc.gnu.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=michaelw@ca.ibm.com \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=torvalds@linux-foundation.org \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).