11

MONITOR-MWAIT と HLT の命令に関して、私は不思議に思っています。どちらもプロセッサを停止し、さまざまな外部トリガー (割り込みなど) でウェイクアップします。

私の実験では、次のことを考慮すると、HLT と MWAIT はほぼ同じように機能します。

  • あなたがOS スケジューラでない場合、上記の命令による単純なループは非常に急速に中断されます。また、MWAIT では MONITOR と MWAIT の間で状態を再チェックする必要があるため、違いは何ですか? (私が求めているのは、最初に HLT を使用しない理由と、トレース領域を割り当てる手間を省く理由です (慎重に構成しないと、mon/mwait メカニズムを回避し、NOP に変換します)。 OS スケジューラではなく、HLT ループの値を単純にチェックするだけの速度で起動しない可能性はありません... ???

(確かに、MWAITはより高い解像度になる可能性があります。解像度は測定していませんが、(私が推測する)割り込みなどによってオーバーウェイクアップしているようです)..大きな利点はわかりません。

ありがとう、そのような考えは大歓迎です

4

3 に答える 3

15

パフォーマンスのために; 最も重要なのは、CPU が待機しているもの (HLT の IRQ、または MWAIT の IRQ またはメモリ書き込み) が発生するたびに、CPU が「待機」状態から抜け出すのにかかる時間です。これはレイテンシーに影響を与えます。例えば、割り込みハンドラーが開始されるまで、またはタスクの切り替えが実際に発生するまでにかかる時間です。CPU が待機状態から復帰するまでにかかる時間は、CPU によって異なります。また、同じ CPU の HLT と MWAIT でわずかに異なる場合もあります。

同じことが電力消費にも当てはまります。待機中に消費される電力は、異なる CPU 間で大きく異なる可能性があります (特に、ハイパースレッディングなどについて考え始める場合)。また、HLT と MWAIT の消費電力も、同じ CPU 上でわずかに異なる場合があります。

使用に関しては、さまざまな状況を対象としています。HLT は IRQ を待機するためのもので、MWAIT はメモリ書き込みが発生するのを待機するためのものです。もちろん、メモリ書き込みが発生するのを待っている場合は、IRQ が待機を中断するかどうかを決定する必要があります (たとえば、メモリ書き込みだけを待ちたい場合は、そうすることができます) CLIMWAIT

ただし、マルチタスクシステムの場合、ほとんどの場合、両方とも同じ目的 (CPU がアイドル状態のスケジューラー) でのみ使用されます。MONITOR/MWAIT が導入される前は、スケジューラーは (消費電力を少し削減するために) 作業を待機している間、HLT を使用していました。これは、別の CPU がタスクのブロックを解除した場合、そのタスクをスケジューラーのキューに入れるだけではなく、HLT 状態からノックアウトするために (比較的高価な) 「プロセッサー間割り込み」を HLT された CPU に送信する必要があることを意味します (そうでない場合)。 CPU は、できる/すべき作業がある場合、何もしません)。MWAIT では、この「プロセッサ間割り込み」は (潜在的に) 不要です。スケジューラのキューへの書き込みを監視するように MONITOR を設定できるため、タスクをキューに入れるだけで、待機中の CPU が待機を停止するのに十分です。 .

また、スピンロックや同期などに MONITOR/MWAIT を使用する研究もいくつか行われています (競合するロックが解放されるのを待つなど)。この研究の最終結果は、CPU が「待機」状態から抜け出すのにかかる時間が長すぎ、このような MONITOR/MWAIT を使用するとパフォーマンスが大幅に低下することです (設計上の欠陥がない限り、たとえばスピンロックの使用)。ミューテックスを使用する必要がある場合)。

HLTまたはMWAITを使用する他の理由(スケジューラとロック/同期以外)は考えられません。

于 2012-11-20T02:37:24.733 に答える
10

HLT 命令は、個々のスレッドで利用可能な最も浅いアイドル電力状態 (C-State) を実装しますが、MWAIT 命令では、利用可能なすべてのアイドル電力状態とサブ状態を要求できます。

ハードウェア レベルでは、HLT を実行することは、状態ヒント 0 で MWAIT を実行することと同じです。これにより、プロセッサは C1 状態になり、コアのクロック ゲーティングになります。コアをパワー ゲーティングし、潜在的にパッケージをパワー ゲーティングするために、より深い C ステートに入りたい場合は、MWAIT を使用する必要があります。

さまざまな電源状態の省電力と終了待ち時間の間には、常にトレードオフがあります。C-State が深いほど、電力を節約できますが、C-State を終了するのに時間がかかります。また、最新の x86 プロセッサは、割り込みの頻度に基づいて電源状態の深さを制限することに注意してください (つまり、1 秒ごとにブレーク イベントを受信して​​いる場合、ハードウェアは 2 秒の終了で C 状態に入ろうとしません)。レイテンシ)。

ハードウェアが C ステートに入ることを禁止することに加えて、一部の C ステートは、スレッド間の調整によってのみ入ることができます。たとえば、ハイパー スレッディングを備えた Intel x86 プロセッサでは、コア レベルでパワー ゲーティングを行うには、コア内の両方のスレッドがパワー ゲーティング C ステートを要求する必要があり、同様に、パッケージ内のすべてのコアがパッケージを要求する必要があります。パッケージ レベルで発生するパワー ゲーティング用の level power-gated C-State。ハードウェアは通常、最も浅い要求に従います。そのため、あるスレッドが C1 を要求し、別のスレッドが C3 を要求した場合、プロセッサは C1 に入ります。

オペレーティング システムを制御していない場合、それは実際には議論の余地があります (MWAIT は CPL0 でのみ使用できるため)。オペレーティング システムを「所有」している場合は、ほとんどの場合、HLT の代わりに MWAIT を使用するのが理にかなっています。これは、多くの場合、大幅に電力を節約し、HLT と同じアイドル状態の電力状態にアクセスできるためです。

于 2013-08-08T16:20:20.800 に答える