STREAM

1Quad Core Opteron:p
ccNUMA Arch.
• AMD Quad Core Opteron
2.3GHz– Quad Coreのソケット×4 ⇒ 1
ノード（16コア）
ド（）

L2L1MemoryMemory

L3L3L2L1L2L1L2L1L2L1L2L1L2L1L2L1Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

L1L2L1L2• 各ソケットがローカルにメモリを持っている– NUMA：Non-Uniform
Memory Access– ローカルのメモリをアクセスして計算するようなプログラミング計算するようなプログラミング，データ配置，実行時制御（numactl）が必要– cc： cache-coherent– キャッシュ同期：Thread並列L1L2L1L2L1L2L1L2L1L2L3L3Memoryy

Memoryy

L1L2STREAM

2ccNUMA Architecture
MemoryMemory

L3L2L1Memory

CoreL3L2L1L2L1L2L1L2L1L2L1L2L1Core Core Core CoreCore Core Core CoreCore Core Core CoreCore Core Core Core

L1L2L1L2L3L2L1L2L1L2L1L2L1Core Core Core CoreコアCore

L2L1ソケット
Socket

L1L2L1L2L1L2L1L2L1L2L3L3Memory

Memoryノード
Node

L1L2

STREAM

3numactl>$ numactl –-showppolicy:y default
preferred node: current
physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15cpubind: 0 1 2 3
nodebind: 0 1 2 3
membind: 0 1 2 3• NUMA(Non UniformMemoryy Access)) 向けのメ
モリ割付のためのコマンドラ
イン：Linuxでサポート• 使うコアとメモリの関係指定：ローカルなメモリ上の定：ロ
カルなメモリ上のデータを使うのが得策

コア
ソケット
ソケット
メモリ

S k t #0Socket

S k t #1Socket#0#1L3L3L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L10123456789101112131415L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L33L33#2#3Socket #2Socket #3

N t
Networkk

N t
Networkk

STREAM

4numactlの影響• T2K，有限要素法アプリケーション，Strong Scaling，Flat MPI
ア
アあたりの問題サイ はアの 倍• 128コア：1コアあたりの問題サイズは512コアの4倍– メモリへの負担大• Policy=0：何も指定しない場合• 相対性能：大きいほど良いー128ノードで影響大
Relativ
ve Performa
ance

1.50

128cores
512cores
1.00

0.50

0.00
01

23numactl policy

45#@$-r HID-org#@$-q h08nkl32#@$-N 24#@$ J T16#@$-J#@$-e err#@$-o x384-40-1-a.lst#@$-lM 27GB#@$#@$-lE 03:00:00#@$-s /bin/sh#@$
cdd $PBS$PBS_O_WORKDIRO WORKDIR
mpirun ./numarun.sh ./solexit

STREAM5

numarun.shの中身
Relativ
ve Performa
ance

1.50

Policy:1#!/bin/bash
MYRANK=$MXMPI_ID MPIのプロセス番号
MYVAL=$(expr $MYRANK / 4)
SOCKET=$(expr $MYVAL % 4)numactl --cpunodebind=$SOCKET --interleave=all $@128cores
512cores1.00

Policy:2#!/bin/bash
MYRANK=$MXMPI$_ID
MYVAL=$(expr $MYRANK / 4)
SOCKET=$(expr $MYVAL % 4)numactl --cpunodebind=$SOCKET --interleave=$SOCKET $@

0.50

0.00
01234

5

numactl policySocket #0

Socket #1#0#1L3L3L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L10123456789101112131415L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L3L3#2#3

Socket #2

Socket #3

Network

Network

