Call for compiler help/advice: atomic builtins for v3

Peter Dimov pdimov@mmltd.net
Sun Nov 6 20:32:00 GMT 2005


Richard Henderson wrote:

> To keep all this in perspective, folks should remember that atomic
> operations are *slow*.  Very very slow.  Orders of magnitude slower
> than function calls.  Seriously.  Taking p4 as the extreme example,
> one can expect a null function call in around 10 cycles, but a locked
> memory operation to take 1000.  Usually things aren't that bad, but
> I believe some poor design decisions were made for p4 here.  But even
> on a platform without such problems you can expect a factor of 30
> difference.

Apologies in advance if the following is not relevant...

Even on a P4, inlining may enable compiler optimizations. One case is when 
the compiler can see that the return value of __sync_fetch_and_or (for 
instance) isn't used. It's possible to use a wait-free "lock or" instead of 
a "lock cmpxchg" loop (MSVC 8 does this for _InterlockedOr.)

Another case is when inlining results in a sequence of K adjacent 
__sync_fetch_and_add( &x, 1 ) operations. These can legally be replaced with 
a single __sync_fetch_and_add.

Currently the __sync_* intrinsics seem to be fully locked, but if 
acquire/release/unordered variants are added, other platforms may also 
suffer from lack of inlining. On a PowerPC an unordered atomic increment is 
pretty much the same speed as an ordinary increment (when there is no 
contention.) 



More information about the Libstdc++ mailing list