void _mm_pause(void)
PAUSE 組み込み関数は、動的実行 (特に、アウトオブオーダー実行) をサポートするプロセッサー上で、spin-wait ループに使用します。spin-wait ループ内で PAUSE を使用すると、ロックの解放を検出するコードの処理速度が向上し、パフォーマンスが大きく向上します。
プロセッサーに固有の時間の間、次の命令の実行を遅らせます。PAUSE 命令を実行しても、アーキテクチャー上の状態は変化しません。 動的スケジューリングに PAUSE 命令を使用すると、スピンループの終了時のペナルティーが軽減されます。
PAUSE 命令を使用したループの例
上の例では、メモリー・ロケーション A がレジスター eax の値と一致するまで、プログラムはスピンします。次のコードシーケンスは、test-and-test-and-set 操作を示しています。
spin_loop:pause
cmp eax, A
jne spin_loop
この例では、ロックの取得に失敗した場合にのみ、スピンが発生します。
get_lock: mov eax, 1
xchg eax, A ; Try to get lock
cmp eax, 0 ; Test if successful
jne spin_loop
// critical_section code
mov A, 0 ; Release lock
jmp continue
spin_loop: pause;
// spin-loop hint
cmp 0, A ;
// check lock availability
jne spin_loop
jmp get_lock
// continue: other code
この例では、ロックの取得に成功すると予測して、最初の条件分岐は分岐せずに、そのままクリティカル・セクションの処理に移ります。すべての spin-wait ループに、PAUSE 命令を使用することを強くお勧めします。PAUSE は、既存のすべての IA-32 アーキテクチャー・ベースのプロセッサーで使用可能なため、プロセッサーのタイプをテストする (CPUID テスト) 必要はありません。従来のプロセッサーはすべて PAUSE 命令を NOP として実行しますが、PAUSE 命令をヒントとして使用するプロセッサーでは、パフォーマンスが大きく向上する可能性があります。