0

たとえば、2 つのクアッド コア プロセッサを備えたデュアル ソケット システムでは、スレッド スケジューラは同じプロセッサ内の同じプロセスからのスレッドを保持しようとしますか? 異なるプロセッサの異なるプロセスのスレッドをインターリーブすると、プロセス内のスレッドが多くの共有メモリ アクセスを行う場合にパフォーマンスが低下するためです。

4

1 に答える 1

3

場合によります。

現在の Intel プラットフォームでは、BIOS のデフォルトは、メモリがシステムのソケット間でページごとにインターリーブされているようです。1M バイトを割り当てると、半分が一方のソケットに、半分がもう一方のソケットに割り当てられます。つまり、スレッドがどこにいてもデータに平等にアクセスできます。

これにより、OS にとって非常にシンプルになります。どこでもかまいません。

これはあなたに不利に働く可能性があります。OS に提​​示される SMP ハードウェア環境は、QPI を介して連携する CPU によって合成されます。多くのスレッドがすべて同じデータにアクセスしている場合、それらのリンクが非常にビジーになる可能性があります。それらが忙しすぎると、パフォーマンスが制限され、I/O バウンドになります。それが私です。Intel のメモリ サブシステム設計を備えた Z80 コアは、私が実際に持っている nahelem コアと同じくらい高速です (誇張しているかもしれません...)。

結局のところ、本当の問題はメモリが十分に速くないということです。Intel と AMD はどちらも最近、メモリに関して印象的な成果を上げていますが、その遅さは依然として妨げとなっています。理想的には、すべてのコアがクロックレートでアクセスできるように、メモリが十分に高速である必要があります。Cell プロセッサはこれを行いました。各 SPE にはキャッシュの代わりに SRAM が少しあります。一度理解すれば、SPE を本当に歌わせることができます。

===編集===

それだけではありません。Basile Starynkevitch が示唆するように、別のアプローチは NUMA を採用することです。

NUMA は最新の CPU が実際に具現化しているものであり、バスをアドレス指定することによって他の CPU ソケットのメモリに直接アクセスできないため、メモリ アクセスは一様ではありません。代わりに、CPU は QPI リンク (または AMD の場合はハイパートランスポート) を介してデータを要求し、他の CPU にメモリからデータをフェッチして送り返すように要求します。CPU がハードウェアでこれらすべてを実行しているため、最終的には従来の SMP 環境のように見えます。また、QPI / Hypertransport は非常に高速であるため、ほとんどの場合、十分に高速です。

ハードウェアのアーキテクチャを反映するようにコードを記述すれば、理論上は改善できます。したがって、これには、(たとえば) システム内にデータのコピーを 2 つ (各ソケットに 1 つずつ) 持つことが含まれる場合があります。Linux にはメモリ アフィニティ ルーチンがあり、すべてのソケットにインターリーブするのではなく、特定の方法でメモリを割り当てます。スレッドが実行されている CPU コアを制御できるようにする CPU アフィニティ ルーチンもあります。これは、スレッドが処理するデータ バッファーに近いコアでスレッドを実行するという考え方です。

わかりましたので、それを機能させるためにソースコードに多額の投資をすることを意味するかもしれません (特に、データの重複がプログラムのフローにうまく適合しない場合)。あなたができること。

私はこれをある程度いじりました。ある意味、それは正しいファフです。Intel と AMD (したがって OS とライブラリも) の全体的な考え方は、ほとんどの場合、かなり優れた SMP 環境を提供することです。ただし、必要なスレッドとメモリの展開を取得するために呼び出す必要があるライブラリ関数の負荷を使用して、NUMA を操作できます。

ただし、少し余分な速度が必要なエッジケースでは、アーキテクチャと OS が厳密に NUMA であり、SMP がまったくない方が簡単です。実際、Cellプロセッサと同じです。簡単に書けるからではなく (実際にはもっと難しいでしょう)、簡単に実行できますが、実際に実行してみると、ハードウェアが実現できる最高の速さであることがわかります。私たちが現在持っている偽の SMP を使用して NUMA を試してみますが、ほとんどの場合、それが可能な限り高速であるかどうか疑問に思っています。ライブラリが、実際には別のソケットに常駐するメモリにアクセスしていると言っているわけではありません。改善の余地があるというヒントなしにアクセスを許可しているだけです。

于 2013-04-24T19:40:16.837 に答える