Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
隣の芝は茶色いか 梅澤威志 twitter: @umezawa_takeshi
Slide 2
Slide 2 text
NUMA って 知ってますか
Slide 3
Slide 3 text
Non- Uniform Memory Access
Slide 4
Slide 4 text
不 均一な メモリ アクセス
Slide 5
Slide 5 text
NUMA とは • マルチプロセッサシステムにおいて、メモリ (要するにDRAM)へのアクセス(スループット、 レイテンシ)が均一でないような環境
Slide 6
Slide 6 text
もうちょっとわかりやすく • プロセッサから見て「近いメモリ」と「遠いメモ リ」があり、どのメモリが近いかはプロセッサ によって異なる環境のこと – どのメモリが近いかがプロセッサによらず同じで あるような環境は、単にメモリ階層が存在してい るだけ
Slide 7
Slide 7 text
つまりこういうこと プロセッサ メモリ メモリ プロセッサ 近い 近い 遠い
Slide 8
Slide 8 text
具体的な製品 • 最近だと PC でもマルチプロセッサシステムは 全部 NUMA である – Intel だと Nehalem の Xeon (2009) 以降 – AMD だと Opteron (2003) 以降
Slide 9
Slide 9 text
最近のPCのNUMAの図 CPU メ モ リ CPU メ モ リ I/O
Slide 10
Slide 10 text
ここから 本題
Slide 11
Slide 11 text
昔こんなこと言ってました • https://twitter.com/umezawa_takeshi/status/724997040715898881 • でも実は測ってない(=伝聞)
Slide 12
Slide 12 text
どうやって測ろう • ストアのレイテンシを測るのは難しい – いつ完了したのか知る方法がない • ロードのレイテンシを測ろう • ロードして、それが終わったらまたロードして …をたくさん(10秒ぐらい)繰り返す • 経過時間 ÷ ロード回数 = レイテンシ
Slide 13
Slide 13 text
それほど単純ではない(1) • 最近のプロセッサはスーパースカラ&アウト オブオーダーなので、単にロード命令を並べ ただけでは並列に実行されてしまう 並列に実行されないように、ロードしたらアド レスが取れて、そのアドレスからロードしてア ドレスが取れて…という構造にする(ロード間 に依存関係を発生させることで直列に実行さ せる)
Slide 14
Slide 14 text
それほど単純ではない(2) • 最近のプロセッサはハードウェアプリフェッチ があるので、規則正しいメモリアクセスを行う と勝手にアクセスしてキャッシュメモリまで 持ってきてしまう アクセスするアドレスがランダムになるように して、ハードウェアプリフェッチが効かないよう にする
Slide 15
Slide 15 text
それほど単純ではない(3) • 隣のキャッシュのデータをロードしたら自分の キャッシュにコピーができてしまう(たぶん) 諦めて隣のメモリのレイテンシを測って、自分 のメモリのレイテンシとの差で推測する
Slide 16
Slide 16 text
測定ツール • https://github.com/umezawatakeshi/numa_m emory_latency • 後述の機材が CentOS 6 で動いている関係上、 GCC 4.4.7 の C++0x の範囲で記述。(C++11 で も OK)
Slide 17
Slide 17 text
測定機材 • Dual Xeon E5-2630L v2 – Ivy Bridge EP – 6C12T – Base 2.4GHz, TB 2.8GHz – L1D$: 32KiB/core – L2$: 256KiB/core – L3$: 15MiB/socket • たまたま手の届く範囲にこれがあっただけ
Slide 18
Slide 18 text
測定上の注意 • このハードの管理者ではないので、 – サーバとしての製品名は知らない – EIST や TB や HT などをオフにすることもできない • このホストを占有できてはいないので、 – 他のプログラム(特にデーモン)が全く走っていな い状態で計測できているわけではない • 非常にザックリした測定であることに注意
Slide 19
Slide 19 text
測定結果 対象 レイテンシ L1キャッシュ (32KiB/core) ~1.6ns L2キャッシュ (256KiB/core) ~7.0ns L3キャッシュ (LLC) (15MB/socket) ~18ns ローカルノードの メインメモリ ~90ns リモートノードの メインメモリ ~190ns
Slide 20
Slide 20 text
結論 • 隣のメモリは遠い • というか隣のプロセッサが遠い • NUMAシステムで、複数のプロセッサにまた がってメモリをたくさん使うタスクを適切に書く のは難しいです
Slide 21
Slide 21 text
オマケ:よく分からないこと • L1 のレイテンシは CPU0 より CPU1 の方が小 さかった • L2 のレイテンシは計測誤差程度だった • L3 のレイテンシも CPU0 より CPU1 の方が小 さかった • 何回測っても同じ傾向になる • 計測手法に若干の問題がある可能性…?