2012-01-13 5 views
6

CPUキャッシュに静的オブジェクトを明示的に作成することは可能ですか?それらのオブジェクトが常にキャッシュに残っていることを確認して、RAMまたはgod forbid-hdd仮想メモリに至るまでのパフォーマンスのヒットはありませんか?c/C++のCPUキャッシュにスタティックメモリを割り当てる:可能ですか?

L1、L2、命令、またはその他のキャッシュを対象としない、大規模なL3共有キャッシュを対象としています。

私はこの記事を投稿する前に検索した他のスレッドとは区別して明確にするために、キャッシュ全体の民営化に興味はありません。

+2

あなたができることは、GCCの[__builtin_prefetchマクロ](http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Other-Builtins.html)を使うことです。 IIRCキャッシュはコードによってアドレス可能ではないため、CPUはそれ自身を管理します(少なくともx86では)。 –

+1

どのようなプロセッサですか?アーキテクチャによっては、データが必要となる前にキャッシュ・ヒントを与える方法やキャッシュ・プリフェッチを指示する方法があります。 – TJD

+1

短いanwer:あなたは傾けることはできません。あなたが行うことができる唯一のことは、参照の場所を緊密に保つことです。メモリ内を行き来するのではなく、前の操作でアクセスされたデータに近いデータにアクセスしてください。また、データをキャッシュ境界に整列させておくと、別のキャッシュフェッチを避けることができます。 BTWキャッシュ*スロット*は連続している必要はありません。 x86では、IIRCには4つのL1スロットと数百または数千のL2スロットがあります。 (マルチプロセスマシン上の他のプロセスと共有する必要があります)。 – wildplasser

答えて

12

いいえ。キャッシュにはアドレス指定できないため、キャッシュにオブジェクトを割り当てることはできません。

質問すると、次のようになります。仮想メモリに領域が割り当てられているため、常にキャッシュヒットを得ることができますか?

これはより複雑な質問です。答えは部分的です。

OSのメモリ管理API(例:mlock())を使用して、領域をページング不可としてマークすることで、ディスクにスワップアウトされるのを避けることができます。または、「非ページプール」から割り当てを開始します。

CPUキャッシュにメモリを固定する同様のAPIはないと思います。たとえそのブロックのCPUキャッシュを確保できたとしても、キャッシュミスを避けることはできません。別のコアがメモリに書き込むと、所有権が転送され、キャッシュミスや関連するバス転送(おそらくメインメモリ、おそらくは他のコアのキャッシュ)に苦しみます。

Mathewがコメントで述べたように、キャッシュミスを他の有用な作業とパイプラインで同時に発生させることで、必要に応じてデータをキャッシュに入れることもできます。

1

データをループして別のスレッドを実行し、L3キャッシュに取り込むことができます。

関連する問題