インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド

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


このヘルプトピックについてのフィードバックを送信