Policy:3#!/bin/bash
MYRANK=$MXMPI_ID
MYVAL=$(expr $MYRANK / 4)
SOCKET=$(expr $MYVAL % 4)numactl --cpunodebind=$SOCKET --membind=$SOCKET $@Policy:4#!/bin/bash
MYRANK=$MXMPI_ID
MYVAL=$(expr $MYRANK / 4)
SOCKET=$(exprSOCKET$(expr $MYVAL % 4)numactl --cpunodebind=$SOCKET --localalloc $@Policy:5#!/bin/bash
MYRANK=$MXMPI_ID
MYVAL=$(expr $MYRANK / 4)
SOCKET=$(expr $MYVAL % 4)numactl --localalloc $@STREAM

6

Policy-3の割り当て
ySocket #0

Socket #1#0#1L3L3L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L10123456789101112131415L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2

Policy:3#!/bin/bash
MYRANK=$MXMPI_ID
MYVAL=$(expr $MYRANK / 4)
SOCKET=$(expr $MYVAL % 4)numactl --cpunodebind=$SOCKET --membind=$SOCKET $@NetworkNetwork

MPI process

SocketMemory

000

100

200

300

4

1

1

5

1

1

L3

L3

#2

#3

6

1

1

Socket #2

Socket #3

7

1

1

8

2

2

9

2

2

102

2

112

2

12

3

3

13

3

3

14

3

315

3

3

Core

STREAM

7

Cyclicな割り付けも可能
ySocket #0

Socket #1

#0

#1

L3

L3#!/bin/bash
MYRANK=$MXMPI_ID
SOCKET=$(expr $MYRANK % 4)numactl --cpunodebind=$SOCKET --membind=$SOCKET $@L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L10123456789101112131415L1L2L1L2

L1L2L1L2L1L2L1L2

L1L2L1L2Network

Network

MPI process

SocketMemory

0001

1

12223

3

34005

11L3

L3#2#362

2

Socket #2

Socket #3733800911102211331200131114221533CoreSTREAM8

コアを指定することもできる
Socket #0

Socket #1#0#1L3L3L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L10123456789101112131415

L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2#!/bin/bashMYRANK=$MXMPI_ID
MYVAL=$(expr $MYRANK / 4)
SOCKET=$(expr $MYVAL % 4)
CORE=$(expr $MYRANK % 16)
numactl --physcpubind=$CORE --membind=$SOCKET $@Network

MPI process

Network

SocketMemoryCore000101202303414515L3L3#2#3616Socket #2Socket #3717828929102101121112312133131431415315STREAM

98コア使う場合はどうする ?
Socket #0Socket #1#0#1

L3L3

MPI process

L2L1L2L1L2
L1L2L1L2
L1L2
L1L2
L1L2L101234567NetworkSocketMemory

Core

000

102214316428891011121314155210L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L26312Network7314MemoryCoreMPI process

MemoryCore00000010110120221430331541442851552961663127177313L3L3#2#3

Socket #2

Socket #3

MPI process

SocketSocketSTREAM

10STREAM ベンチマーク
http://www.streambench.org/• メモリバンド幅を測定するベンチマーク
メモリバンド幅を測定するベンチ
ク– Copy, Scale, Add, Triad（DAXPYと同じ）---------------------------------------------Double precision appears to have 16 digits of accuracyAAssumingi
8 bbytestper DOUBLE PRECISION wordd---------------------------------------------Number of processors =16
Array size =2000000
Offset=0The total memory requirement is732.4 MB (45.8MB/task)
You are running each test 10 times-The *best* time for each test is used
EXCLUDING the first and last iterations*EXCLUDING*------------------------------------------------------------------------------------------------------Function
Rate (MB/s) Avg time
Min time Max timeCopy:
18334.1898
0.02800.02790.0280Scale:
18035
18035.1690
1690
00.02840284
00.02840284
00.02850285Add:
18649.4455
0.04120.04120.0413
Triad:
19603.8455
0.03940.03920.0398

STREAM11

ファイル：今回はFORTRANのみ
今回>$ cd <$FVM>/stream>$ mpif90 –Oss –noparallel stream.f –o stream
今回はMPI版だが OpenMP版もある
今回はMPI版だが，OpenMP版もある

STREAM12

set-a0.sh：Policy-5相当• プロセスが割り当てられたソケットのローカルメモリを使う• ソケット番号は基本的にサイクリック（round-robin的）にソケ ト番号は基本的にサイクリ ク（d bi 的）に割り当てられるが，異なる場合もある（実行ごとに性能が変動）#@$-r stream#@$-q#@$q lecture#@$-N 1#@$-J T16#@$-e err#@$-o a0-16-1.lst#@$-lM 28GB#@$-lT 00:05:00#@$
cd $PBS_O_WORKDIR
mpirun numactl --localalloc ./stream
exit

Socket #0

Socket #1#0#1

L3L3L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L10

1234

56

7

8910

11

1213

14

15

L1L2L1L2L1L2L1L2L1L2

L1L2L1
L2L1L2L3L3#2#3

Socket #2

Socket #3

NetworkNetwork

STREAM13

set-ｂ1/b2.sh：Policy-3,4相当• 各プロセスをソケット0番から順番に埋まるように割り当て 各ソケットのローカルメモリを使うて，各ソケットのローカルメモリを使う• b1とb2ではあまり差は無い
set-b1.sh#@$-r stream#@$ q lecture#@$-q#@$-N 1#@$-J T8#@$-e err#@$-o b1-08-1.lst#@$-lM 28GB#@$-lT 00:05:00#@$
cd $PBS_O_WORKDIR
mpirun ./b1.sh ./stream
exit

b1.sh：Policy-3相当
相当#!/bin/bash
MYRANK=$MXMPI_ID
MYVAL $(expr $MYRANK / 4)
MYVAL=$(expr
SOCKET=$(expr $MYVAL % 4)numactl --cpunodebind=$SOCKET --membind=$SOCKET $@b2 sh：Policy 4相当
b2.sh：Policy-4相当#!/bin/bash
MYRANK=$MXMPI_ID
MYVAL=$(exprp $MYRANK / 4)
SOCKET=$(expr $MYVAL % 4)numactl --cpunodebind=$SOCKET --localalloc $@STREAM14

set-x.sh• 各プロセスが割り当てられたソケットのメモリを使う• T2：0,1，T4：0,1,2,3
T2 0 1 T4 0 1 2 3• T8：0,0,1,1,2,2,3,3• T16：0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3#@$-r stream#@$-q lecture#@$-N 1#@$-J T16#@$-e err#@$-o x1-16-1.lst#@$-lM 28GB#@$-lT 00:05:00#@$
cd $PBS_O_WORKDIR
mpirun numactl --cpunodebind=0,1,2,3 --localalloc ./streamexit

STREAM

15

Triadの結果：Policy-5@T1の性能を1.00
結果y @• Policy-5: set-a0，Policy-4: set-b2• 0,1,2,3: set-x
16 ア使った場合，メモリの性能は5倍強にしかなっていない• 16コア使った場合，メモリの性能は5倍強にしかなっていない
Relativ
ve Memoryy Bandwidtth

65

Policy-5
Policy-4
y0,1,2,3432
10124Core #

816

STREAM

16

Triadの性能：T26• Policy-4

Relative Memory Banddwidth

Policy-4– 1コアのときの2倍までは行かないが性能は向上– 2コアで1つのメモリを共ア
リを共有するため，多少の競合が生じている

50,1,2,343210124816Core #• 0,1,2,3– ほぼ100%近い性能向上–各各コアでローカルメモリをアでカルリを占有MemoryMemoryL3L2L1L2L1MemoryL3L2L1L2L1L2L1L2L1Memory

L3L2L1L2L1L2L1L2L1L3L2L1L2L1L2L1L2L1L2L1L2L1Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core CoreL1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L3L3L3L3Memory

MemoryMemoryMemoryPolicy--4Policy

0,1,2,3L1L2STREAM

17Triadの性能：T46• Policy-4

Relative Memory Banddwidth

Policy-4– T2のときとほとんど変わらない，つまり1コア当たりのメモリ性能は半分に落ちている– 飽和状態

50,1,2,343210
124816

Core #• 0,1,2,3– T1の4倍までは行かないが順調にスケール– Cache-Coherency– 通信の影響もあり

MemoryMemoryL3L2L1L2L1MemoryL3L2L1L2L1L2L1L2L1MemoryL3L2L1L2L1L2L1L2L1L3L2L1L2L1L2L1L2L1L2L1L2L1Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L3L3L3L3Memory

MemoryMemoryMemoryPolicy--4
Policy0,1,2,3L1L2

STREAM

18

Triadの性能：T8，T16
6• Policy-4

Relative Memory BanddwidthPolicy-4– T8• T4の約2倍弱– T16• T8の約2倍弱• T8とほぼ同じ• Policy-4におけるT2→T4と同じ4321124816Core #– T8– T16

0,1,2,30• 0,1,2,3• T4の約2倍弱

5MemoryMemory

L3L2L1L2L1Memory

L3L2L1L2L1L2L1L2L1MemoryL3L2L1L2L1L2L1L2L1L3L2L1L2L1L2L1L2L1L2L1L2L1Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core Core

Core Core Core CoreL1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L1L2L3L3L3L3Memory

MemoryMemoryMemoryPolicy--4
Policy0,1,2,3L1L2

STREAM

19T2Kの性能• 実は余りノード内の性能について細かく測定したことは無い– 1ノードが最低単位• メモリの性能（の悪さ）に充分注意する必要がある– Strongg Scaling（同じ問題をコア数を変えて解く）の場合，基準を1ノーg
ドあるいは1ソケット（Policy-2,3,4のようにする）にする

STREAM

20疎行列
疎行列ソルバーの性能：三次元弾性問題
性能
弾性問題
ICCG法，T2K・SR11000 1ノード：メモリバンド幅が効く
HitachiHit
hi SR11000/J2
Power 5+ 2.3GHz x 16
147.2 GFLOPS/node
100 GB/s for STREAM/Triad
L3 cache: 18MB/core

T2K/Tokyo
T2K/TkOpteron 2.3GHz x 16
147.2 GFLOPS/node
20 GB/s for STREAM/Triad
L3 cache: 0.5MB/core
20.0

Perform
mance Ra tio (%)

Perform
mance Rattio (%)

20.0

15.0

10.0

Flatt MPI.
FlMPI
HB 4x4
HB 8x2
HB 16x1

5.0

0.0
1.E+04

Flat MPI.
HB 4x4
HB 8x2
HB 16x1

15.0

10.0

5.0

0.0
1.E+05

1.E+06DOF

1.E+07

1.E+04

1.E+05

1.E+06DOF

1.E+07

STREAM

21

Hitachi SR11000/J2• IBM POWER5+ 2.3GHz (9.2GFLOPS)• Dual Core
Core×44 ⇒ 「MCM（MultiMCM（Multi Core Module）」×2Module）」 2 ⇒ 1node（16cores）• based on NUMA architectures, but small latency of memory, huge cache
青木，中村，助川，齋藤，深川，中川，五百木（2005）
スーパーテクニカルサーバーSR11000 モデルJ1のノードアーキテクチュアと性能評価
情報処理学会論文誌：コンピュ ティングシステム 45-SIG12（ACS11），27-36
情報処理学会論文誌：コンピューティングシステム
45 SIG12（ACS11） 27 36 より作成

Memory
L3C
Core
C
Core
L1L1L3Memory
L3L1C
CoreC
Core
L1Memory
L3L1C
CoreC
Core
L1Memory
L3L1C
Core
C
Core
L1L1L2L2L2L2L2L2L2L2L1C
Core
CPU
MemoryL1L3L1C
CoreC
CoreMemory

L1L3L1C
CoreC
CoreMemory

L1L3

L1CCoreCCoreMemory

STREAM22

台形積分：T2K（東大）における並列効果#@$-r test#@$-q lecture#@$-N 1#@$ J T4#@$-J#@$-e err#@$-o hello.lst$28GB#@$-lM#@$-lT 00:05:00#@$
cd $PBS_O_WORKDIR$PBS O WORKDIR
mpirun numactl --localalloc ./a.out

1.00E+02
64.02
47.64
4764
29.92

ideal
N=10^6
N=10^715.68

N=10^91.00E+01
SSpeed-Up• ◆：N=106，●：107，▲：109• －：理想値• 1コアにおける計測結果（sec.）からそれぞれ算出

7 97
7.97
3.99

2.00

1.00E+00

1.00

1.00E-01110100

Core #• 赤字部分の影響• 1ノードより多いと変動あり
1ノ ドより多いと変動あり• メモリに負担のかからない計算