lkml.org 
[lkml]   [2014]   [Feb]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [RFC][PATCH 0/5] arch: atomic rework
    From
    On Thu, Feb 20, 2014 at 10:25 AM, Linus Torvalds
    <torvalds@linux-foundation.org> wrote:
    >
    > While in my *sane* model, where you can consume things even if they
    > then result in control dependencies, there will still eventually be a
    > "sync" instruction on powerpc (because you really need one between the
    > load of 'initialized' and the load of 'calculated'), but the compiler
    > would be free to schedule the load of 'magic_system_multiplier'
    > earlier.

    Actually, "consume" is more interesting than that. Looking at the
    bugzilla entry Torvald pointed at, it has the trick to always turn any
    "consume" dependency into an address data dependency.

    So another reason why you *want* to allow "consume" + "control
    dependency" is that it opens up the window for many more interesting
    and relevant optimizations than "acquire" does.

    Again, let's take that "trivial" expression:

    return atomic_read(&initialized, consume) ? value : -1;

    and the compiler can actually turn this into an interesting address
    data dependency and optimize it to basically use address arithmetic
    and turn it into something like

    return *(&value + (&((int)-1)-value)*!atomic_read(&initialized, consume));

    Of course, the *programmer* could have done that himself, but the
    above is actually a *pessimization* on x86 or other strongly ordered
    machines, so doing it at a source code level is actually a bad idea
    (not to mention that it's horribly unreadable).

    I could easily have gotten the address generation trick above wrong
    (see my comment about "horribly unreadable" and no sane person doing
    this at a source level), but that "complex" expression is not
    necessarily at all complex for a compiler. If "value" is a static
    variable, the compiler could create another read-only static variable
    that contains that "-1" value, and the difference in addresses would
    be a link-time constant, so it would not necessarily be all that ugly
    from a code generation standpoint.

    There are other ways to turn it into an address dependency, so the
    whole "consume as an input to conditionals" really does seem to have
    several optimization advantages (over "acquire").

    Again, the way I'd expect a compiler writer to actually *do* this is
    to just default to "ac

    Linus


    \
     
     \ /
      Last update: 2014-02-20 21:01    [W:2.647 / U:0.812 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site