Re: __ATOMIC_RELAXED and cache coherency

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks!

On Mon, 21 Sep 2015 18:01:37 +0100
Jonathan Wakely <jwakely.gcc@xxxxxxxxx> wrote:

> On 21 September 2015 at 17:39, Victor wrote:
> > Hello!
> >
> > Could someone please explain the following details about
> > `__ATOMIC_RELAXED`?
> >
> > --------
> > Q1
> >
> > If thread `A` performs an atomic store with relaxed memory order,
> > and *after that* thread `B` performs an atomic load with relaxed
> > memory order, is it guaranteed that `B` gets actual value, on all
> > architectures supported by GCC?
> 
> What do you mean by "after that"? How do you know it is after it?
> 
> The usual way to know that even T1 happens before even T2 is by
> observing the effect of some atomic operation that imposes a
> happens-before relationship, but relaxed operations don't do that.
> 
> So your question isn't really meaningful.

I see now.

> It is guaranteed that B gets either the original value or the value
> written by A (not some other value that appeared out of thin air) but
> the whole point of relaxed operations is that they don't impose any
> synchronisation that would allow you to say A's store happens before
> B's load.

And is it guaranteed that if `B` performs relaxed load in a loop, it
will get new value in a "short" period of time after write occurred in
`A` and will not hang forever?

> > --------
> > Q2
> >
> > From GCC wiki: https://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync
> >
> >> There is also the presumption that relaxed stores from one thread
> >> are seen by relaxed loads in another thread within a reasonable
> >> amount of time. That means that on non-cache-coherent
> >> architectures, relaxed operations need to flush the cache
> >> (although these flushes can be merged across several relaxed
> >> operations)
> >
> >  2.1 I can't it figure out, does this mean that GCC will generate a
> >      cache flush, if necessary, or should I flush it by myself?
> 
> It means GCC might generate one, if needed to ensure that relaxed
> stores get seen in a reasonable amount of time.

Could you give an example of architecture, where a cache flush might be
generated by GCC?

> There are better sources of information on atomic operations than old
> wiki pages written while the work was still being implemented in GCC.
> 
> 
> >  2.2 What is the actual list of those non-cache-coherent
> > architectures, supported by GCC?
> >
> > --------
> > Q3
> >
> > On what architectures GCC will generate different code for
> > `__atomic_load(__ATOMIC_RELAXED)` and usual read of `volatile`
> > variable?
> >
> > I've tried these examples:
> >
> >  E1.
> >
> >     volatile int data;
> >
> >     int main() {
> >         data;
> >         return 0;
> >     }
> >
> >  E2.
> >
> >     volatile int data;
> >
> >     int main() {
> >         __atomic_load_n(&data, __ATOMIC_RELAXED);
> >         return 0;
> >     }
> >
> > For x86/64, arm (arm-none-eabi-gcc w/o addition options), and mipsel
> > (mipsel-linux-gnu-gcc w/o addition options), GCC generates identical
> > code for both examples.
> 
> But this is a silly example, it doesn't tell you anything about how
> the load might be affected by optimisations or other code around it.

I understand this, I'm actually looking for some simple (artificial)
example where GCC generates different instructions for volatile
read and relaxed load, just as a starting point.

> Volatiles loads and stores cannot be re-ordered by the compiler, but
> in general relaxed atomic loads and stores can be re-ordered, or
> optimised away entirely. For example the compile can remove one of the
> atomic loads here:
> 
> __atomic_load_n(&data, __ATOMIC_RELAXED);
> __atomic_load_n(&data, __ATOMIC_RELAXED);

Is it also true when `data` is declared as `volatile` (as in example)?

>
> It is not allowed to do that for volatile reads.
> 



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux