PCCC

In PCクラスタワークショップ
in 大阪2015（2015年2月）

Process-in-Process

新しいノード内並列実行モデル• 新しい並列実行モデル：PVAS（ピーヴァス）• プロセスでもない、スレッドでもない• プロセス並列とスレッド並列の•PCクラスタワークショップ in 柏2017
2月17日（金）理化学研究所 計算科学研究機構
堀 敦史•「いいとこ取り」欠点
Linux カーネルを入れ替える必要ありセンター運用されている場合は、不可能
なんとかユーザレベルで実現できないだろうか？

••

[復習] PVAS [ピーヴァス]

[復習] プロセスとスレッドの中間• Partitioned Virtual Address Space• プロセスとスレッドの中間的なもの• 実行の単位を「PVASタスク」と呼ぶ• 変数は全てPVASタスク固有• しかしながら、同じアドレス空間なので、共有したければ共有できる
普通に Load/Store 命令でアクセスできる
ため高速共有部分のみ、必要なら排他制御

••

TEXT

TEXT

BSS&DATA

BSS&DATA

HEAP

HEAP

STACK

STACK

KERNELKERNEL

マルチプロセス

Partition 0

TEXT
BSS&DATA

Partition 1

Partition 2

HEAP

マルチスレッド

STACK 0STACK 1TEXT
BSS&DATA
HEAP
STACK

Partition n-1

KERNELSTACK n-1
KERNELマルチスレッドの問題•10,000
1,000
10010F

PVAS BTL

HVader BTL

JJ B
J B H
J B H
SM-KNEM BTL
JJ B HJ B H
SM BTLJB
H
J B B
HJ H H
B
J
H
JB
J
HJ
B
J J J J B
HB
B
HB
HB B
B
H H H HFF

FFFFFF

10.1

FFF

F

FF

OpenMPIon Xeon Phi

FFF2,000
HJB

1,000

H
H
J
B
F0J
B
FJB

FF
H

600
500400

H

H
HB
JF

JB

FB
J250MB
FFB
J

60
120
180240IMB AlltoAll (2KiB) Number of Processes

Rendezvous Protocol

アイデア自体は古くからある• プロセスからのアプローチ• 新しい OS カーネル：Kitten OS/smartmap• カーネルモジュール：XPMEM• Linux にパッチ：PVAS• スレッドからのアプローチ• コンパイラ／プリプロセッサで、変数を• MPC（仏CEA）• Thread-based MPI• TOMPI、TMPI、などなど



1000
thread=multipleH

「非」共有にするンを変えた時の性能の差

110100
1,000 10,000 100,000
IMB PingPong Message Size [KByte]

3,0000• 排他制御のコストが無視できない• このグラフは MPICH のコンフィグレーショ

3002001000

PingPong Latency [usec]••

100,000

Total Page Table Size [MByte]•••

400,000

Better•

ノード内通信の効率化
高速、かつ省メモリ
なぜ？
1copyで通信可能
ページテーブルが小さくて済む
CPUコア数が大きい程有利
メニーコア

Memory Usage [MByte]• PVASを用いることで

IMB PingPong Latency [usec][復習] PVASを用いたMPIの実装

thread=single
100

10

1

0.1
1E+01E+1 1E+2 1E+3 1E+4 1E+5 1E+6
Message Length [Bytes]

1E+7

ユーザレベル実装• PVAS 同様の機能を Linux の標準機能のみを使って実現できることが判明• clone() と dlmopen()• 「プロセスの中に複数のプロセスがある」➡︎ “Process-in-Process” (PiP)• PVAS に変わる新しい名称• 以降で、PiP の機能を検証する

メモリマップ

ページテーブルの大きさ• PiP で3プロセスを実行した時のメモリマップ• 128 MiB のデータをノード内のプロセスで共の例：同じライブラリが複数ロードされているMemory Map of PIP

18,000

glibc

Fork

12,000Pthread12,000

10,00010,000

PIP

8,000
6,000
4,000
2,000
1020

Fork

16,00014,000PIP
Pthread

8,000
6,000
4,000
2,000
00003040# Tasks

1020503040# Tasks

506060Figure 9: Total Page Table Size8

18,00016,00014,000Total Page Table Size [KiB]

Program

有した時、ページテーブルの大きさを比較

7ffff5c6e000-7ffff5c72000 rw-p 00000000 00:00 0
7ffff5c72000-7ffff5e28000 r-xp 00000000 08:03 1574971/usr/lib64/libc-2.17.so
7ffff5e28000-7ffff6028000 ---p 001b6000 08:03 1574971/usr/lib64/libc-2.17.so
7ffff6028000-7ffff602c000 r--p 001b6000 08:03 1574971/usr/lib64/libc-2.17.so
7ffff602c000-7ffff602e000 rw-p 001ba000 08:03 1574971/usr/lib64/libc-2.17.so
7ffff602e000-7ffff6033000 rw-p 00000000 00:00 0
7ffff6033000-7ffff61e9000 r-xp 00000000 08:03 1574971/usr/lib64/libc-2.17.so
7ffff61e9000-7ffff63e9000 ---p 001b6000 08:03 1574971/usr/lib64/libc-2.17.so
7ffff63e9000-7ffff63ed000 r--p 001b6000 08:03 1574971/usr/lib64/libc-2.17.so
7ffff63ed000-7ffff63ef000 rw-p 001ba000 08:03 1574971/usr/lib64/libc-2.17.so
7ffff63ef000-7ffff63f4000 rw-p 00000000 00:00 0
7ffff63f4000-7ffff63f5000 ---p 00000000 00:00 0
7ffff63f5000-7ffff6bf5000 rw-p 00000000 00:00 0[stack:10641]
7ffff6bf5000-7ffff6bf6000 ---p 00000000 00:00 0
7ffff6bf6000-7ffff73f6000 rw-p 00000000 00:00 0[stack:10640]
7ffff73f6000-7ffff75ac000 r-xp 00000000 08:03 1574971/usr/lib64/libc-2.17.so
7ffff75ac000-7ffff77ac000 ---p 001b6000 08:03 1574971/usr/lib64/libc-2.17.so
7ffff77ac000-7ffff77b0000 r--p 001b6000 08:03 1574971/usr/lib64/libc-2.17.so
7ffff77b0000-7ffff77b2000 rw-p 001ba000 08:03 1574971/usr/lib64/libc-2.17.so
7ffff77b2000-7ffff77b7000 rw-p 00000000 00:00 0
7ffff77b7000-7ffff77cd000 r-xp 00000000 08:03 1574997/usr/lib64/libpthread-2.17.so
7ffff77cd000-7ffff79cd000 ---p 00016000 08:03 1574997/usr/lib64/libpthread-2.17.so
7ffff79cd000-7ffff79ce000 r--p 00016000 08:03 1574997/usr/lib64/libpthread-2.17.so
7ffff79ce000-7ffff79cf000 rw-p 00017000 08:03 1574997/usr/lib64/libpthread-2.17.so
7ffff79cf000-7ffff79d3000 rw-p 00000000 00:00 0
7ffff79d3000-7ffff79d6000 r-xp 00000000 00:25 51408475/PIP/PIP/lib/libpip.so
7ffff79d6000-7ffff7bd5000 ---p 00003000 00:25 51408475/PIP/PIP/lib/libpip.so
7ffff7bd5000-7ffff7bd6000 r--p 00002000 00:25 51408475/PIP/PIP/lib/libpip.so
7ffff7bd6000-7ffff7bd7000 rw-p 00003000 00:25 51408475/PIP/PIP/lib/libpip.so
7ffff7bd7000-7ffff7bda000 r-xp 00000000 08:03 1574977/usr/lib64/libdl-2.17.so
7ffff7bda000-7ffff7dd9000 ---p 00003000 08:03 1574977/usr/lib64/libdl-2.17.so
7ffff7dd9000-7ffff7dda000 r--p 00002000 08:03 1574977/usr/lib64/libdl-2.17.so
7ffff7dda000-7ffff7ddb000 rw-p 00003000 08:03 1574977/usr/lib64/libdl-2.17.so
7ffff7ddb000-7ffff7dfc000 r-xp 00000000 08:03 1581458/usr/lib64/ld-2.17.so
7ffff7edc000-7ffff7fe0000 rw-p 00000000 00:00 0
7ffff7ff7000-7ffff7ffa000 rw-p 00000000 00:00 0
7ffff7ffa000-7ffff7ffc000 r-xp 00000000 00:00 0[vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00021000 08:03 1581458/usr/lib64/ld-2.17.so
7ffff7ffd000-7ffff7ffe000 rw-p 00022000 08:03 1581458/usr/lib64/ld-2.17.so7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0[stack]ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

Total Page Table Size [KiB]

555555554000-555555556000 r-xp 00000000 00:25 51650383 /PIP/PIP/test/basics/basic
555555755000-555555756000 r--p 00001000 00:25 51650383 /PIP/PIP/test/basics/basic
555555756000-555555757000 rw-p 00002000 00:25 51650383/PIP/PIP/test/basics/basic
555555757000-555555778000 rw-p 00000000 00:00 0[heap]
7fffe8000000-7fffe8021000 rw-p 00000000 00:00 0
7fffe8021000-7fffec000000 ---p 00000000 00:00 0
7ffff0000000-7ffff0021000 rw-p 00000000 00:00 0
7ffff0021000-7ffff4000000 ---p 00000000 00:00 0
7ffff4b24000-7ffff4c24000 rw-p 00000000 00:00 0
7ffff4c24000-7ffff4c27000 r-xp 00000000 00:25 51408475/PIP/PIP/lib/libpip.so
7ffff4c27000-7ffff4e26000 ---p 00003000 00:25 51408475/PIP/PIP/lib/libpip.so
7ffff4e26000-7ffff4e27000 r--p 00002000 00:25 51408475/PIP/PIP/lib/libpip.so
7ffff4e27000-7ffff4e28000 rw-p 00003000 00:25 51408475/PIP/PIP/lib/libpip.so
7ffff4e28000-7ffff4e2a000 r-xp 00000000 00:25 51650383/PIP/PIP/test/basics/basic
7ffff4e2a000-7ffff5029000 ---p 00002000 00:25 51650383/PIP/PIP/test/basics/basic
7ffff5029000-7ffff502a000 r--p 00001000 00:25 51650383/PIP/PIP/test/basics/basic
7ffff502a000-7ffff502b000 rw-p 00002000 00:25 51650383/PIP/PIP/test/basics/basic
7ffff502b000-7ffff502e000 r-xp 00000000 00:25 51408475/PIP/PIP/lib/libpip.so
7ffff502e000-7ffff522d000 ---p 00003000 00:25 51408475/PIP/PIP/lib/libpip.so
7ffff522d000-7ffff522e000 r--p 00002000 00:25 51408475/PIP/PIP/lib/libpip.so
7ffff522e000-7ffff522f000 rw-p 00003000 00:25 51408475/PIP/PIP/lib/libpip.so
7ffff522f000-7ffff5231000 r-xp 00000000 00:25 51650383/PIP/PIP/test/basics/basic
7ffff5231000-7ffff5430000 ---p 00002000 00:25 51650383/PIP/PIP/test/basics/basic
7ffff5430000-7ffff5431000 r--p 00001000 00:25 51650383/PIP/PIP/test/basics/basic
7ffff5431000-7ffff5432000 rw-p 00002000 00:25 51650383/PIP/PIP/test/basics/basic
7ffff5432000-7ffff5435000 r-xp 00000000 00:25 51408038/PIP/GLIBC/libdl-2.17.so
7ffff5435000-7ffff5634000 ---p 00003000 00:25 51408038/PIP/GLIBC/libdl-2.17.so
7ffff5634000-7ffff5635000 r--p 00002000 00:25 51408038/PIP/GLIBC/libdl-2.17.so
7ffff5635000-7ffff5636000 rw-p 00003000 00:25 51408038/PIP/GLIBC/libdl-2.17.so
7ffff5636000-7ffff5639000 r-xp 00000000 00:25 51408038/PIP/GLIBC/libdl-2.17.so
7ffff5639000-7ffff5838000 ---p 00003000 00:25 51408038/PIP/GLIBC/libdl-2.17.so
7ffff5838000-7ffff5839000 r--p 00002000 00:25 51408038/PIP/GLIBC/libdl-2.17.so
7ffff5839000-7ffff583a000 rw-p 00003000 00:25 51408038/PIP/GLIBC/libdl-2.17.so
7ffff583a000-7ffff5850000 r-xp 00000000 08:03 1574997/usr/lib64/libpthread-2.17.so
7ffff5850000-7ffff5a50000 ---p 00016000 08:03 1574997/usr/lib64/libpthread-2.17.so
7ffff5a50000-7ffff5a51000 r--p 00016000 08:03 1574997/usr/lib64/libpthread-2.17.so
7ffff5a51000-7ffff5a52000 rw-p 00017000 08:03 1574997/usr/lib64/libpthread-2.17.so
7ffff5a52000-7ffff5a56000 rw-p 00000000 00:00 0
7ffff5a56000-7ffff5a6c000 r-xp 00000000 08:03 1574997/usr/lib64/libpthread-2.17.so
7ffff5a6c000-7ffff5c6c000 ---p 00016000 08:03 1574997/usr/lib64/libpthread-2.17.so
7ffff5c6c000-7ffff5c6d000 r--p 00016000 08:03 1574997/usr/lib64/libpthread-2.17.so
7ffff5c6d000-7ffff5c6e000 rw-p 00017000 08:03 1574997/usr/lib64/libpthread-2.17.so



16年12月20日火曜日

プロセス切り替えの時間

TLBミス回数の比較• 前ページと同じ条件の時の dTLBミス回数を比ス切り替えを発生させる（それぞれ1,000回）

6E+6

4,000
3,000

1,000
200

1000

2000

1,000

10100
1000
Wroking set size [KiB]

2E+6
1E+6
0E+0

2,000

01

3E+610000



While page table
sharing is expected behavior(x86)of PiP, elimload̲cr3関数はLinuxination of context switches may depend on OS implementaでアドレス空間を切り替える
tion. The following experiment verifies that context switches
are indeed eliminatedin Linux. Table 4 shows the number
際に呼ばれるカーネル関数
of load_cr3 Linux kernel function calls measured by using
副次的に、キャッシュやTLB
systemtap (version3.0/0.166) [18]. The load_cr3 function
is used for settingが無効になり、オーバヘッド
the root of a new PT to the CR3 registerof an x86 CPU [28]. When a context switch takes place,が大きい
the register is updated
to the new page table root. As aresult, the first level cache which is indexed by virtual address and all TLB entries are invalidated. This implies acertain amount of overhead due to the context switch [30].
In this evaluation program (based on the program in [43]),
one child task is created and there are two futex variables
between the root and child running on the same CPU core.
Each task waits on a futex and unlocks the other, resulting in

Fork-load

2,000

Thread-store

5,000

4E+6

Thread-load# dTLB Miss EventsContext switch overhead [ns]6,000Table 4: Number of load_cr3 function calls
PIP Pthread
Fork
74.1
53.0
794535.4

5E+6

PIP-store

PTHREAD

7,000

PIP-loadPIP

較する

the figperspe
the cos
imposeFork-store• 同一コア上で、50プロセスを走らせて、プロセ
FORK

Figure 9 shows the result of this microbenchmark, comparing the total PT sizes for PiP tasks, Pthreads and regularprocesses over the number of child tasks. Figure 9 clearly
demonstrates the relationship described in Table 3. As seen,
regular processes have close to linear increase in PT memory
consumption as the shared segment requires private mappings in each process. On the other hand, PiP tasks exhibit
scalability similar to Pthreads.
possible OBJECTION: use hugepages instaad !!

Finasure thover ththis fig

プロセス生成の時間• 同じコア上で15プロセス／スレッドを生成する

mmap/munmap 時間の評価のに要した時間の比較

Time (15 tasks, 1,000,000 iterations) [Sec]0.06
Time to spawn 50 tasks [Sec]wait

dlmopen

spawn

0.05
0.04
0.03
0.02
0.01
0PIP

PthreadFork&Exec

Vfork&Exec PosixSpawn



アプリの実行時間の比較
0.04

Relative4Performance

0.03
0.02
0.01
0!0.01
!0.02
!0.03

PIP
PIE
staticPIPPIEstatic
PIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
static!0.04

B

BT4 ! GNUA

B

CG4! GNUA

B

EP4! GNUA

B

A

FT4 ! GNUB

IS4 ! GNUAB

LU4! GNUA

B

MG4! GNU

A

Fork

24
23
22
21
2
1.5
1
0.5
-01

10
100
1000
mmap/munmap size [KB]

10000

Functional View
Address Space
ThreadPID, wait(), exit()
Process
Signal
Process
File DescriptorsProcess*SessionProcess

0.05

A

Pthread

PiPのまとめ• PiP上でのアプリ実行で遅くなることはない
!0.05

PIP

B

* depending on clone() flag setting

SP4! GNU

0.05
0.04

Performance View
Context Switch
ThreadPage Table
Process
mmap/munmap
ThreadRelative4Performance

0.03
0.02
0.01
0!0.01
!0.02
!0.03

!0.05

PIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
staticPIP
PIE
static

!0.04

A

B

BT4 ! IntelA

B

CG4! IntelA

B

EP4! IntelA

B

FT4 ! IntelA
IS4 ! Intel

B

A

B

LU4! IntelA

B

MG4! IntelAB

SP4! Intel



共同研究

最後に

• 米アルゴンヌ研究所• Casper + PiP• 仏 CEA• MPC + PiP• 米テネシー大学• Open MPI + PiP

• 現在 PiP を用いた論文を執筆中• 採択されたらすぐに公開（オープンソース）



