5

私が理解しているように、NUMA システムでのパフォーマンスのために、避けるべき 2 つのケースがあります。

  1. 同じソケット内のスレッドが同じキャッシュ ラインに書き込む (通常は 64 バイト)
  2. 異なるソケットから同じ仮想ページに書き込むスレッド (通常は 4096 バイト)

簡単な例が役に立ちます。2 ソケット システムがあり、各ソケットに 2 つの物理コア (および 2 つの論理コア、つまりモジュールごとに Intel ハイパースレッディングまたは AMD 2 コアがない) を備えた CPU があると仮定します。OpenMPの図をお借りしましょう: スケジュール用

| socket 0    | core 0 | thread 0 |
|             | core 1 | thread 1 |

| socket 1    | core 2 | thread 2 |
|             | core 3 | thread 3 |

したがって、ケース 1 に基づいて、たとえばスレッド 0 とスレッド 1 が同じキャッシュラインに書き込むことを避けるのが最善であり、ケース 2 に基づいて、たとえばスレッド 0 がスレッド 2 と同じ仮想ページに書き込むことを避けるのが最善です。

ただし、最新のプロセッサでは、2 番目のケースはもはや問題ではないとのことです。ソケット間のスレッドは、同じ仮想ページに効率的に書き込むことができます (同じキャッシュ ラインに書き込まない限り)。

ケース 2 はもはや問題ではありませんか? それでも問題がある場合、これに対する正しい用語は何ですか? 両方のケースを一種の偽の共有と呼ぶのは正しいですか?

4

1 に答える 1

2

ケース 1 については正しいです。ケース 2 についての詳細:

オペレーティング システムのNUMA ポリシーおよび関連する移行の問題に基づいて、スレッド 0 と 2 が書き込みを行っているページの物理的な場所は、ソケット 0 またはソケット 1 である可能性があります。ケースは対称的であるため、ファースト タッチ ポリシーがあり、スレッド 0 が最初にそこに到達します。一連の操作は次のようになります。

  1. スレッド 0 がページを割り当てます。
  2. スレッド 0 は、作業対象のキャッシュ ラインに書き込みます。そのキャッシュ ラインは、ソケット 0 のキャッシュ内で無効から変更済みに遷移します。
  3. スレッド 2 は、作業対象のキャッシュ ラインに書き込みます。その回線を排他状態にするには、ソケット 1 が Read For Ownership をソケット 0 に送信し、応答を受信する必要があります。
  4. スレッド 0 と 2 は自分の仕事に取り掛かることができます。スレッド 0 がスレッド 2 のキャッシュ ラインに触れず、その逆も同様であり、いずれかのラインの状態を変更するような操作を誰も行わない限り、スレッド 0 とスレッド 2 が実行するすべての操作はソケット (および場合によってはコア) ローカルです。 .

結果に影響を与えることなく、2. と 3. の順序を入れ替えることができます。いずれにせよ、ステップ 3 のソケット間のラウンド トリップは、ステップ 2 のソケット ローカル アクセスよりも時間がかかりますが、そのコストは、スレッド 2 がその回線を変更された状態にする必要があるたびに 1 回だけ発生します。そのキャッシュ ラインの状態の遷移の間に実行が十分長く続く場合、余分なコストは償却されます。

于 2014-05-16T22:33:24.630 に答える