「担当者」とは いいえ;」x86アセンブリの意味ですか?「一時停止」の指示と同じですか?


86
  • どういうrep; nop意味ですか?
  • pause指導と同じですか?
  • rep nop(セミコロンなし)と同じですか?
  • 簡単なnop指示との違いは何ですか?
  • AMDプロセッサとIntelプロセッサでは動作が異なりますか?
  • (ボーナス)これらの指示の公式文書はどこにありますか?

この質問の動機

別の質問のコメントでいくつか議論した後rep; nop;、x86(またはx86-64)アセンブリで何を意味するのかわからないことに気付きました。また、ウェブ上で適切な説明を見つけることができませんでした。

これrepは、「次の命令cx回数を繰り返す」ことを意味するプレフィックスであることを私は知っています(または、少なくとも、古い16ビットx86アセンブリではそうでした)。これによると、ウィキペディアでの集計表、それが思わrepだけで使用することができmovsstoscmpslodsscas(多分、この制限は、新しいプロセッサ上で削除されました)。したがって、rep nop(セミコロンなしで)nop操作cx時間を繰り返すと思います。

しかし、さらに調べてみると、さらに混乱しました。これは、と思われるrep; noppause まったく同じオペコードにマップし、pauseちょうどより少し異なる振る舞いを持ってnop2005年からのいくつかの古いメールは異なることを言っていました:

  • 「力を入れすぎないように」
  • 「2バイトのエンコーディングだけで「nop」と同等です。」
  • 「それはIntelの魔法です。それは「いや、でも他のHT兄弟を走らせて」のようなものです。」
  • 「Intelでは一時停止し、Athlonでは高速パディングです」

これらの異なる意見で、私は正しい意味を理解することができませんでした。

これは、Linuxカーネル(i386x86_64の両方)でこのコメントとともに使用されています。同じコメントで、BeRTOS/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */でも使用されています。


回答:


75

rep; nop確かにpause命令(オペコードF390)と同じです。pauseまだ命令をサポートしていないアセンブラに使用される可能性があります。以前のプロセッサでは、これnopは2バイトの場合と同じように何もしませんでした。ハイパースレッディングをサポートする新しいプロセッサでは、パフォーマンスを向上させるためにスピンループを実行していることをプロセッサに示すヒントとして使用されます。インテルの命令参照

スピンウェイトループのパフォーマンスを向上させます。「スピンウェイトループ」を実行する場合、Pentium4またはIntelXeonプロセッサは、メモリ順序違反の可能性を検出するため、ループを終了するときに重大なパフォーマンスの低下を被ります。PAUSE命令は、コードシーケンスがスピン待機ループであることをプロセッサにヒントとして提供します。プロセッサはこのヒントを使用して、ほとんどの状況でメモリ順序違反を回避します。これにより、プロセッサのパフォーマンスが大幅に向上します。このため、PAUSE命令をすべてのスピン待機ループに配置することをお勧めします。


4
あるスピン・ウェイト・ループは、同じビジー待機ループ?この「改善」はハイパースレッディングプロセッサにのみ適用されますか?(そしてその理由は?)
DenilsonSáMaia2011

11
はい、スピン待機ループはビジー待機ループと同じです。この利点は、ハイパースレッディングをサポートしていないCPUにも当てはまります。これは、パイプライン内の(不要な)命令の数を制限することと考えることができます(ループを並行して何度も繰り返すのではなく)
Brendan

1
@ブレンダン、ありがとう!ループの並列反復について話すまで、私はまったく理解していませんでした。
ファルケン教授2011

11
@ブレンダン、ああ、今私はそれを手に入れました!これらの最新のプロセッサはスーパースカラーであるため、複数の命令を同時に実行しようとします。これがビジー待機ループの場合、別の条件を待機しているだけなので、より多くの命令を実行しても速度は上がりません。
デニウソンSáマイア

1
@Denilson:はい、ハイパースレッディングフレンドリー(またはHTなしの省電力)は大きな利点の1つですが、もう1つは、スピンループを離れるときのメモリオーダリングの誤投機を回避することです。がないpauseと、スピンループは事実上1つのパイプラインになり、別のコアによって書き込まれたメモリ位置の状態変化に気付くのが遅くなります。
ピーターコーデス2017年

