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
は、キャッシュの一貫性に影響しません。後でストア/ロードを待機させることなく、書き戻し(&退去)をトリガするだけです。
メモリが割り当てられていて、別のスレッドによって使用されている可能性があります。
最初にキャッシュを退去させる目的は何ですか? –
@PasserBy、実際に次に使用されるデータでASAPが占有されるようにします。明示的に取り除かなくても、CPUは、古いデータが最も最近使用されなくなるまで(古いデータは使用されなくなる)、キャッシュ内の古いデータ(LRU)を保持します。キャッシュ内の他のデータ。 –
キャッシュ内のコンテンツが不要になったことが判明し、それを回避でき、高速化が可能である場合は、オプティマイザには含まれていませんか? –