NUMA と Cache の関係

NUMAの基本形は、この様な形でCPU1とCPU2のそれぞれに接続されたメモリに対するアクセスコスト(レイテンシや帯域)がインターネコクトを経由するかしないかで異なるという話で、AMD K8 初期の SledgeHammerコアがこれに該当しますが、
NUMA-Z.png

これとは別の問題としてCPUの内部構造に依存した問題があります。

例えば、Core2QuadやXEON 54xx/53xxは構造的にL2キャッシュがこんな感じになっています。
C2QCACHE.png
この図で左側のL2キャッシュにあるデータにアクセスする場合、Core1とCore2はオンキャッシュで高速なアクセスが出来ますが、Core3とCore4が同じデータにアクセスするにはキャッシュコヒーレンシを維持しつつMCH経由でDRAMにアクセスしなければならず、アクセスコストはCore1/2とCore3/4で異なります。

Sandy以降のリングバスを使ったモデルでは複雑です。
SANDYCACHE.png
全コアでメインメモリ間の帯域は同等ですが、リングバスの特徴として遠距離になるとレイテンシが増えますから、この図ではCore1やCore5は常にメモリレイテンシがCore4やCore8より多くなってしまうはずです。

加えて、HyperThreadが使える為、論理コアはLLCを共有していますから論理的には上のCore2Quadの様な構造を内包しています。

Haswell-EPの大規模コアは更に複雑で、CPUダイ上にNUMA的な構造があり、論理構造上は下図でいうとCore12だけ左側のドメインに属し、る左右とも9コアで対称構造ですが物理構造的には見ての通り右側がヘビーな感じの変則的な構成です。
HASEPCACHE.png


これが、デュアルソケットやマルチソケットに成ると、アクセスコストはカオスですね。
HASEPCACHED.png

OSのスケジューラがCPUの性能を引き出すには、これを把握し、発熱を配慮して、メモリ配置やスレッド負荷の割り振りをしなければなりません。

アプリをチューニングする際にも同じ事が言えそうですね。

CPUコア <-> LLC が最速ですが、他のアクセスコストのパターンとして

CPUコア <-> LLC <-> リング <-> 隣のLLC
CPUコア <-> LLC <-> リング <-> DRAM
CPUコア <-> LLC <-> リング <-> SW <-> リング <-> 隣のLLC
CPUコア <-> LLC <-> リング <-> SW <-> リング <-> DRAM
CPUコア <-> LLC <-> リング <-> QPI <-> リング <-> DRAM
CPUコア <-> LLC <-> リング <-> SW <-> リング <-> QPI <-> リング <-> DRAM
CPUコア <-> LLC <-> リング <-> SW <-> リング <-> QPI <-> リング <-> SW <-> リング <-> DRAM


と、これだけのパターンが有ると思いますし、それぞれ、レイテンシが異なると思われます。
SWAPの事は一緒に考えたくないですが、登場間際のDIMMスロットに挿せるタイプのSSDを混載した場合には考慮する事になるのでしょうね。

ソフト的にこれらを感知する方法は、UEFI/BIOSで設定されているACPIのSRAT(2.0)/SLIT(3.0)/MSCT(4.0)などが基本に有り、BIOS/UEFI上の設定状況を参照するにはRW utilityを使うと簡単に確認出来ます。

OSがこれをどう認識しているかは、WindowsではCoreinfoで確認出来ます(但し、OSはACPIの情報を100%利用している訳ではない様です)。Linuxではどうやって確認するか?未調査ですが、オープンソース故に自分でチューニング出来る楽しみがありそうですね。

定数として利用されるReadOnly属性のメモリ空間はコヒーレンシ維持コストが削減出来そうですが、それを考慮したプログラミングがどこまでされているか筆者は存じません。

以下はソケットG34デュアルの最小構成になるAbuDahbiコアのローエンド品 Opteron 6308 を2基搭載したシステムでCorinfoを実行した結果ですが、途中にありますアクセスコストは概ね出鱈目に近い状況です。モジュール構造はHyperThreadとして認識されている事が判ります。未調査ですがLinuxのカーネルAPIやスケジューラがどうなっているのか興味が有りますね!?

Logical to Physical Processor Map:
**------ Physical Processor 0 (Hyperthreaded)
--**---- Physical Processor 1 (Hyperthreaded)
----**-- Physical Processor 2 (Hyperthreaded)
------** Physical Processor 3 (Hyperthreaded)

Logical Processor to Socket Map:
****---- Socket 0
----**** Socket 1

Logical Processor to NUMA Node Map:
**------ NUMA Node 0
--**---- NUMA Node 1
----**-- NUMA Node 2
------** NUMA Node 3

