ia32 instructions and micro-arch for locks
- PAUSE instruction
- Spin Loop Hint, give hint to processor that improves performance of spin-wait loops. Specifically, to transfer yield CPU to another hyperthread.
-
The PAUSE instruction provides a hint to the processor that the code sequence is a spin-wait loop. The processor uses this hint to avoid the memory order violation in most situations, which greatly improves processor performance.
-
An additional function of the PAUSE instruction is to reduce the power consumed by a processor while executing a spin loop. A processor can execute a spin-wait loop extremely quickly, causing the processor to consume a lot of power while it waits for the resource it is spinning on to become available. Inserting a pause instruction in a spin-wait loop greatly reduces the processor’s power consumption.
GCC _mm_pause()
expands to __builtin_ia32_pause()
then the PAUSE
instruction.
This can be used to improve the spinlock performance (instead of a NOP
in the
busy loop).
while (__stomic_sub_fetch(&lock, 1, __ATOMIC_ACQUIRE) < 0) {
do
_mm_pause();
while (__atomic_load_n(&lock, __ATOMIC_ACQUIRE) != 1);
}