48

このpause命令は通常、他のスレッドがスピンロックを所有している場合に、スピンロックをテストするループで使用され、タイトなループを軽減します。一部の NOP 命令に相当すると言われています。スピンロックの最適化で正確にどのように機能するか教えてもらえますか? NOP 命令でさえ CPU 時間の無駄に思えます。CPU使用率が低下しますか?

別の質問は、他の同様の目的で一時停止命令を使用できるかどうかです。たとえば、新しいノードを取得するためにいくつかの場所 (キューなど) をスキャンし続けるビジー スレッドがあります。ただし、キューが空で、スレッドが単に CPU 時間を無駄にしている場合があります。スレッドをスリープさせ、他のスレッドで起動することもできますが、スレッドは重要であるため、スリープさせたくありません。

CPU 使用率を軽減する目的で命令作業を一時停止できますか? 現在、物理コアの 100% の CPU を使用していますか?

4

4 に答える 4

37

PAUSEは、これがスピンロック待機ループであることをCPUに通知するため、メモリとキャッシュへのアクセスを最適化できます。スピンループを離れるときのメモリ順序の誤推測を回避するための詳細については、x86のpause命令も参照してください。

PAUSEは、電力を節約するために、実際にはしばらくの間CPUを停止する場合があります。古いCPUはそれをREPNOPとしてデコードするため、サポートされているかどうかを確認する必要はありません。古いCPUは、できるだけ速く何もしません(NOP)。

https://software.intel.com/en-us/articles/benefitting-power-and-performance-sleep-loopsも参照してください。


更新:キューをスピンロックのようにする場合を除いて、キューのチェックでPAUSEを使用するのは良い考えではないと思います(そしてそれを行う明確な方法はありません)。

非常に長い間回転することは、PAUSEを使用しても、依然として非常に悪いです。

于 2011-01-18T15:14:43.063 に答える
18

プロセッサは、メモリ順序違反の可能性を検出するため、ループを終了するときに重大なパフォーマンス ペナルティを受けます。PAUSE 命令は、コード シーケンスがスピン待機ループであるというヒントをプロセッサに提供します。プロセッサはこのヒントを使用して、ほとんどの状況でメモリ順序違反を回避します。これにより、プロセッサのパフォーマンスが大幅に向上します。このため、すべてのスピン待機ループに PAUSE 命令を配置することをお勧めします。PAUSE 命令の追加機能は、Intel プロセッサが消費する電力を削減することです。

[出典: インテルのマニュアル]

于 2011-10-09T11:29:52.053 に答える