私はこれに関するmovntdqaの指示を読んだことがあるが、キャッシュを汚染しないようにメモリ範囲をキャッシュ不可能に表現するか、データを読み取るクリーンな方法を考え出した。 gccからこれをやりたい私の主な目標は、大きな配列のランダムな場所にスワップすることです。ごくわずかなデータが残っているため、キャッシングを回避してこの操作を高速化することを望んでいます。x86プラットフォームでgccを使用してメモリ範囲をuncacheableとして宣言するにはどうすればよいですか?
答えて
私はあなたの説明が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)と、コードのメモリパフォーマンスを向上させるためのその他の方法があります。
すべての良いアドバイスはuser786653です。特にUlrich Drepperの記事。私は追加します:
非キャッシュか、VM HWは、限られた容量を持つTLB、中のページの情報を検索しているつもりです。 TLBスラッシングのランダムアクセスパフォーマンスへの影響を過小評価しないでください。もしあなたがまだいないのであれば、実際にhuge pagesをあなたの配列データに使用したいのはなぜかthe results hereを参照してください。これは4Kのデフォルト( "640Kは誰にでも十分であるはずです"もちろん、2MBのページでいっぱいになったTLBよりも大きな巨大な配列を参照している場合でも、これは役に立ちません。
「nt」命令に対して何が得られましたか(例:
_mm_stream_ps
組み込み)?私はuncachedのページを宣言することは、それらを適切に使用するよりも優れたパフォーマンスを得ることは確信できず、代わりに使用する方がはるかに簡単です。しかし、反対の証拠を見ることに非常に興味があります。
- 1. 入力範囲を使用してbackgound-imageを変更するにはどうすればよいですか?
- 2. .ASPXファイルでC#オブジェクトを宣言して使用するにはどうすればよいですか?
- 3. F#:パラメータでByRefセマンティクスを宣言して使用するにはどうすればよいですか?
- 4. 宣言型SQLAlchemyを使用してコンパウンド列を作成するにはどうすればよいですか?
- 5. Linuxはx86-64で512GBを超える仮想アドレス範囲をどのようにサポートしていますか?
- 6. アセンブリコードをプログラムに接頭辞としてGCCを使用するにはどうすればよいですか?
- 7. SpringとRabbitMQでは、どのようにしてキューを宣言して使用するのですか?
- 8. 関数を関数ポインタとしてcで宣言するにはどうすればよいですか?
- 9. Pythonで変数をファイルとして宣言するにはどうすればよいですか?
- 10. .txtファイルを文字列として宣言するにはどうすればよいですか?
- 11. TFieldをnullableとして宣言するにはどうすればよいですか?
- 12. サブクラスで宣言せずにコンストラクタを使用できるように、コンストラクタを基底クラスで宣言するにはどうすればよいですか?
- 13. HTMLフラグメント(デリゲートとして)を宣言型Razorヘルパーに渡すにはどうすればよいですか?
- 14. Windowsプラットフォームを使用してキオスクを構築するにはどうすればよいですか?
- 15. VSコード(Windowsプラットフォーム)を使用してコンソールアプリケーションをコンパイルするにはどうすればよいですか?
- 16. フラグメントをXMLレイアウトで非表示として宣言するにはどうすればいいですか
- 17. TypeScriptで型をnullableとして宣言するにはどうすればいいですか?
- 18. C#とOleDBを使用してExcelを読み込む - 使用範囲を特定するにはどうすればよいですか?
- 19. 関数宣言でC++のmem_fn(member_function)を宣言するにはどうすればよいですか?
- 20. Gnuplotの(自動)範囲値にアクセスして余白を追加するにはどうすればよいですか?標準のplotコマンドを使用して
- 21. 範囲内に宣言されていないリスト
- 22. クラスをクラス内で宣言して後で定義するにはどうすればいいですか?
- 23. C++では、クラスによって使用される配列をどのように宣言しますか?
- 24. Epplusを使用して修正されたExcelの実際の使用範囲を取得するにはどうすればよいですか?
- 25. Javascriptを使用して、日付範囲が有効であることを確認するにはどうすればよいですか?
- 26. html5入力範囲のスライダ垂直に対してCSSを使用してのみカスタマイズするにはどうすればよいですか?
- 27. アセンブリ言語を使用してtasmプログラムでスネークゲームを行うにはどうすればよいですか?
- 28. PHP PDOを使用してメモリ内SQLiteデータベースを削除するにはどうすればよいですか?
- 29. グループ化句を使用するときに日付範囲が重複しないようにするにはどうすればよいですか?
- 30. Androidプラットフォームでプラットフォーム固有のスタイリングを使用するにはどうすればよいですか?
これはWindowsでの方法です。私はLinux上のGCCについて確かではない。しかし、私は読み込み可能なメモリをuncachableとして宣言したいとは思っていません。キャッシュを汚染することはありませんが、アクセスごとに完全なメモリレイテンシを支払っている可能性があります。 – Mysticial
私はそれがパフォーマンスを改善しないかもしれないことに同意します。しかし、私はこの機能の使い方を知ってうれしいです。 – Sandeep
cpuキャッシュを無効にする方法はありません。あなたはこれからも望みません、それはひどく遅くなります。キャッシュされていないメモリの読み取りには、100サイクル以上かかることがあります。 –