秩序障害の実行とメモリフェンス
-
27-10-2019 - |
質問
私は、現代のCPUが故障して実行できることを知っていますが、ウィキペディアが説明したように、常に結果を注文して引退します。
「Out of Oderプロセッサは、準備ができている他の指示でこれらの「スロット」を時間内に埋めます。 次に、最後に結果を再注文して、指示が通常どおりに処理されたように見えるようにします。"
マルチコアプラットフォームを使用するときはメモリフェンスが必要であると言われています。 バツ ここで印刷できます。
Processor #1:
while f == 0
;
print x; // x might not be 42 here
Processor #2:
x = 42;
// Memory fence required here
f = 1
今、私の質問は、順序のないプロセッサ(マルチコアプロセッサの場合、私が想定しているコア)が常に順序で結果を引退させているため、メモリフェンスの必要性は何ですか。マルチコアプロセッサのコアでは、結果が他のコアからのみ廃止された結果を見ないか、飛行中の結果も表示されませんか?
上記の例では、プロセッサ2が最終的に結果を引退するとき、 バツ 前に来るはずです f, 、 右?私は、故障した実行中にそれが変更されたかもしれないことを知っています f 前 バツ しかし、それは以前に引退したことがなかったに違いありません バツ, 、 右?
現在、結果の廃止とキャッシュコヒーレンスメカニズムの整備が整っているので、なぜx86でメモリフェンスが必要なのでしょうか?
解決
このチュートリアルでは、問題について説明します。 http://www.hpl.hp.com/techreports/compaq-dec/wrl-95-7.pdf
FWIWは、最新のX86プロセッサでメモリ順序付けの問題が発生しているため、X86メモリの一貫性モデルが非常に強力な一貫性を提供する一方で、読み取り後のライターの一貫性を処理するために明示的な障壁が必要であるためです。これは、「ストアバッファー」と呼ばれるものによるものです。
つまり、X86は、荷重が以前の店舗を並べ替えられる可能性があることを除いて、連続的に一貫性があります(見事で、推論が簡単です)。つまり、プロセッサがシーケンスを実行する場合です
store x
load y
その後、プロセッサバスでこれは
load y
store x
この動作の理由は、前述のストアバッファーです。これは、システムバスに出る前に書くための小さなバッファーです。荷重遅延は、otohであり、パフォーマンスにとって重要な問題であるため、「キューをジャンプ」するために負荷が許可されています。
セクション8.2 inを参照してください http://download.intel.com/design/processor/manuals/253668.pdf
他のヒント
メモリフェンスは、フェンスが他のすべてのコアに表示される前にすべての変数に変化することを保証し、すべてのコアにデータの最新ビューがあるようにします。
メモリフェンスを入れないと、コアは間違ったデータで動作している可能性があります。これは、特に複数のコアが同じデータセットで動作するシナリオで見ることができます。この場合、CPU 0が何らかのアクションを実行したときに、データセットに対して行われたすべての変更が他のすべてのコアに表示され、最新情報で動作できることを確認できます。
ユビキタスX86/X64を含むいくつかのアーキテクチャは、「フルフェンス」と呼ばれる場合がある命令を含むいくつかのメモリバリア命令を提供します。完全なフェンスは、フェンスの前にすべての荷重と保存の操作が、フェンスに続いて発行される荷重や店舗の前にコミットされることを保証します。
コアがデータセット上の時代遅れのデータの操作を開始した場合、どのようにして正しい結果を得ることができますか?すべてが正しい順序で行われた場合、最終結果が提示されるかどうかに関係なく、それはできません。
キーは、キャッシュとCPUの間にあるストアバッファーにあり、これを行います。
リモートCPUに見えないバッファーを保存します
ストアバッファーを使用すると、相互接続アクセスを最適化するためにメモリやキャッシュを保存することができます
つまり、物事はこのバッファーに書き込まれ、ある時点でバッファーがキャッシュに書き込まれます。したがって、キャッシュには最新のデータのビューが含まれている可能性があり、したがって別のCPUは、キャッシュコヒーレンシーを介して最新のデータもありません。最新のデータが表示されるためには、ストアバッファフラッシュが必要です。これは、本質的にメモリフェンスがハードウェアレベルで発生するものだと思います。
編集:
例として使用したコードについては、ウィキペディアは次のように述べています。
プロセッサ#2のFへの割り当ての前にメモリバリアを挿入して、Xの新しい値がFの値の変更または前に他のプロセッサに表示されるようにすることができます。
以前の答えで暗黙的なものを明示するために、これは正しいですが、メモリアクセスとは異なります。
cpusは故障して実行できますが、常に結果を秩序で引退させます
命令の退職は、メモリアクセスの実行とは別に、メモリアクセスは、指示の退職とは異なる時間に完了する場合があります。
各コアは、退職時に自分のメモリアクセスが発生するかのように機能しますが、他のコアは異なる時間にそれらのアクセスを見る場合があります。
(X86とARMでは、店舗のみがこれに対応すると思われますが、たとえば、Alphaはメモリから古い値をロードする場合があります。X86SSE2には、通常のX86の動作よりも弱いガレンティの指示があります)。
詩記憶から、放棄されたSparc Rockは実際には注文不足を廃止する可能性があり、これがいつ無害であるかを決定する電力とトランジスタを使用しました。消費電力とトランジスタカウントのために放棄されました...私は、CPUがオーダーの退職して販売するために購入された汎用目的を持っていないと思います。