2011-09-14 4 views
10

私はこれに関するmovntdqaの指示を読んだことがあるが、キャッシュを汚染しないようにメモリ範囲をキャッシュ不可能に表現するか、データを読み取るクリーンな方法を考え出した。 gccからこれをやりたい私の主な目標は、大きな配列のランダムな場所にスワップすることです。ごくわずかなデータが残っているため、キャッシングを回避してこの操作を高速化することを望んでいます。x86プラットフォームでgccを使用してメモリ範囲をuncacheableとして宣言するにはどうすればよいですか?

+1

これはWindowsでの方法です。私はLinux上のGCCについて確かではない。しかし、私は読み込み可能なメモリをuncachableとして宣言したいとは思っていません。キャッシュを汚染することはありませんが、アクセスごとに完全なメモリレイテンシを支払っている可能性があります。 – Mysticial

+0

私はそれがパフォーマンスを改善しないかもしれないことに同意します。しかし、私はこの機能の使い方を知ってうれしいです。 – Sandeep

+1

cpuキャッシュを無効にする方法はありません。あなたはこれからも望みません、それはひどく遅くなります。キャッシュされていないメモリの読み取りには、100サイクル以上かかることがあります。 –

答えて

6

私はあなたの説明がMemory Type Range Registersだと思います。あなたは、例えば、/proc/mttr/ioctl(2)を使用して、Linuxの下でこれらを制御することができます(利用可能な場合はユーザ0)。hereを参照してください。 物理アドレスのアドレス範囲で動作するので、合理的な方法で使用するのは難しいと思います。

より良い方法は、コンパイラ組み込み関数GCC providesを見て、あなたの意図を表す1つ以上を見つけることです。 Ulrich Drepperの "すべてのプログラマがメモリについて知っておくべきこと"のシリーズ、特にpart 5を見て、キャッシュをバイパスすることに取り組んでください。 _mm_prefetch(ptr, _MM_HINT_NTA)があなたのニーズに適しているようです。

いつもパフォーマンスに関して - 測定、測定、測定。 Drepperのシリーズには、これをどのように行うことができるかを詳しく説明する優れたパーツ(part 7)と、コードのメモリパフォーマンスを向上させるためのその他の方法があります。

2

すべての良いアドバイスはuser786653です。特にUlrich Drepperの記事。私は追加します:

  • 非キャッシュか、VM HWは、限られた容量を持つTLB、中のページの情報を検索しているつもりです。 TLBスラッシングのランダムアクセスパフォーマンスへの影響を過小評価しないでください。もしあなたがまだいないのであれば、実際にhuge pagesをあなたの配列データに使用したいのはなぜかthe results hereを参照してください。これは4Kのデフォルト( "640Kは誰にでも十分であるはずです"もちろん、2MBのページでいっぱいになったTLBよりも大きな巨大な配列を参照している場合でも、これは役に立ちません。

  • 「nt」命令に対して何が得られましたか(例:_mm_stream_ps組み込み)?私はuncachedのページを宣言することは、それらを適切に使用するよりも優れたパフォーマンスを得ることは確信できず、代わりに使用する方がはるかに簡単です。しかし、反対の証拠を見ることに非常に興味があります。

関連する問題