インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
このインテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2) の組込み関数のプロトタイプは、ヘッダーファイル xmmintrin.h 内にあります。
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 ; ロックの取得を試みる cmp eax, 0 ; 成功したかどうかテストする jne spin_loop
// クリティカル・セクションのコード mov A, 0 ; ロックを解放する jmp continue spin_loop: pause; // スピンループのヒント cmp 0, A ; // ロックが利用可能かどうかチェックする jne spin_loop jmp get_lock // 継続処理: その他のコード
この例では、ロックの取得に成功すると予測して、最初の条件分岐は分岐せずに、そのままクリティカル・セクションの処理に移ります。すべての spin-wait ループに、PAUSE 命令を使用することを強くお勧めします。PAUSE は、既存のすべての IA-32 アーキテクチャー・ベースのプロセッサーで使用可能なため、プロセッサーのタイプをテストする (CPUID テスト) 必要はありません。従来のプロセッサーはすべて PAUSE 命令を NOP として実行しますが、PAUSE 命令をヒントとして使用するプロセッサーでは、パフォーマンスが大きく向上する可能性があります。