Approximate Cross-NUMA Node Access Cost (relative to fastest):
00 01 02 03
00: 1.0 1.4 1.8 1.5
01: 1.8 1.4 1.9 2.0
02: 2.0 1.9 1.4 2.0
03: 1.9 2.0 1.9 1.3

Logical Processor to Cache Map:
*------- Data Cache 0, Level 1, 16 KB, Assoc 4, LineSize 64
*------- Instruction Cache 0, Level 1, 64 KB, Assoc 2, LineSize 64
*------- Unified Cache 0, Level 2, 2 MB, Assoc 16, LineSize 64
-*------ Data Cache 1, Level 1, 16 KB, Assoc 4, LineSize 64
-*------ Instruction Cache 1, Level 1, 64 KB, Assoc 2, LineSize 64
-*------ Unified Cache 1, Level 2, 2 MB, Assoc 16, LineSize 64
**------ Unified Cache 2, Level 3, 12 MB, Assoc 1, LineSize 64
--*----- Data Cache 2, Level 1, 16 KB, Assoc 4, LineSize 64
--*----- Instruction Cache 2, Level 1, 64 KB, Assoc 2, LineSize 64
--*----- Unified Cache 3, Level 2, 2 MB, Assoc 16, LineSize 64
---*---- Data Cache 3, Level 1, 16 KB, Assoc 4, LineSize 64
---*---- Instruction Cache 3, Level 1, 64 KB, Assoc 2, LineSize 64
---*---- Unified Cache 4, Level 2, 2 MB, Assoc 16, LineSize 64
--**---- Unified Cache 5, Level 3, 12 MB, Assoc 1, LineSize 64
----*--- Data Cache 4, Level 1, 16 KB, Assoc 4, LineSize 64
----*--- Instruction Cache 4, Level 1, 64 KB, Assoc 2, LineSize 64
----*--- Unified Cache 6, Level 2, 2 MB, Assoc 16, LineSize 64
-----*-- Data Cache 5, Level 1, 16 KB, Assoc 4, LineSize 64
-----*-- Instruction Cache 5, Level 1, 64 KB, Assoc 2, LineSize 64
-----*-- Unified Cache 7, Level 2, 2 MB, Assoc 16, LineSize 64
----**-- Unified Cache 8, Level 3, 12 MB, Assoc 1, LineSize 64
------*- Data Cache 6, Level 1, 16 KB, Assoc 4, LineSize 64
------*- Instruction Cache 6, Level 1, 64 KB, Assoc 2, LineSize 64
------*- Unified Cache 9, Level 2, 2 MB, Assoc 16, LineSize 64
-------* Data Cache 7, Level 1, 16 KB, Assoc 4, LineSize 64
-------* Instruction Cache 7, Level 1, 64 KB, Assoc 2, LineSize 64
-------* Unified Cache 10, Level 2, 2 MB, Assoc 16, LineSize 64
------** Unified Cache 11, Level 3, 12 MB, Assoc 1, LineSize 64

Logical Processor to Group Map:
******** Group 0
 
関連記事
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

DualSocketTheWorld

Author:DualSocketTheWorld
自作を始めて20台目くらいになりますが、最初からデュアルソケット限定(始めた当時はデュアルスロット)で自作しており、近年になってAMD K6を試したくなりSocket7でK6-2+のシングル構成で組んだのがシングル初です。

シングルマザー(含:シングルソケットマルチコア)や4ソケット以上の自作は基本的にしませんし、メーカー製PCの改造も基本的にはしません(ノートPCのSSD化くらいはしますが・・・)

基本路線はワークステーションと呼ばれる分野での自作で、OSもWindows系であればProfesionalが主な対象に成ります。

ゲーマーの様なOverClockは行わず、WS路線としてハイエンドCPUとハイエンドGPUの組み合わせで定格或いはDownClockで発熱を抑えつつ、その時のアーキテクチャに置いて爆速かつ静音を目指し、30年以上の長期に渡り稼動状態をキープする事を目指します。

※基本的にリンクフリーです。どこでも自由にどうぞ。

※画像は時々変ります。

※お決まりの文章ですが、改造は個人の責任で行ってください。ここに記載された情報は間違いを含んでいる可能性が有り、それを元に製作や改造などをして失敗しても筆者は一切責任持てませんので悪しからず。

筆者略歴:
小学生時代にゴミ捨て場で拾ったジャンクテレビ数台を分解して部品を取り出し真空管アンプを自作、中学生時代にPC8801mkⅡsrでZ80アセンブラを始める。社会人になって初のプログラムは弾道計算、後に医療系・金融系プログラマ~SEを経て100~200人規模プロジェクトのジェネラルマネジャを数年経験、独立して起業。現在は不動産所得で半引退生活。
(人物特定を避ける目的で一部経歴を変更しています)

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
アクセスカウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR