2015-12-23 9 views
7

私は、CPUキャッシュを無効にすると、パフォーマンスを向上させることができることをウィキペディアで読む:特定のメモリ領域でCPUキャッシュを無効にする方法はありますか?

いくつかのメモリをマークすることはほとんど再アクセスされていないメモリ領域のキャッシングを回避することにより、パフォーマンスを向上させることができますキャッシュ不可能としての範囲です。

私はLinuxでcでそれを行う方法を探ったとき、私は何も見つかりませんでした。私は本当にこの機能が必要なわけではありませんが、とにかく興味があります。

この最適化を使用するプロジェクトについてご存知ですか?

編集:私は非キャッシングについてコメントx86_64の

+0

これはプラットフォームによって大きく異なります。どんなプラットフォームでプログラミングしていますか? – fuz

+1

あなたの質問はここに答えているようです http://stackoverflow.com/questions/9544094/c-working-with-the-cpu-cache – Abstraction

+0

@Abstraction答えはWindowsに関係しますが、OPはLinuxを使用しています。また、間違った言葉。 – fuz

答えて

6

ためのプログラミングすることは、それが意味だと思うものを意味するものではありませんよ、それが使用される場合、それは通常、ユーザーがアクセス可能な機能ではありません。つまり、通常、CPUキャッシュ制御は特権操作です。通常のユーザプログラムは、コンパイラは、グループに利用する方法で機能をローダーに伝えるようにする属性が「熱い」または「冷たい」あるい機能を構築することができます - と...

キャッシュは最も便利です。

- 通常のプログラムでは、linuxのmadvise()関数を使用して、直前に使用したメモリがすぐに再び使用される可能性があるなど、さまざまなことをページング関数に伝えることができます。

- カーネル自体は、後のカーネルでMemory Type Range Regesters(mtrr)とPage Attribute Table(pat)フラグを使用して、メモリの特定の範囲(メモリマップ表示バッファ、 PCIバスのさまざまな部分)はキャッシュされません。

任意のCプログラムで使用する可能性の高い「Normal Data™」は、本質的にはには、キャッシュに値するデータをマーキングすることはありません。キャッシュされていないデータが享受するパフォーマンスの向上は、メモリマッピングされたデバイスとディスプレイバッファがほぼ常に必要とする、さまざまなキャッシュフラッシュおよびメモリバリア動作のその後の不在である。たとえば、メモリマップされたデバイス上にキャッシュを置くと、すべての読み取りの前にキャッシュ無効化コマンドが必要になり、読み取りと書き込みが必要なときに確実に行われるように、1回の書き込みのたびにキャッシュ強制書き込みコマンドが必要になります。これは、キャッシュ・ラインを物理的に制限された資源(キャッシュ・ライン)を捨て、即座に破棄し、最も役に立たず、役に立たない方法で、キャッシュの使用を "害する"でしょう。

LinuxのシステムにXディスプレイサーバーの一部を書き込んだ場合など、これらのキャッシュの有害な領域の1つにアクセスするプログラムを作成することはまれですが、カーネルはすでにレジスタを設定していますデバイスのために非キャッシュの動作はあなたに透過的になります。

さまざまなmadvise()タイプの使用を超えて、変数をキャッシュに有害なものとしてマークする能力が、通常のアプリケーショングレードのプログラムで有効になる時期はありません。

の利益は非常にまれであるため、1つにしっかりと実行すると、問題のセットには研究の一部として必要性と方法論が含まれていて、どのように、なぜこのような明示的な質問をする必要がなかったのかが伝えられました。

同じ例に戻って、必要なドライバを作成していた場合は、ディスプレイアダプタのハードウェアまたはPCIバスを読み上げていたときに、さまざまなフラグとテクニックが文書化され、議論されていましたハードウェアガイドを参照してください。

インテルプラットフォーム上のCLCLEAR命令のようなものでユーザー空間からキャッシュの排出などを引き出す方法があります。これらの技術はではなく、は一般的なパフォーマンスを改善します。それは、Linuxシステム上の特権操作がありますので

、あなたは取得し、キャッシュ不可能としてメモリ領域をマークし、その後、あなたのアプリケーションにマップさせ、カーネルドライバを書くことができます。しかし、そのような地域の必要性は非常に稀であり、誤用される可能性が高いため、適切な方法でそれを行うための通常の方法論は存在しません。

だからあなたはどのようにしていますか?あなたは、少なくともあなたが今日いるあなたではありません。マルチスレッドコードとデータ同期の問題に関する親密な専門知識を持つカーネルドライバーのライターになると、その方法を知ることができます。その時点で、なぜあなたが最後の手段。

TL :: DR :: Linuxはデータとコードを使用し管理するため、通常のアプリケーションのどの部分にも保存不可能ではない致命的ではないとマークする利点はありません。したがって、これを行うための特権のないAPIはありません。

P.S.また、誰かがすでにこの記事につながっていることを指摘していますhttp://lwn.net/Articles/255364/あなたのプログラムを非常にキャッシュフレンドリにする方法と、いくつかのキャッシュバイパス操作を非常に安価に行う方法のいくつかを説明しています。例えば、memset()の使用は、メモリの設定中にキャッシュを回る傾向があります。また、いくつかの操作では、キャッシュを「通過させる」ことができます。これはあなたが求めるものと同じではありませんが、その記事のすべてを理解すれば、メモリの領域を通常はキャッシュできないようにするのはなぜですか、ジェダイが言うように、あなたは解決策ではありません探している。

0

最近、私はキャッシュ重いマルチスレッドアプリケーションでキャッシュされていないメモリを試す必要がありました。

これは、キャッシュされていないメモリをユーザー空間にマップすることを可能にするkernel moduleを思いついたものです。

ユーザプロセスは、モジュールの文字デバイスでmmap()を呼び出すことで、キャッシュされていないメモリを要求します(デモのテストディレクトリを参照)。

What every programmer should know about memory実際に読む必要があります!

関連する問題