Boost logo

Boost :

Subject: Re: [boost] [spinlock] Spin on volatile read, NUMA fairness?
From: Peter Dimov (lists_at_[hidden])
Date: 2014-12-03 20:39:00


Stephan T. Lavavej wrote:
> [Niall Douglas]
> > I think the Intel paper was referring to MSVC only, which is an unusual
> > compiler in that its atomics all turn into InterlockedXXX functions
> > irrespective of what you ask for. In other words, all seq_cst.
>
> Absolutely untrue for VC-ARM. Also untrue for VC 2015 x86/x64, where
> <atomic> avoids Interlocked machinery when an ordinary load/store with a
> compiler barrier will suffice due to the strength of the architecture's
> guarantees. (The versions are blurring together, so I forget when we made
> this change.)

If I remember correctly, on x86/x64 all atomic loads can be a plain MOV,
even seq_cst. The acquire is implicit, and the sequential consistency is
guaranteed by seq_cst stores being XCHG. (Relaxed/release stores are also a
plain MOV.)

The paper doesn't mean that though. It says that the typical spinlock
acquisition is:

    // atomic_flag f_;

    while( f_.test_and_set( std::memory_order_acquire ) )
    {
        /* maybe yield */
    }

and that it's better to do this:

    // atomic_bool f_;

    do
    {
        while( f_.load( std::memory_order_relaxed ) )
        {
            /* maybe yield */
        }
    }
    while( f_.exchange( true, std::memory_order_acquire ) );

instead.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk