インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

PAUSE 組込み関数

このインテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2) の組込み関数のプロトタイプは、ヘッダーファイル xmmintrin.h 内にあります。

PAUSE 組込み関数

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 命令をヒントとして使用するプロセッサーでは、パフォーマンスが大きく向上する可能性があります。