6

x86 一時停止命令のクロス プラットフォーム実装を作成するためのベスト プラクティスは何ですか? C++ 11 プロジェクトの忙しい回転ループで使用する予定です。

gcc ツール チェーンのみを使用している場合は、_mm_pause 組み込み関数を使用できます。この組み込み関数は、ネイティブ プロセッサが x86 の一時停止命令をサポートしていない場合でも正しいことを行いますか? また、自分のコードを clang/llvm ツールチェーンでも動作させたいと考えています。

私は C++ 11 を使用しているので、フォールバックで "std::this_thread::sleep_for" を使用できると思います。

プロジェクトのビルドに cmake を使用していますが、常に同じマシンでビルドおよびデプロイします。そのため、コンパイル中にプロセッサの設定を検出することに問題はありません。

実装例 (疑似コード) は次のとおりです。

void pause() {
// Not sure how to detect if pause is available on the platform.
#if defined(USE_mm_pause)
  __asm__ ( "pause;" );
#else
  std::this_thread::sleep_for(std::chrono::seconds(0));
#endif
}
4

1 に答える 1

11

この組み込み関数は、ネイティブ プロセッサが x86 の一時停止命令をサポートしていない場合でも正しいことを行いますか?

はい、一時停止命令は F3 90 としてエンコードされます。この命令を認識しない Pentium 4 より前のプロセッサは、次のようにデコードします。

  REP NOP

それはNOP、役に立たないプレフィックスバイトを持つ普通のものです。プロセッサは 1 ~ 2 サイクル待機してから、プロセッサの状態をまったく変更せずに続行します。使用してもパフォーマンスと電力の利点は得られませんPAUSEが、プログラムは期待どおりに動作します。

おもしろい事実:REP NOP約 35 年前にリリースされた 8086 でも合法でした。それが私が下位互換性と呼んでいるものです。

于 2013-11-05T10:24:55.757 に答える