2017-03-06 15 views
2

Linuxユーザ空間プログラムが所有するメモリページに対してcache write combiningを有効/無効にする合理的な方法はありますか?Linuxユーザー空間アプリで書き込み結合を有効にしますか?

重要な2つのターゲットシステム:3.0カーネルのインテルHaswellプロセッサー、4.8カーネルのIntel Skylakeプロセッサー。

大きなバッファを使用してプロデューサとコンシューマ間でデータを転送する、成熟したマルチスレッドアプリケーションを調整しています。プロファイリングに基づいて、ライトバックキャッシングではなく、書き込み結合キャッシングを使用してアプリケーションがバッファのページから恩恵を受けると信じる理由があります。

代わりに非一時的な書き込みを使用してバッファにデータを格納すると考えましたが、現在の努力よりも大きなコードリファクタリングが必要になります。

,this questionおよびthis LWN articleは、問題を議論するが、デバイスドライバの観点から論じている。私の場合、私は非rootとして実行しているuserspaceコードで作業しています。

This 2008 paperは、ページのキャッシュモードを制御するためのさまざまなAPIについて説明しています。ユーザー空間アプリケーションがmmap(5.3節、5.4節、5.6節参照)を使用してページへの書き込み結合アクセスを取得できることを示しているようですが、その仕組みを正確にどのように使用するかについてのドキュメントは明確ではありません。

+0

https://www.kernel.org/doc/ols/2008/ols2008v2-pages-135-144.pdfのセクション5.3 5.4は、PCIリソースへの '/ proc' /'/sys' fs経由のアクセス用です。 5.5と5.6は '/ dev/mem'で全てのコンピュータメモリにアクセスするためのものです。どちらもルートアクセスが必要で、 '/ dev/mem'への直接アクセスは安全ではありません。 'non-temporal writes'を使うようにしてください。少なくとも、コードの書き込みモードを変更することは何の利点もあります。インテルは、メモリ充填のハードウェア検出器を備えており、組み合わせモードを変更する可能性があります。http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual .pdf 3.6.10 7.4.1 – osgx

答えて

0

キャッシュ重いマルチスレッドアプリケーションでキャッシュされていないメモリを試す必要があるのと同じような要求が最近発生しました。

私はこのkernel moduleを思いついたので、ユーザー空間にキャッシュされていないメモリをマップすることができました。だからあなたが求めているものとは少し異なりますが、あなたの目標を達成するためにそれを微調整することができます。

それが呼び出してください:

  • set_memory_wc()代わりのset_memory_uc()
  • pgprot_writecombine()代わりのpgprot_uncached()

、あなたがライトコンバインメモリを取得する必要があります。

モジュールのキャラクタデバイス(デモ用のtestディレクトリを参照)をmmap()する必要があり、メモリータイプが固定されていますが、ioctlを追加してそれを切り替えるのは難しくありません。

私はまだ既存のユーザースペースページの属性を変更しようとしていませんでしたが、使用する方がはるかに良いでしょう!

関連する問題