2017-11-21 8 views
6

この質問はです。具体的には、は、現代のx86-64キャッシュコヒーレントアーキテクチャーを対象としています。答えは他のCPUで異なる可能性があります。具体的には、x86キャッシュ行をdirtyとマークするものは何ですか?

メモリに書き込む場合、MESIプロトコルでは、キャッシュラインが最初にキャッシュに読み込まれ、次にキャッシュ内で変更される必要があります(値はダーティとマークされたキャッシュラインに書き込まれます)。古い書込み型マイクロアーキテクチャでは、これによりキャッシュラインがフラッシュされ、ライトバック中にキャッシュラインがフラッシュされてしまい、しばらくの間遅延することがあり、両方のメカニズムでライト結合が発生する可能性があります。そして私はこれが他のコアと同じキャッシュラインのデータキャッシュ・スヌーピングにアクセスする方法を知っています。

私の質問は、ストアがキャッシュ内の値と正確に一致すれば、どのインテルマイクロアーキテクチャーがこれに気付き、NOT行をダーティとマークして、行を排他的とマークしないようにし、ある時点でのライトバックメモリオーバーヘッドを保存しますか?

ベクタライズされた演算構成プリミティブは値の変更を明示的にチェックしていないため、CPU/ALUでは無駄に思えますが、基本的なキャッシュ回路ができるかどうかは疑問でした明示的なコーディング(例えば、店舗マイクロオペレーションまたはキャッシュロジック自体)を必要としない。複数のコアにわたる共有メモリの帯域幅がリソースのボトルネックになるほど、これはますます有用な最適化のように思えます(たとえば、同じメモリバッファを繰り返しゼロにするなど)。キャッシュ内で、同じ値の書き戻しを強制するのは無駄に思われます)。ライトバックキャッシングは、それ自体がこのような問題を認識しています。

"理論的に"または "それは本当に問題ではない"答えを丁寧に要求することができますか - 私はメモリモデルの仕組みを知っています、私が探しているのは、ストアを回避するのとは対照的に)メモリバスの競合に影響を与えます。メモリバスの競合には、メモリ帯域幅によってほぼ決まる複数のワークロードを実行しているマシンが安全に想定されます。一方のチップはこれをしない理由は、正確な理由の説明(私は悲観的にそうではないと仮定していますが)啓発だろう...

アップデート:ここで予想線に沿っていくつかの答えhttps://softwareengineering.stackexchange.com/questions/302705/are-there-cpus-that-perform-this-possible-l1-cache-write-optimizationしかし、まだまだひどい推測である "それは完了していないので難しいだろう"と言って、メインのCPUコアでこれを行うのは高価かもしれないと言っている(しかし、私はまだそれが実際のキャッシュロジック自体)。現在、のx86の無実装

+0

https://softwareengineering.stackexchange.com/questions/302705/are-there-cpus-that-perform-this-possible-l1-cache-write-optimizationの回答は、特に現在受け入れ中のものですキャッシュ/ CPUレジスタの理解が不足しています。 –

答えて

4

(または任意の他のISAは、私の知る限りでは)サイレントストアの最適化をサポートしています。

これに関する学術的研究があり、「共有メモリキャッシュコヒーレンシプロトコルにおけるサイレントストア無効伝播の除去」に関する特許も存在します。

の場合、これはMONITOR/MWAITの妨げになります。一部のユーザーは、監視スレッドがサイレントストアで目を覚ますことを望むかもしれません(無効化を回避し、「接触」コヒーレンスメッセージを追加することができます)。 (現在、MONITOR/MWAITは特権がありますが、将来変更される可能性があります)。

同様に、トランザクションメモリの賢明な使用を妨げる可能性があります。メモリロケーションが他のメモリロケーションの明示的なロードを避けるためのガードとして使用されている場合、またはサポートされているアーキテクチャ(AMDのアドバンストシンクロナイゼーションファシリティなど)では、リードセットからガードされたメモリロケーションを削除します。

(ハードウェアロックエリジオンはサイレントABAストアの除去の非常に制約の実装です。これは、値の整合性のチェックを明示的に要求された実装の利点を持っている。)

は、パフォーマンスへの影響の面でも、実装上の問題があります/設計の複雑さ。キャッシュラインがすでに共有状態になっているときにのみサイレントストアの削除がアクティブであった場合を除き、所有権の読み取りを避けることは禁止されていますが、現在は所有権の読み取りの回避も実装されていません。

サイレントストアの特別な処理は、メモリ整合性モデル(おそらく特にx86の比較的強力なモデル)の実装も複雑にします。これはまた、一貫性を失った推測のロールバックの頻度を増加させる可能性があります。サイレントストアがL1-現在の回線に対してのみサポートされている場合、時間ウィンドウは非常に小さくなり、ロールバックは極端にです。 L3またはメモリ内のキャッシュラインにストアすると、頻度が非常に低くなる可能性があります。そのため、目立つ問題が発生する可能性があります。

キャッシュラインの細かさでの無音も、アクセスレベルでの無音よりも少なくなります。したがって、回避される無効化の回数は少なくなります。

追加のキャッシュ帯域幅も問題になります。現在のところ、インテルはL1キャッシュのみでパリティを使用しているため、小規模の書き込みでリード・モディファイ・ライトを行う必要はありません。 書き込みごとに、サイレントストアを検出するための読み取りが必要な場合は、明白なパフォーマンスと電力の関係があります。 (このような読み込み は、共有キャッシュラインに限定され、キャッシュアクセスを完全に利用することなくサイクルを利用して、機会を利用して実行されますが、それでも電力コストが発生します)。 L1 ECCをサポートするためにすでに存在していました(この機能は一部のユーザーにはお勧めです)。

サイレントストアの削除時によく読まれないので、おそらく他の問題(および回避策)があります。

取られたパフォーマンス向上のための低ぶら下げ果物の多くでは、あまり有益な、より困難、とあまり一般的な最適化は、より魅力的になります。サイレントストアの最適化は、より高いコア間通信でより重要になり、より多くのコアを使用して単一のタスクを処理すると、コア間通信が増加するため、その価値は増加する可能性があります。

+0

あなたの答えを教えてくれてありがとうございました。しかし、私は、「インテルはすべての書き込みに読んでみる必要はありません」と私が理解していないことを暗示しています。キャッシュ不可能なメモリと非一時的な書き込みを除いて(どちらもこのようなものを除外します)、すべての書き込みで値がキャッシュに入る必要があるため、キャッシュラインがまだ存在していない場合は強制的に読み出します。 – Tim

+1

@Timオーナーシップの回避も同様の学術的提案です。とりわけ、有効性/汚れを細かく細かく追跡する必要があります。タグECCはデータECCよりもあまり一般的ではありません(「ああ、こんにちはタグでもう少しビットを費やす必要があります!」)、より細かい粒度の妥当性(コヒーレンスの複雑さも増す)をサポートすることは迅速に採用される最適化ではありません。 –

+0

@Tim - IntelがL1キャッシュからコア/ストアバッファへの読み込みを必要としないことをPaulが明示していたことを私が理解していれば、そのバイトはL1に格納することができますプレゼント)。エラー訂正コードを再計算するためにストアに隣接する値が必要なため、通常はL1がECCで保護されている場合は読み取りが必要なため、ECCが言及されています。 Intelは、代わりに、隣接バイトを必要とせずに更新できるより簡単なエラーチェックメカニズム(パリティ)を使用することをPaulに示しています。 – BeeOnRope

3

ハードウェアで実装することは可能ですが、私は誰もそう思わないと思います。すべての店舗でそれを行うと、キャッシュ読み取り帯域幅が必要になるか、余分な読み取りポートが必要になり、パイプライン処理が難しくなります。

書込みだけでなく、読み取り/比較/書き込みサイクルを実行し、条件付きで行をModified(MESI)ではなくExclusive状態にすることができるキャッシュを構築します。このようにすると(それがまだ共有されている間にチェックするのではなく)、行の他のコピーは無効になりますが、それはメモリの順序付けとのやりとりがないことを意味します。キャッシュラインの排他的所有権を持っている間に(サイレント)ストアはグローバルに表示され、DRAMに書き戻しを行うことによって、ModifiedにフリップしてからExclusiveに戻った場合と同じようになります。

読み取り/書き込み/比較(あなたは、読み取りと書き込みの間にキャッシュラインを失うことができない、それが起こった場合の比較結果が古くなります)アトミックに行う必要があります。これにより、ストアキューからL1Dにコミットするデータをパイプライン化することが難しくなります。マルチスレッドプログラムで


、それが唯一の共有変数のためのソフトウェアに最適化としてこれをやって価値があることができます。皆のキャッシュを無効にする回避

は、私は、メモリ・オーダリングの影響がここにあるかどうかわからない

if(shared != x) 
    shared = x; 

shared = x; 

を変換することが価値が作ることができます。明らかにshared = xが起こらない場合は、リリースシーケンスがないため、リリースではなくセマンティクスを取得するだけです。しかし、あなたが保管している価値が既にそこにあるものである場合、他のものを注文するためにそれを使用すると、ABAの問題が生じます。

IIRC、Herb Sutterは、atomic Weapons: The C++ Memory Model and Modern Hardwareトークのパート1または2のこの潜在的最適化について言及しています。

これは、共有変数以外のソフトウェアではあまりにも高価すぎるため、書き込みコストは他のスレッド(キャッシュミスやメモリオーダーミスヒット)の多くのサイクルであり、投機マシンはクリアされます:What are the latency and throughput costs of producer-consumer sharing of a memory location between hyper-siblings versus non-hyper siblings?


関連:なぜ、シングルスレッドのための「レイテンシーバインドプラットフォーム」特にNT対非NT店のもの、一般にx86のメモリ帯域幅の詳細についてthis answerを参照してください、と多数のコアからの総帯域幅がより高いにもかかわらず、多くのコアのXeonのメモリ帯域幅は、クアッドコアよりも低くなります。

+0

おかげで(https://en.wikipedia.org/wiki/ Static_random-access_memory#1 SRAM_operation)ドライバは、書き込みが読み出しに匹敵する状態()を変更した場合に検出することができ書き込み、これらの値と現在のダーティフラグの簡単なOR INGを次にダーティビットに書き込まれることになる、潜在的に回避するようにあなたが注意するように、これは価値があるためにはあまりにも高価に見えます..今のところ.. – Tim

+1

@Tim:ええ、私はそれがあなたが求めていたものだと思っていました。キャッシュがパイプラインであり、1クロックあたり1つの書き込みをサポートしていることを覚えている限り、それは簡単で良いと思われます。最新のインテルCPUでは、キャッシュラインの境界を越えない限り、アライメントの合っていない書き込み(32B AVXベクトルを含む)にはペナルティがありません。したがって、マルチサイクル操作は後続のストアから重複して乱雑になります。 (https://stackoverflow.com/questions/36932240/avx2-what-is-the-most-efficient-way-to-pack-left-based-on-a-maskようないくつかのALGOSは、効率的な重複記憶に依存します) –

+0

オーバーラップしたストアのみが問題だった場合、ストアキュー(メモリオーダーバッファ)にスマートなマージを作成できますが、それでもアトミック/メモリの順序付けを妨げる可能性があります。 Paul Claytonもこの質問に答えました。彼は私が考えていなかったことを指摘し、一般的にx86以外のCPUアーキテクチャのことについてよく知っています。私はCPUアーキテクチャーの学術研究やディスカッションフォーラムに定期的に従っていないため、文献の「サイレントストア」という名前は知らなかった。 (ただ、x86の内部/最適化のもの。)他のキャッシュを無効にする必要はありません –

関連する問題