7

シーケンシャル ユーザー空間プログラム (ある種のメモリ集約型検索データ構造) があります。プログラムのパフォーマンス (CPU サイクル数として測定) は、基礎となるデータ構造のメモリ レイアウトとデータ キャッシュ サイズ (LLC) によって異なります。

これまでのところ、ユーザー空間プログラムは完全に調整されていますが、ユーザー空間コードをカーネルに (カーネル モジュールとして) 移動することでパフォーマンスが向上するかどうか疑問に思っています。カーネル空間でのパフォーマンスを向上させる次の要因が考えられます...

  1. システム コールのオーバーヘッドはありません (システム コールごとに得られる CPU サイクル数)。プログラムの起動時にメモリを割り当てることを除いて、プログラムでシステムコールをほとんど使用していないため、これはそれほど重要ではありません。
  2. スケジューリングを制御することで、カーネル スレッドを作成し、捨てずに特定のコアで実行することができます。
  3. kmallocメモリ割り当てを使用できるため、割り当てられたメモリをより詳細に制御でき、割り当てられたメモリを制御することでキャッシュの色付けをより正確に制御できる場合もあります。試してみる価値はありますか?

カーネルの専門家への質問...

  • 上記のリストで、パフォーマンスをさらに向上させる要因を見落としていませんか?
  • 試してみる価値はありますか、それともパフォーマンスが大幅に向上しないことは明らかですか?
  • カーネルでパフォーマンスの向上が可能である場合、それがどれだけ向上できるかの推定値はありますか (理論上の推測)?

ありがとう。

4

2 に答える 2

7

ポイント1に関して:カーネルスレッドはまだプリエンプトされる可能性があるため、(そうではない)多くのsyscallを作成していない限り、これはあまり役に立ちません。

ポイント2に関してsched_setaffinity(): Linuxで使用して、アフィニティを設定することにより、特定のコアにスレッドを固定できます。

ポイント 3 について: どのような追加のコントロールを期待していますか? を使用して、ユーザー空間からページ整列メモリを割り当てることができますmmap()。これにより、キャッシュのセット結合性を制御できるようになり、インライン アセンブリまたはコンパイラの組み込み関数を手動プリフェッチ ヒントまたは非一時的な書き込みに使用できます。カーネルに割り当てられたメモリとユーザー空間に割り当てられたメモリの主な違いは、kmalloc()有線 (ページング不可) メモリを割り当てることです。これがどのように役立つかわかりません。

SIMD を使用した並列化、マルチスレッド化、またはアルゴリズムやメモリの最適化をさらに行うことで、はるかに優れた ROI が得られると思います。

于 2012-06-30T10:05:57.743 に答える
5

プログラム専用cpusetを作成し、他のすべてのプロセスをそこから移動します。次に、次のようなものを使用して、FIFO スケジューリング ポリシーでプロセスの優先度をリアルタイムに上げます。

struct sched_param schedparams;
// Be portable - don't just set priority to 99 :)
schedparams.sched_priority = sched_get_priority_max(SCHED_FIFO);
sched_setscheduler(0, SCHED_FIFO, &schedparams);

シングルコアシステムでそれをしないでください!

十分な大きさのスタック スペースを予約しalloca(3)て、割り当てられたすべてのスタック メモリにアクセスし、十分なヒープ スペースをマップしてから、プロセス メモリを確保するためにmlock(2)orを使用します。mlockall(2)

プログラムが順次プログラムであっても、マルチソケットの Nehalem または Nehalem 以降の Intel システム、または AMD64 システムで実行すると、NUMA の影響によりプログラムが遅くなる可能性があります。の API 関数を使用numa(3)して、プログラムが実行される NUMA ノードのできるだけ近くにメモリを割り当てて保持します。

他のコンパイラを試してみてください。現在使用しているコンパイラより最適化されているものもあります。たとえば、Intel のコンパイラは、順不同の実行、パイプライン処理、および分岐予測の恩恵を受けるために、命令のレイアウトに非常に積極的です。

于 2012-06-30T11:30:11.880 に答える