2016-07-15 11 views
0

私は読書はほとんどしないが、RAMにはたくさんの書き込みをする機能を持っている。同じコア(メインスレッド)で複数回実行すると、実行ごとに新しいスレッドで関数を起動した場合(同じコアが実行間で使用されることを保証しない)よりも約5倍高速に実行されます。私はランを走らせ、走り合う。メモリに書き込むときのキャッシュの役割は何ですか?

これは、キャッシュが書き込みプロセスで頻繁に使用されていることを示していますが、わかりません。キャッシュは読み込みにのみ役立つと思いました。

+1

書き込みバッファに部分的なキャッシュラインへの書き込みを飽和させると、キャッシュラインがメモリから取り込まれるまでストールします。非一時ストアを使用したり、常にフルキャッシュラインを書き込んだりすることで、これを避けることができます。 – EOF

+0

それは私にとって、* EOF *に値すると聞こえます... "非一時的な店"などとはどういう意味ですか?あなたはここで言うことがたくさんあるように聞こえます。 **: - )** –

答えて

0

最近のプロセッサには、通常、書き込みバッファがあります。その理由は、書き込みは、最初の概算では、純粋なシンクであるということです。プロセッサは、ストアが次の命令を実行する前にコヒレントメモリ階層に到達するのを通常待つ必要はありません。

(別名:ではなく、純粋なシンクであることが明らかです。)書き込まれたメモリ位置から後で読み出すと書き込み値が返されるため、プロセッサは書き込みバッファをスヌーピングして読み込みを停止するか、

明らかに、そのようなバッファは有限のサイズであるため、バッファがいっぱいになると、プログラム内の次のストアは実行できず、バッファ内のスロットが古い店舗は建築的に見えるようになりました。

通常、書き込みがバッファに書き込まれるのは、値がキャッシュに書き込まれるときです(多くの書き込みがであるため、実際はが実際にすぐに再び読み込まれるため、プログラムスタックを例として考えてください)。書き込みのみがキャッシュラインの一部を設定する場合、残りのキャッシュラインは変更されないままでなければならないため、結果としてメモリ階層からロードする必要があります。



は、非一時的な店のように、古いキャッシュラインをロードしないようライトコンバインメモリやキャッシュラインゼロ化の指示をするための方法があります。

非一時ストアと書き込み結合メモリは、キャッシュライン全体を埋めるために隣接書き込みを結合し、新しいキャッシュラインをメモリ階層に送り、古いキャッシュラインを置き換えます。

POWERには、完全なキャッシュライン()をゼロにする命令があり、メモリから古い値をロードする必要もなくなります。 AVX512と

のx86は(私はそれがないかどうかわからないが)整列zmm -registerストア古いキャッシュラインをロード避けることができることを示唆している、キャッシュラインサイズのレジスタがあります。

これらの手法の多くは、それぞれのプロセッサアーキテクチャの通常のメモリ順序付けと一致しないことに注意してください。それらを使用すると、マルチスレッド操作で追加のフェンス/バリアが必要になることがあります。

関連する問題