2017-09-01 6 views
0

私はメモリを解放する前にCPUキャッシュからメモリ範囲を取り除いています。理想的には、これらのキャッシュラインをメモリに保存せずに放棄するだけです。誰もその値を使うつもりはなく、そのメモリ範囲(malloc()/new/_mm_malloc()などの後)を再度取得する人は、まず新しい値でメモリを埋めるでしょう。 this question suggestsとして、現在のx86_64で理想を達成する方法はないようです。_mm_clflushopt()の後に_mm_sfence()を発行しないと何が起こりますか?

したがって、私は_mm_clflushopt()をやっています。私が理解したように、_mm_clflushopt()の後には、他のコア/プロセッサに非一時的なストアを見せるために_mm_sfence()に電話する必要があります。しかし、この特定のケースでは、私はその店を必要としません。

_mm_sfence()に電話をしていないと、何か悪いことが起こりますか?例えば。他のコア/プロセッサがそのメモリ範囲を十分に素早く再割り当てして新しいデータで満たすことを開始すると、現在のコアによってフラッシュされる古いキャッシュによって新しいデータが同時に上書きされる可能性がありますか?

EDIT:すぐ後で割り当てられることは考えにくいですが、私はこのプログラムも正しい必要があるため、このケースについて説明しています。

+1

最初にキャッシュを退去させる目的は何ですか? –

+0

@PasserBy、実際に次に使用されるデータでASAPが占有されるようにします。明示的に取り除かなくても、CPUは、古いデータが最も最近使用されなくなるまで(古いデータは使用されなくなる)、キャッシュ内の古いデータ(LRU)を保持します。キャッシュ内の他のデータ。 –

+0

キャッシュ内のコンテンツが不要になったことが判明し、それを回避でき、高速化が可能である場合は、オプティマイザには含まれていませんか? –

答えて

1

clflushoptは、このユースケースではひどい考えです。上書きする前にキャッシュから行を消していくことは、あなたが望むものとは逆です。キャッシュが暑い場合は、RFO(所有権の読み取り)を避けます。

NTストアを使用している場合は、まだ熱い行はすべて削除されますので、最初にclflushoptを実行しています。

もしそうでない場合は、あなたは完全に最悪の場合を保証することで足に自分自身を撮影しています。メモリへの書き込み、およびRFOとRFO以外のストアについては、Enhanced REP MOVSB for memcpyを参照してください。 (例えば、rep movsbは少なくともインテルではRFOストアを実行できませんが、データをキャッシュに入れたままにしておきます)。また、L3ヒットはDRAMに行くよりも高速にRFOを満たすことができます。

通常の店舗(RFO)を使用してバッファを作成しようとしている場合は、prefetchwでL1Dの排他状態にすることができます。

それは特にMOESI cache coherencyが汚れて転送することができAMDに(より良いclwbは(キャッシュライン)が立ち退かせずに(バックライト)、ここで有用であろうが、私はprefetchwはいつもそのように、少なくともとして良いだろうと思いますが、そうでない場合はいる可能性がありますキャッシュ間のラインが残っているので、まだ汚れているL1Dにラインをつけて、古いデータをDRAMに送ることなくそのデータを置き換えることができます)。mallocは理想的です。現在のコアのL1Dキャッシュ。多くの時間を見つけたら、バッファがまだ汚れていて、別のコアのL1DやL2に入っている場合は、は、スレッドごとのプールやNUMAのようなスレッド認識でmallocを調べます。

私は理解されるように、_mm_clflushopt()後、私は他のコア/プロセッサにその非一時的記憶が見えるように_mm_sfence()を呼び出す必要があります。

いいえ、clflushoptは店舗ではありません。新しいデータをグローバルに表示するわけではないので、メモリ操作のグローバルな順序付けとはやり取りしません。

sfenceはなりフラッシュデータは、DRAMまたはメモリマップされた不揮発性ストレージにすべての方法をフラッシュされるまで、あなたのスレッドの後に店が待ちます。

通常のDRAMに裏打ちされた行をフラッシュする場合は、キャッシュをチェックせずにDRAMの内容を読み取る非コヒーレントなDMA操作を開始するストアの前にsfenceが必要です。他のCPUコアは常にをキャッシュするので、sfenceは役に立ちません。あなたは、実際のNT店を話していた場合であっても(clflushoptが最初の場所で良いアイデアだったとしても。)


、他のコアが最終的sfenceなしであなたの店が表示されます。彼らはあなたのNTストアがの前にの前にいくつかの後の店を見ることを確認する必要がある場合はsfenceが必要です。私はこれを説明しましたMake previous memory stores visible to subsequent memory loads

何か悪いことができますか?

いいえ、clflushoptは、キャッシュの一貫性に影響しません。後でストア/ロードを待機させることなく、書き戻し(&退去)をトリガするだけです。

メモリが割り当てられていて、別のスレッドによって使用されている可能性があります。

+0

すぐに割り当てられるべきことは他にありません。これは私のプログラムが正しいと疑わしい例ですから、その場合に何が起こるかを明確にする必要があります。 –

+1

@SergeRogatch:あるメモリを 'clflushopt'してすぐに解放すると、別のスレッドがmallocからメモリを取得し、メモリにフラッシュされたデータがある可能性があります。 (しかしおそらく 'free'はおそらく' clflushopt 'の障壁となるグローバルなフリーリストにメモリを追加するために 'lock'操作を使う必要があったからではないでしょう。)しかし、可能であってもそれは影響を与えません正しさ。保存したデータはまだそこにあります。割り当てられたメモリを別のスレッドが使用している間、 'clflushopt'することができます。 –

関連する問題