14

rep nop= F3 90 =のエンコーディング、およびをpauseサポートしていない古いCPUでのデコード方法pause


lock命令に適用されないプレフィックス(以外)は、既存のCPUでは実際には無視されます。

ドキュメントrepには、適用されない命令での使用は「予約されており、予期しない動作を引き起こす可能性がある」と記載されています。これは将来のCPUがそれを新しい命令の一部として認識する可能性があるためです。 を使用して特定の新しい命令エンコーディングを確立f3 xxすると、古いCPUでどのように実行されるかを文書化します。(はい、x86オペコードスペースは非常に限られているため、このようなクレイジーなことを実行します。はい、デコーダーが複雑になります。)

この場合、下位互換性を壊すことなくスピンループで使用できることを意味しますpause。について知らない古いCPUはpause、IntelのISA refマニュアルエントリでpause保証されているように、害を及ぼすことなくNOPとしてデコードます。新しいCPUでは、省電力/ HTの使いやすさのメリットが得られ、スピンしているメモリが変更されてスピンループを離れたときに、メモリ順序の誤投機回避できます。


x86タグwiki情報ページにあるIntelのマニュアルやその他の優れたものへのリンク

無意味な別のケース repプレフィックスが新しいCPUで新しい命令になる: lzcntF3 0F BD /rです。その命令をサポートしていない(CPUIDにLZCNT機能フラグがない)CPUでは、としてデコードさrep bsrbsrます。これは、と同じように実行されます。したがって、古いCPUでは、を生成し32 - expected_result、入力がゼロの場合は未定義です。

ただしtzcntbsfゼロ以外の入力でも同じことを行うため、コンパイラーはtzcnt、ターゲットCPUが次のように実行することが保証されていない場合でも使用できます。tzcntます。AMD CPUは高速tzcnt、低速bsfであり、Intelでは両方とも高速です。正確性が重要でない限り(フラグ設定に依存していない、またはinput = 0の場合に宛先を変更しない動作のままにする)、それtzcntをサポートするCPUのようにデコードすることは役に立ちます。


repおそらく異なってデコードされることのない無意味なプレフィックスの1つのケース:rep ret「汎用」CPUをターゲットにする場合(つまり、-marchまたは-mtuneで特定のCPUをターゲットにせず、AMD K8またはK10をターゲットにしない場合)、デフォルトでgccによって使用されます。ほとんどのLinuxディストリビューションのほとんどのバイナリに存在するため、rep ret以外のものとしてデコードするCPUを作成できretます。`rep ret`はどういう意味ですか?を参照してください


3
rep接頭辞は、ロックエリジオンを追加するためにインテルによって使用されました。
ポールA.クレイトン

命令に適用されないプレフィックスは無視されます。ただし、表11-3にRepeat Prefixes(F2HおよびF3H)が予約されており、予期しない動作が発生する可能性があることが記載されています。SSE、SSE2、およびSSE3命令に対するプレフィックスの影響。したがって、プレフィックスアプリケーションは、すべてではなく、一部の命令では無視されます。では、この機能は文書化されていないと見なされますか?
St.Antario

2
@ St.Antario:将来のCPUが新しい命令の一部として認識する可能性があるため、彼らはそれをそのように表現しています。これまでのすべての実際のCPUで、使用しf3 xxてエンコーディングを確立すると、古いCPUでどのように実行されるかを文書化します。
ピーター

1
命令に適用されないプレフィックス(ロック以外)は、既存のCPUでは実際には無視されます。rep movbe原因が文書化されているため#UD常に無視されるrepとは限りませREP/REPE/REPZ/REPNE/REPNZマニュアル入力で指定されている意味での命令には適用されない場合でも。
St.Antario

2
@ St.Antario:おもしろい!ただし、一般的に、古い命令の場合、適用できないプレフィックスは無視されます。新しい命令を導入する場合、必要に応じてより厳しいルールを追加することができます。IDKは、なぜこの特定のケースでそれを選択するのか。
ピーターコーデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.