私はこれに関する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. リストの値を範囲として使用するにはどうすればよいですか?
- 2. TypeScriptを使用してAngular 2コンポーネントでモデルクラスを宣言するにはどうすればよいですか?
- 3. .ASPXファイルでC#オブジェクトを宣言して使用するにはどうすればよいですか?
- 4. F#:パラメータでByRefセマンティクスを宣言して使用するにはどうすればよいですか?
- 5. 入力範囲を使用してbackgound-imageを変更するにはどうすればよいですか?
- 6. MpAndroidChartの値を使用してビューポート範囲を設定するにはどうすればよいですか?
- 7. autoを使用してvoidポインタを宣言するにはどうすればよいですか?
- 8. 宣言型SQLAlchemyを使用してコンパウンド列を作成するにはどうすればよいですか?
- 9. アセンブリコードをプログラムに接頭辞としてGCCを使用するにはどうすればよいですか?
- 10. VBAで一致範囲を変数として設定するにはどうすればよいですか?
- 11. CodeIgniterを使用してブラウザとプラットフォーム情報を取得するにはどうすればよいですか?
- 12. x86上でgccを使用してメモリを注文する方法
- 13. 配列宣言を使用して 'var'で宣言されたファイルスコープ変数にアクセスするにはどうすればよいですか?
- 14. SpringとRabbitMQでは、どのようにしてキューを宣言して使用するのですか?
- 15. typescriptで配列をpublicとして宣言するにはどうすればよいですか?
- 16. 関数を関数ポインタとしてcで宣言するにはどうすればよいですか?
- 17. Pythonで変数をファイルとして宣言するにはどうすればよいですか?
- 18. VBAで複数のセル/範囲を宣言/定義して同時に選択するにはどうすればよいですか?
- 19. Linuxはx86-64で512GBを超える仮想アドレス範囲をどのようにサポートしていますか?
- 20. VBA Excelで定義した範囲名を使用するにはどうすればよいですか?
- 21. 関数宣言でTrue&Falseを正しく使用するにはどうすればよいですか?
- 22. ワークシートと範囲を変数として渡すにはどうすればよいですか?
- 23. サブクラスで宣言せずにコンストラクタを使用できるように、コンストラクタを基底クラスで宣言するにはどうすればよいですか?
- 24. .txtファイルを文字列として宣言するにはどうすればよいですか?
- 25. テキストファイルの行を変数として宣言するにはどうすればよいですか?
- 26. NSAttributedStringKey.fontをカスタムフォントとして宣言するにはどうすればよいですか?
- 27. TFieldをnullableとして宣言するにはどうすればよいですか?
- 28. メンバーテンプレートクラスを囲むクラスの友人と宣言するにはどうすればよいですか?
- 29. クラスレベルでオブジェクトを宣言してインテントデータを取得するにはどうすればよいですか?
- 30. サブルーチンでサイズを変更して配列を宣言するにはどうすればよいですか?
これはWindowsでの方法です。私はLinux上のGCCについて確かではない。しかし、私は読み込み可能なメモリをuncachableとして宣言したいとは思っていません。キャッシュを汚染することはありませんが、アクセスごとに完全なメモリレイテンシを支払っている可能性があります。 – Mysticial
私はそれがパフォーマンスを改善しないかもしれないことに同意します。しかし、私はこの機能の使い方を知ってうれしいです。 – Sandeep
cpuキャッシュを無効にする方法はありません。あなたはこれからも望みません、それはひどく遅くなります。キャッシュされていないメモリの読み取りには、100サイクル以上かかることがあります。 –