1

スーパーコンピュータ超入門講習会
九州大学情報基盤研究開発センター

2

今日の内容
1. スーパーコンピュータの仕組み
2. スーパーコンピュータの使い方
3. 九州大学のスーパーコンピュータ ITOの紹介
4. Q & A3

今日の内容
1. スーパーコンピュータの仕組み
2. スーパーコンピュータの使い方
3. 九州大学のスーパーコンピュータ ITOの紹介
4. Q & A4

突然ですが、「富岳」って知ってますか？
• 2020年6月に世界一になった

理化学研究所のスーパーコンピュータ• 何が世界一？

https://www.fujitsu.com/jp/about/businesspolicy/tech/fugaku/

種目

性能

説明

TOP500415.53PFLOPS

密行列連立一次方程式の求解13.40 PFLOPS（2位の IBM Summitの約 4.6倍）

科学技術シミュレーションで使う有限要素法に現れる疎行列連
立一次方程式の求解70.98 GTEPS

最短経路探索等の問題に現れるグラフ探索

1.421 EFLOPS

機械学習で多用される混合精度実数計算を連立一次方程式求解に応用した反復的な解法（FP64 (64bit浮動小数点数) から計算途中で FP32, FP16,
BF16に変換して求解し、元の方程式に代入して誤差計算し、補正、を繰り返す）

HPCG
Graph500
HPL-AI（2位の IBM Summitの約 2.8倍）（2位の Sunway TaihuLightの約 3倍、3位の IBM Summitの約 9倍）

5

そもそも
スーパーコンピュータとは？
• あえて言えば、「スーパーな計算機」• 実は、明確な定義はない• 計算機は時代とともに高速化、高機能化⇒

スーパーコンピュータ

条件を定めるのは困難• 今のPCは20年前の世界一のスーパーコンピュータより高速• 一般に、「同じ時代の他の計算機より、明らかに速い計算機達」のことをスーパーコンピュータと呼んでいる
では、計算の速さとは？

サーバ、ワークステーションPC
スマートフォン

6

計算機の速さ• ある時間の間に実行できる演算の回数• 最もよく使われる指標： 「フロップス」

FLOPS (FLoating-point Operations Per Second)• floating-point operation= 浮動小数点計算= 計算機で行われる実数計算

7

計算機の速さの限界• 計算機の理論演算性能（FLOPS）：

P=NxCxO• 物理的に、これ以上速く計算することは出来ない
パラメータ

説明

N

その計算機内の CPUの数（簡単のため、ここではCPUによる理論演算性能だけ計算）

C

その CPUのクロック周波数（Hz）= 一秒間に回路の状態を変える回数= （だいたい）一秒間に命令を実行する回数

O

一つの CPUが一回のクロックで同時に実行できる演算数

Nと Cは、計算機の仕様でだいたいわかる。
O は、なにによって決まる？

CPU

8

一般的なCPUの構成• 一つ、または複数の「コア」で構成• コアに「演算器」を一つ、または複数

CPU
https://www.r-ccs.riken.jp/wp-content/uploads/2020/05/A64FX_Chip_S.png

搭載

コア• 各演算器は SIMD (Single

Instruction Multiple Data) 演算可能
• 一度に複数のデータに同じ演算を適用

C+AxB• 積和演算器で足し算と掛け算も同時に実行

O = CPU内のコアの数
x コアが一回のクロックで実行できる最大の演算数

C

A

B

演算器

9

例）富岳の構成• システムを構成する計算ノード（サーバ）の数： 158,976 台• 計算ノードあたりのCPU数： 1 個• CPUのクロック周波数： 2 GHz• CPUあたりのコア数： 48個• 別にアシスタントコア（後述）が 2～4個N
https://www.fujitsu.com/jp/about/businesspolicy/tech/fugaku/

C

メモリ

計算ノード
CPU

O

• コアあたりの最大同時演算数： 32
総理論性能 P = N x C x O
488,374,272 GFLOPS（ギガ フロップス）= 約 488 PFLOPS（ペタ フロップス）
一秒間に 48.8京回の演算が出来る
Kilo = 103 , Mega = 106 , Giga = 109 , Tera = 1012 , Peta = 1015 , Exa = 1018

コア
演算器

10

スーパーコンピュータ と
PC、スマートフォン
スマートフォン
(Snapdragon 865)

PC
(Intel Core i910980XE)

https://livedoor.blogimg.jp/wisteriear/im
gs/1/a/1ac59590.jpg

https://d2tfhz5takygeh.cloudfront.net/contents/img/produ
cts/SC51A/SC51A_CosmicGray_XL.jpg

CPU数
クロック周波数
コア数

https://www.fujitsu.com/jp/about/businesspolicy/tech/fugaku/

1

1

158,976

1.8GHz,2.4GHz,2.84GHz

3.0GHz2.0GHz

計8

18

48

8?

32

32

137.92 GFLOPS

1,728 GFLOPS

488,374,272 GFLOPS

最大同時演算対象データ数
総理論演算性能

スーパーコンピュータ
富岳 (Fujitsu A64FX)

クロック周波数はほぼ同じ

CPU数やコア数で演算性能を稼ぐ
10

11

FLOPSは分かりにくいので、計算にかかる時間で比較• 理想的な計算時間： T = S / P• S: プログラム中の演算回数• P: 計算機の理論的な最高 FLOPS• 注意： 計算機は、絶対に、理想的には動かない• 演算器が動けない時間があるため• 計算するデータが CPUに届くまでの待ち時間• HDDから主記憶へ、主記憶から CPUへ

• CPU間やコア間で待ち合わせる時間• 同時に実行できる計算が少なく、演算器が空く時間

理想的な計算時間 = その計算に最小限必要な時間

12

プログラムの演算回数？
• 例えば、行列積 C = A x B のプログラムの場合
j
j
k
i
i
k
*
=

M3

B
C
A
for i = 1 to M
for j = 1 to M
2M
for k = 1 to M
M
C(i, j) = C(i, j) + A(i, k) * B(k, j)
2 演算

演算回数 ＝ 2 M3 回

13

行列積の計算に最小限必要な時間
M

Snapdragon 865(137.92 x 109 FLOPS)

Intel Core i9(1728 x 109 FLOPS)

富岳(488374272 x 109 FLOPS)

1000

0.015 秒

0.00012 秒

0.000000004 秒

10000

15 秒

1.2 秒

0.000004 秒

1000004 時間

0.32 時間

0.004 秒

1000000

167 日

13 日

4秒

10000000

460 年

37 年

1.1 時間PCで 37年かかる計算が、スーパーコンピュータだと約 1時間で終わる（かもしれない）
この速度の差は、ほぼ、CPUやコアの数によるもの

14

なぜ、CPUやコアを増やす？
• コア 1個の性能を上げる場合、

電力

電力が指数関数的に増加• 電力も、冷却能力も不足• 1個当たりの性能が低いコア＝ 電力当たりの性能が高いコアを多数並べた方が効率的• 限られた電力でシステム全体の性能向上

例） 1/10の性能を 1/100 の電力で達成
システム全体の電力当たり性能 10倍

性能
コアの性能と電力の関係

15

コア数の増やし方• CPUの中のコアの数を増やす• CPUの面積（電子回路の数）で制限• 通常、数個～数十個

https://www.r-ccs.riken.jp/wp-content/uploads/2020/05/A64FX_Chip_S.png• 計算ノードの中のCPUの数を増やす• 主記憶とCPUをつなぐ回路（バス）で制限• 通常、スーパーコンピュータでは1～2個程度

CPU

CPU

CPU

バス
Memory• 計算ノードの数を増やす• ネットワークを使って接続するため比較的増やしやすい• スーパーコンピュータでは数千台～数十万台• 富岳：158,976台

CPU

16

アクセラレータ• CPUコアよりも性能や機能が低い演算装置を多数配置• 基本的な演算（積、和など）を高い電力効率で実行• CPUからの命令に応じて動作• 通常、内部に専用のメモリ（デバイスメモリ）を搭載• 適宜、CPU側のメモリ（ホストメモリ）との間でデータ転送
アクセラレータ

CPU

演算装置群

デバイスメモリ

命令
結果

入力データ
メモリ

17

GPGPU (General Purpose computation on
Graphic Processing Unit)• グラフィック処理用プロセッサ GPUをシミュレーションや機械学習の計算に使用• どちらも大量の数値データに対して同じ処理を繰り返す計算が主体• 例) NVIDIA GA100:

3456 CUDAコア（一般演算用、9.7 TFLOPS）+ 432 Tensorコア（行列演算用、19.5 TFLOPS）•

https://www.nvidia.com/content/dam/en-zz/ja/Solutions/Data-Center/documents/nvidia-ampere-architecture-whitepaper-jp.pdf

https://www.nvidia.com/content/dam/en-zz/Solutions/Data-Center/a100/nvidia-a100-hgx-3qtr-front-left-2c50-d.jpg

18

アクセラレータを搭載した計算機の例• IBM Summit
総CPUコア数

IBM Summit

富岳

比率

202,752

7,299,072

ノード数

4,608

158,976

アクセラレータ

27,6480

総理論性能

194 PFLOPS

488 PFLOPS

理論CPU性能

5 PFLOPS

488 PFLOPS

電力

10.1 MW28.3 MW

2.8

TOP500性能

149 PFLOPS

416 PFLOPS

2.8

HPCG性能2.9 PFLOPS

13.4 PFLOPS

4.6

Graph500性能

7.7 GTEPS

70.98 GTEPS

9.2

445 PFLOPS

1,421 PFLOPS

3.2

HPL-AI性能

2.5

Summitは2年前のシステムなので優劣の比較はあまり意味が無い
ただし、Summitで HPCG、Graph500の性能が特に低い点は、重要19

アクセラレータの特徴• 長所• 基本的に、電力に対する性能が高い• 少ないノード数で高い性能が得られる• 特に GPUは、近年、性能向上が著しい• 例）NVIDIA A100
• V100 (Summitのアクセラレータ)の 2.5倍の性能を 1.3倍の電力で達成

https://www.nvidia.com/content/dam/en-zz/Solutions/Data-Center/a100/nvidia-a100-hgx-3qtr-front-left-2c50-d.jpg• 短所• 不得手なプログラムでは極端に性能が低い• プログラム開発が複雑• CPU用、アクセラレータ用のプログラム作成• ホストメモリ～デバイスメモリのデータ転送20

もう一つの問題：メモリの速さ• メモリから演算器にデータが届かないと演算が出来ない• 演算性能とメモリ性能

演算器のバランスが重要

メモリ

21

メモリの速度が足りない• 例） 富岳のCPUとメモリ• CPU:
Fujitsu PROCESSOR A64FX, 2.0GHz, 48コア, 最大32演算• メモリ： HBM2
CPUの演算性能
2演算（Y=A*X+B）当たりのデータ演算に必要なメモリ速度
メモリ速度

3,072 GFLOPS
read 24バイト
read 73,728 GB/秒
1,024 GB/秒

CPUの性能を約 1.3% しか利用できない？？

22

メモリの種類と速度• DDR4• ほとんどのPCやサーバに搭載• DDR5• 2020年7月に最終仕様発表、2021年に製品登場予定• HBM2 (High Bandwidth Memory)• 富岳、NVIDIAのGPU に搭載
メモリ

最大メモリ速度 容量

DDR4 2933 (Intel Xeon Gold)

140GB/秒~1.5TB

DDR4の約2倍

DDR4の約2倍

HBM2 (Fujitsu PROCESSOR A64FX)

1,024GB/秒

32GB

HBM2 (NVIDIA GA100)

1,600GB/秒

40GB

DDR5 (見込み)

どれも、演算器の演算速度に追いつかない23

キャッシュメモリとレジスタ• キャッシュメモリ：演算器とメモリの間に置く高速記憶装置

演算器

レジスタ

階層

速度

容量

1次

約 128バイト/クロック

32KB / コア

2次

約 32バイト/クロック

256KB / コア

3次

約 16バイト/クロック

36MB / CPU• レジスタ：演算器が直接参照できるデータの置き場所

キャッシュメモリ• 例） Intel Xeon Gold

１次
２次
３次
メモリ

キャッシュやレジスタのデータをうまく再利用できればCPUの性能を発揮24

データの再利用= 「参照の局所性」• 時間的な参照の局所性• 一度演算に使ったデータを、連続して何度も使う• 空間的な参照の局所性• 一度演算に使ったデータのすぐ近くのデータを連続して使う• 例） 行列同士の積の計算

for i = 1 to M
for j = 1 to M
for k = 1 to M
C(i, j) = C(i, j) + A(i, k) * B(k, j)

j

j
i
+

時間的な
参照の局所性C(i, j)

i

k
*

空間的な
参照の局所性A(i, k)k
B(k, j)25

スーパーコンピュータの全体構成
core

計算ノード

CPU
Memory…

高速ネットワークInternet
ログインノード

共有ストレージ

26

計算ノードの構成• 必ず載っているもの：• 1個～複数個の CPU• メモリ• ネットワークインタフェース
等CPU
MemoryNIC• システムによって載っている場合があるもの：• ディスク （HDD or SSD）
• 用途： OS起動用、一時的なデータ格納用、等• ディスクを搭載しない場合もある• ネットワーク経由で OSを起動⇒ 電力、故障率の低減、省スペース• アクセラレータ （GPU等）• 用途： 特定の計算を高速化

Accelerator

Local storage

CPU
MemoryNIC

27

CPUとメモリの位置関係• ノード内の「近い」メモリ• 直接読み書き可• 高速• ノード内の「遠い」メモリ• 直接読み書き可• 若干遅い…

• 他ノードのメモリ• 直接読み書き不可• ネットワーク越しに通信

• 遅い

近いメモリ

遠いメモリ

他のノードのメモリ

特にノード間の計算とデータの配置が性能に大きく影響28

ログインノード• 外部からログインし、対話的に操作できるノード• 通常、計算ノードとは別に用意• 計算ノードを計算に専念させるため• 計算ノードと CPUや OSが違う場合も• 富岳では2種類用意• Intel Xeonサーバと、ARMサーバ• 主な用途• 外部とのファイル転送• プログラムやデータの準備• 計算ノードへの計算依頼• 計算結果の処理

等Internet

29

共有ストレージ• 計算ノード、ログインノードと、複数本の高速ネットワークで接続• 多数のノードが同時に読み書きすると性能低下• 富岳の場合• 第一階層• 16ノード毎に 1.6TBずつ• 主にキャッシュ領域として利用• 第二階層• 約 150PBを全ノードで共有• 第三階層（予定）• クラウドストレージ• Oracle Cloud Infrastructure

30

高速ネットワーク• 通信性能がスーパーコンピュータの性能に大きく影響• 複数のノードを使った計算• 大量のファイルアクセス• 富岳の場合• Tofu-D ネットワーク• 6次元メッシュトーラス構造• 2x3x2 = 12ノード単位で、格子状にノードを配置し、隣接ノード間を接続• 少ないコストで高速接続可能• 帯域幅：約 6.8GB/秒• 遅延：約 0.5μ秒
出典： http://www.ssken.gr.jp/MAINSITE/download/newsletter/2011/20110825-sci-1/lecture-5/ppt.pdf

31

今日の内容
1. スーパーコンピュータの仕組み
2. スーパーコンピュータの使い方
3. 九州大学のスーパーコンピュータ ITOの紹介
4. Q & A32

一般的なスーパーコンピュータの利用手順
1. ログインノードにログイン
2. プログラムやデータの準備
3. 計算ノードに「ジョブ」投入（実行完了待ち）4. 実行結果の処理

33

ジョブ
• 計算機にコマンド群の実行を依頼する

単位• ジョブの設定情報も併せて指定• 使用を希望するノード数、時間、等• ジョブスクリプトファイルに記述• ジョブ管理システム• 計算ノードが空いたら順にジョブ割り当て

ジョブ管理システム#!/bin/bash#PJM -L "rscunit=ito-a"#PJM -L "rscgrp=ito-s-dbg"#PJM -L "vnode=4"#PJM -L "vnode-core=36"#PJM -L "elapse=10:00"#PJM -j#PJM -X
export OMP_NUM_THREADS=36
for i in data1 data2 data3
dompiexec -n 4 ./run ${i}doneジョブスクリプトの例

空いている場所に割り当て
ジョブ

ジョブの
設定

コマンド

34

スーパーコンピュータは並列計算機• スーパーコンピュータの性能を発揮させる使い方：

計算を分担させ、計算時間を短縮• ノード、CPU、コア、演算器

逐次処理• 逐次処理の並列実行• ジョブ単位の並列計算• （１つのジョブで多数プログラムを実行）• プログラムの並列化• プロセス並列• スレッド並列• ハイブリッド並列• アクセラレータ、SIMD演算器で並列化

計算１
計算２
計算３

並列化
計算１

計算２

計算３

35

ジョブ単位の並列計算
ジョブ

入力データ

• 計算したい入力データやプログラムが多数ある場合、

簡単にスーパーコンピュータを活用• プログラムの改変なし• 出力ファイルに用心• 相互に上書きしないよう、ジョブ毎に出力ファイル名を変える36

１つのジョブで多数プログラムを実行• 実際には、ジョブ単位の同時並列数はシステム側で制限• 大量ジョブの制御はスーパーコンピュータでも大変・・・• 解決策：１つのジョブで多数のプログラムを実行• 便利なツール： GNU Parallel• スパコンの並列性を多数の（逐次）プログラムでも活用可能にする• ジョブ内キューを作って同時実行数を制限しながら順次実行
１つのジョブ

GNU Parallel
ジョブが使える計算資源（逐次）プログラム

37

プログラムの並列化• 計算を分割して、計算ノードやコアや演算器に分担させる• 必要に応じて、データも分割• 必要に応じて、通信を呼び出し• プログラムを「並列化」する必要がある場合：• 一つのプログラムで、一つの入力データに対して、出来るだけ速く計算したい• 一つの計算ノードではメモリが不足する

どのように分割するか？

38

並列化されていないプログラムの例：
２つのベクトルの和を計算• ０番目から９９番目までの要素を順に計算
0

...

99

A
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
C

プログラム

double A[100], B[100], C[100];...
for (i = 0; i < 100; i++)A[i] = B[i] + C[i];39

計算だけを分割： スレッド並列• スレッド ＝ 同じ記憶空間を共有しながらプログラムの実行を進める流れ

スレッド０
A

0

スレッド１

スレッド２

スレッド３

... 24 25 ... 49 50 ... 74 75 ... 99

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

全スレッドが
同じ配列を
共有

B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
C
double A[100],B[100],C[100];
double A[100],B[100],C[100];...
double A[100],B[100],C[100];for (i=0; i<25; i++)...
double A[100],B[100],C[100];...
for(i=25;i<50;i++)
A[i] = B[i] + C[i];for (i=50; i<75; i++) ...
A[i] = B[i] + C[i];A[i] = B[i] + C[i];for (i=75; i<100; i++)
スレッド０
A[i] = B[i] + C[i];

スレッド１

スレッド２

スレッド３

40

計算とデータを分割： プロセス並列• プロセス ＝ それぞれ独立した記憶空間を持ってプログラムの実行を進める流れ

A

プロセス０

プロセス１

プロセス２

プロセス３

0

0

0

0

... 24

A

A
B

+
+
+
+
+

+
+
+
+
+
C

... 24

=
=
=
=
=

B
+
+
+
+
+

C

... 24

=
=
=
=
=

B
+
+
+
+
+

C

A

=
=
=
=
=

=
=
=
=
=
B

... 24

C

各プロセスがdouble A[25],B[25],C[25];別の配列を利用...
double A[25],B[25],C[25];for (i=0;i<25;i++)...
double A[25],B[25],C[25];A[i] = B[i] + C[i]; for (i=0;i<25;i++)...
double A[25],B[25],C[25];A[i] = B[i] + C[i];for (i=0;i<25;i++) ...
プロセス０
A[i] = B[i] + C[i];for (i=0;i<25;i++)
プロセス１
A[i] = B[i] + C[i];
プロセス２

プロセス３

41

ハイブリッド並列• 各プロセスの中で複数のスレッドを実行

A

プロセス０

プロセス１

プロセス２

スレッド０
スレッド1

スレッド０
スレッド1

スレッド０
スレッド1

0-4 5-9

スレッド4...20-24

A...20-24A

スレッド4...20-24

AB

0-4 5-9

スレッド4...20-24

=
=
=
=
=

B

0-4 5-9

スレッド０
スレッド1

=
=
=
=
=

=
=
=
=
=

=
=
=
=
=
B

0-4 5-9

スレッド4

プロセス３

B
+
+
+
+
+

+
+
+
+
+

+
+
+
+
+

+
+
+
+
+
C

C

C

C

double A[25],B[25],C[25];...
for (i=0;i<5;i++)A[i] = B[i] + C[i];double A[25],B[25],C[25];...
for (i=0;i<5;i++)A[i] = B[i] + C[i];double A[25],B[25],C[25];...
for (i=0;i<5;i++)A[i] = B[i] + C[i];double A[25],B[25],C[25];...
for (i=0;i<5;i++)A[i] = B[i] + C[i];プロセス0スレッド0

double A[25],B[25],C[25];...
for (i=5;i<10;i++)A[i] = B[i] + C[i];プロセス0スレッド1

プロセス1スレッド0

double A[25],B[25],C[25];...
for (i=5;i<10;i++)A[i] = B[i] + C[i];プロセス1スレッド1

double A[25],B[25],C[25];...
for (i=20;i<25;i++)A[i] = B[i] + C[i];プロセス0スレッド4

プロセス2スレッド0

double A[25],B[25],C[25];...
for (i=5;i<10;i++)A[i] = B[i] + C[i];プロセス2スレッド1

double A[25],B[25],C[25];...
for (i=20;i<25;i++)A[i] = B[i] + C[i];プロセス1スレッド4

プロセス3スレッド0

double A[25],B[25],C[25];...
for (i=5;i<10;i++)A[i] = B[i] + C[i];プロセス3スレッド1

double A[25],B[25],C[25];...
for (i=20;i<25;i++)A[i] = B[i] + C[i];プロセス2スレッド4

double A[25],B[25],C[25];...
for (i=20;i<25;i++)A[i] = B[i] + C[i];プロセス3スレッド442

プロセス、スレッドとノード、コア• プロセスは、一つのノードの中で実行• スレッドは、プロセスに割り当てられたコアの一つで実行• 例） 2ノード x 12コアでの計算• 一つのコアに一つのスレッドを割り当てる場合

2プロセス x 12スレッド

4プロセス x 6スレッド

8プロセス x 3スレッド

43

アクセラレータ、SIMD演算器での計算• アクセラレータ• 専用のプログラム言語やインタフェースで、「アクセラレータに任せる計算」を記述• CUDA C（GPU用）の例__global__ void vectorAdd(const float *A, const float *B, float *C, int numElements){
int i = blockDim.x * blockIdx.x + threadIdx.x;
if(i < numElements)
C[i] = A[i] + B[i];}int main(void){...
vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, numElements);...
}• もっと簡単に記述できる方法も登場• OpenACC, OpenMP 4.0以降• SIMD演算器• 内部では、「SIMD命令」で並列処理• 多くの場合、コンパイラが自動的にSIMD命令に変換__m512 ax = _mm512_load_ps(&a[i]);__m512 bx = _mm512_load_ps(&b[i]);sumx = _mm512_fmadd_ps(ax, bx, sumx);

44

プログラム並列化の効果• 速度向上率＝(並列化前の実行時間) / (並列化後の実行時間)• 並列化によって何倍速くなったか

10時間

速度向上率 = 10.0

1時間
並列化前

並列化後

45

並列化に対する期待と現実• 期待:「ＣＰＵを 4台使うんだから，並列化で 4倍速くなって
欲しい」

• 現実:

「ＣＰＵ 4台で 3倍くらい速くなれば十分だろう」• 探索問題などでは、台数より速く結果が得られることはある• 主な理由• アムダールの法則• 負荷のバランス• 通信のコスト

46

アムダールの法則• プログラム中の高速化した部分しか高速化されない• 並列化にあてはめて考えると：並列化による性能向上率の理論的な限界＝1/((1-P)+P/N)• P: プログラム中の並列化対象部分が全処理時間に占める割合• N: プロセス数• Example) N=4 で 3.5倍以上高速化するためには 95%以上の部分の並列化が必要

47

負荷のバランス• 並列プログラムの実行時間は「最も遅いプロセスの実行時間」
である
全体の実行時間

全体の実行時間

プロセス0

プロセス0

プロセス1

プロセス1

プロセス2

プロセス2

プロセス3

プロセス3

48

通信時間
• 並列化前は不要だった時間
並列化前

Rank 0
並列化後

Rank 1
Rank 2
Rank 349

並列化以外の高速化も重要• コンパイラの最適化オプションを試す• キャッシュメモリやレジスタの利用効率を上げるようプログラムを改良する• 無駄な計算を省く

それでも速度が遅ければ、プログラムを並列化

50

誰がプログラムを並列化するか？
1. 既に誰かが並列化したプログラムを使う
2. 誰かが並列化したライブラリを使う
3. コンパイラに並列化させる
4. 自分で並列化する

51

１．既に誰かが並列化したプログラム• スーパーコンピュータセンターで用意されている

アプリケーションを確認• 並列化されていれば、マニュアルに「プロセス数」や「スレッド数」の指定方法があるはず• 並列化されたオープンソースソフトウェアの利用• コンパイル方法や実行方法の詳細は、センターの Webページ等を参照• 困ったらセンターに相談52

２．誰かが並列化したライブラリ• 主に行列計算の関数を提供

ライブラリ名内容

Fujitsu SSLII

連立1次方程式の直接解法・反復解法、逆行列、固
有値問題、
フーリエ変換、擬似乱数など

Intel Math Kernel Library

BLAS、LAPACK、ScaLAPACK、BLACS、PBLAS、
Sparse BLAS、疎行列演算関数（PARDISO含む)、
フーリエ変換、 偏微分方程式、非線形最適化ソルバ、
データフィッティング関数、GMP（多倍長計算）関数、 ベクトル化数学ライブラリ(VML)、統計関数（疑似乱数生成含む）

NAG Library

Numerical Algorithm Group社によって開発された
数値計算ライブラリ

FFTW

離散フーリエ変換

PETSc

偏微分方程式によって記述された問題を並列計算機上で高速に処理するための数値計算ライブラリ

53

３．コンパイラによる並列化• コンパイラが、プログラムのスレッド並列化や、SIMD命令の挿入を自動的に適用• ほとんどの C, C++, Fortranコンパイラで利用可能• GNU, Intel, Fujitsu, PGI, etc.
• 簡単なプログラムでは、それなりの効果• ループの中に関数呼び出しや条件分岐が入っていない• ループの繰り返し数が、コンパイル時に分かっている• ループの繰り返し順序が変わっても、計算結果が変わらない
等
それでも速度が遅ければ、自分でプログラムを並列化

54

４．自分で並列化• 最も一般的な方法：• OpenMP でスレッド並列化• MPI (Message Passing Interface) でプロセス並列化• 他にも：• Chapel• CAF (Co-array Fortran)• XcalableMP

55

OpenMPによる並列化• プログラム中に「指示行」を追加• コンパイラが指示に従ってスレッド並列プログラムを作成#include <omp.h>
double A[100], B[100], C[100];...
#pragma omp parallel forfor (i = 0; i < 100; i++)A[i] = B[i] + C[i];並列化指示行56

ＭＰＩ (Message Passing Interface)• 並列プログラム用に用意された通信関数群の定義• 例） プロセス０からプロセス１にデータを転送
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
自分のプロセス番号を取得...
if (myid == 0)
プロセス０がプロセス１に送信
MPI_Send(&(a[5]), 1, MPI_DOUBLE, 1,
0, MPI_COMM_WORLD);
if (myid == 1)
プロセス１がプロセス０から受信
MPI_Recv(&(a[3]), 1, MPI_DOUBLE, 0,
0, MPI_COMM_WORLD, &status);
プロセス0

MPI_Send

プロセス1

MPI_Recv

57

今日の内容
1. スーパーコンピュータの仕組み
2. スーパーコンピュータの使い方
3. 九州大学のスーパーコンピュータ ITOの紹介
4. Q & A58

九州大学のスーパーコンピュータ ITO(InfiniBand EDR 100Gbps)

59

ITOと富岳の比較
ITO

富岳

サブシステムA

サブシステムB

https://www.fujitsu.com/jp/about/businesspolicy/tech/fugaku/

総CPUコア数

72,0004608

7,299,072

ノード数

2,000

128

158,976

0

512

0

総理論性能

6.9 PFLOPS

3.0 PFLOPS

488 PFLOPS

理論CPU性能

6.9 PFLOPS

0.3 PFLOPS

488 PFLOPS

TOP500性能

4.5 PFLOPS

アクセラレータ

電力

約 2.0 MW416 PFLOPS
28.3 MW60

ITOのインターコネクトネットワーク• NVIDIA InfiniBand EDR• リンク当たりバンド幅: 12.5 GB/秒
• 通信遅延： 約 1μ秒• 形状： Fat Tree
• 機能： 遠隔メモリアクセス、集約演算オフロード

61

ITOの利用法• フロントエンド• 対話的に利用• ３０分単位の予約利用、

もしくは月単位の占有
利用• バックエンド• バッチジョブで利用想定している利用例- 大規模シミュレーション• バックエンド• ジョブでシミュレーション
プログラム実行• フロントエンド• 対話的に、- 入力データの作成- 計算結果の解析、可視化

ストレージ

入力データ作成

入力データ

計算結果

大規模計算

バックエンド

フロントエンド

可視化想定している利用例- データサイエンス• ストレージ• インターネット経由でデータ収集• バックエンド• 機械学習、解析オンラインデータ

収集
ストレージ
可視化

• フロントエンド• 学習データの作成• 結果の可視化

学習・解析

バックエンド

フロントエンド

64

ITOのソフトウェア
種類

ソフトウェア名

コンパイラ、
言語処理系

C / C++ / Fortran (Intel, 富士通, PGI, GNU),
Python, Java, etc

数値計算ライブラリ Intel MKL, 富士通 SSL II, BLAS/LAPACK, NAG, FFTW, PETSc
その他ライブラリ

HDF5, NetCDF

化学

Gaussian, Gaussview, CHARMM, VASP, Molpro, SCIGRESS,AMBER, GAMESS, GROMACS

流体・構造解析

Marc, MSC NASTRAN/Patran, ANSYS, OpenFOAM,
FrontFlow/Red

データ解析

SAS, ENVI/IDL, R

数値計算

MATLAB

機械学習

TensorFlow, Caffe, Chainer, CNTK

画像処理

FIELDVIEW, AVS
利用者からの追加要望にも、可能な範囲で対応

65

ITOの利用資格• 大学、高等専門学校又は大学共同利用機関の教員及び学生• 独立行政法人に所属する研究職員• 学術研究を目的とする研究機関でセンター長が認めた機関に所属し、専ら研究に従事する者• 外部資金を受けて学術研究を行う者• 民間企業等に所属する者で、別に定める審査機関における審査を経て、センター長が認めた者• その他特にセンター長が適当と認めた者

66

ITOの利用プラン （有料）
• 共有タイプ• 計算ノード群を複数のユーザで共有して利用• ノード固定タイプ• 割り当てられた計算ノード群を準占有的に利用

67

ITOの利用負担金• サブシステム A• 4ノード（共有）： 2,960円 / 月• 4ノード（固定）： 23,600円 / 月• サブシステム B• 1ノード（共有）： 2,100円 / 月• 1ノード（固定）： 17,000円 / 月• 基本フロントエンド• 2CPU x 24時間まで同時予約可能： 900円 / 月• 大規模フロントエンド• 8CPU x 24時間まで同時予約可能： 5,200円 / 月• ストレージ• 10TB： 340円 / 月

68

プロジェクト利用 （原則無料）• 先端的計算科学研究プロジェクト• ITOを対象に九州大学が公募（毎年度末締切）• HPCI (High Performance Computing Infrastructure)• 全国の共同利用スーパーコンピュータを対象に高度情報科学技術研究機構が公募• JHPCN (学際大規模情報基盤共同利用・共同研究拠点)• 全国の共同利用スーパーコンピュータを対象にJHPCNが公募（毎年1月締切）• JHPCN-Q• ITOを対象に、萌芽研究支援を目的として九州大学が公募（随時）69

申請から利用開始までの流れ
1. 利用申請
3. 利用（フロントエンド）• 利用プランの検討• 予約• 計算機利用申請書を記入• ログインしてプログラム実行• 申請書送付• 利用承認書発行（1週間程度） 4. 利用（バックエンド）• ジョブスクリプトの作成
2. 利用準備• ジョブ投入• 初期パスワード変更• 結果の確認• 公開鍵登録• 必要なファイルのアップロード、もしくは作成• プログラムのコンパイル

70

１．利用申請利用プランの検討

利用負担金表：https://www.cc.kyushu-u.ac.jp/scp/service/fee_list/• 共有タイプ or ノード固定タイプ• 最初は共有タイプの利用を推奨• 利用システム• 対話的な利用が不要な場合• サブシステム A:• CPUのみ、メモリ 192GB / ノード• サブシステム B:• CPU + GPU利用、メモリ 384GB / ノード• 対話的な利用が必要な場合• 基本フロントエンド： 384GBメモリ / ノード• 大容量フロントエンド： 12TBメモリ / ノード• 上記を組み合わせて利用可能• 使用ノード数• プログラムやデータによる• 使用メモリ量、一回の計算にかかる時間、同時に何個の計算を実行させるか、等• ストレージ• 10TB or 100TB例）今まで 4コア 16GBの PCで
１回１時間かかったプログラムを1000個のデータについて実行したい- 方法 １ プログラムを変更しない場合
・ITO サブシステムAを ４ノード利用
・4ノードで最大 16個のジョブ（データ）を同時実行（ノード当たり 4個ずつ）・所要時間： 約 64時間
- 方法 ２ GPUで 10倍高速化されたプログラムを利用できる場合
・ITO サブシステムBを 2ノード利用
・2ノードで最大 2個のジョブを同時実行
・所要時間： 約 50時間
- さらに、大量の計算結果からグラフを作成する
ために基本フロントエンド Sプラン
（2CPU * 24時間まで同時予約可能）- ストレージは、とりあえず 10TB
（足りなくなったら、研究室に退避するか、容量を追加申請）

71

１．利用申請
利用申請書の記入

利用申請書：
https://www.cc.kyushu-u.ac.jp/scp/service/guidance/application/• 利用タイプに応じて選択• 利用タイプを組み合わせて利用する場合は、両方提出

共有利用
利用は月単位固定ノード共有利用
研究費を管理している
会計担当の方に相談72

１．利用申請申請書の記入• 申請書２ページ目 （共有、固定ノード利用共通）• 全利用者の情報を記入• 外国籍や海外居住の方の利用承認には１か月程度必要

73

１．利用申請
利用承認書到着• アカウント• 初期パスワード

を確認

74

２．利用準備
初期パスワード変更• ITOポータルにアクセス

https://ito-portal.cc.kyushu-u.ac.jp/itoportal• 配布されたユーザIDと初期パスワードでログイン• 新しいパスワードを入力（２回）• 8文字以上• 変更後、反映されるまでに数分要します。

75

２．利用準備
公開鍵登録

公開鍵登録：
https://www.cc.kyushu-u.ac.jp/scp/system/ITO/02_login/2.html• 鍵ペア（秘密鍵、公開鍵）の用意• まだ作成していなければ、新規に作成• 注意： SSH-1(RSA)等の古い鍵ではログイン不可⇒ 新規に鍵ペアを作成• Windows:
端末エミュレータ（MobaXterm、Putty、TeraTerm等）に付属の作成ツール• macOS、Linux:
ターミナルで ssh-keygen• 公開鍵の登録• 本センター Webサイトを参照

76

２．利用準備
ファイルのアップロード

ファイル転送：https://www.cc.kyushu-u.ac.jp/scp/system/ITO/02_login/• Windowsの場合：

WinSCP• macOS, Linuxの場合： scpコマンド

77

２．利用準備ログインノードにログイン

ファイル転送：https://www.cc.kyushu-u.ac.jp/scp/system/ITO/02_login/• Windowsの場合：• 端末エミュレータを利用• MobaXterm, TeraTerm,

Putty, etc.

• Windows上の Linux• Cygwin,

Bash on Ubuntu on Windows,
etc.

• macOS, Linuxの場合：• ターミナルから sshコマンドでログイン$ ssh -i 秘密鍵ファイル名 -l ユーザ名 ito.cc.kyushu-u.ac.jp

78２．利用準備プログラムのコンパイル

コンパイラの利用方法：
https://www.cc.kyushu-u.ac.jp/scp/software/• 自作プログラムやオープンソースソフトウェアの場合• 利用可能コンパイラ (C / C++ / Fortran)• Intel Compier• GNU• Fujitsu• PGI• 例） Intel Compiler 2018の場合$ module load intel/2018.3$ icc -ipo -O3 -no-prec-div -fp-model fast=2 -xHost test.c -o test

79

３．利用（フロントエンド予約利用）
予約

フロントエンドの予約：
https://www.cc.kyushu-u.ac.jp/scp/system/ITO/frontend/

１．予約システムにログイン
https://ito-portal.cc.kyushu-u.ac.jp/itofront
２．システムの空き状況確認
３．自分の利用状況確認
４．予約

80

３．利用（フロントエンド予約利用）
ログイン• 利用の準備が出来たらメールで利用ノード情報を通知• IPアドレスを確認• ログインノードから、指定された IPアドレスにログイン$ ssh -Y 予約したホストの IPアドレス

81

３．利用（フロントエンドノード固定利用）
ログイン• 利用承認時に IPアドレス通知• 自分の PCから、指定された IPアドレスに直接ログイン82

３．利用（バックエンド）
ジョブスクリプトの作成• テキストファイルとして作成• ログインノードで編集、もしくは PCで編集したものをアップロード• 処理してほしい内容とジョブの内容を記述• 例） サブシステム Aを 1ノード利用するプログラムの実行#!/bin/sh#PJM -L "vnode=1"#PJM -L "vnode-core=36"#PJM -L "rscunit=ito-a"#PJM -L "rscgrp=ito-ss"#PJM -L "elapse=02:00:00"
module load intel/2018.3./test data1

83

３．利用（バックエンド）
ジョブ投入と結果確認• ジョブの投入$ pjsub test.sh[INFO] PJM 0000 pjsub Job 28246 submitted.

• ジョブの状態確認$ pjstat
ACCEPT QUEUED STGIN READY RUNING RUNOUT STGOUTHOLD ERROR
TOTAL
0
0
0
0
1
0
0
0
0
1
s
0
0
0
0
1
0
0
0
0
1
JOB_ID
28246

JOB_NAME
MD ST USER
test-mpifc NM RNE k70043a

START_DATE
10/04 09:34:06

ELAPSE_LIM NODE_REQUIRE
0000:05:00 -• ジョブの結果確認
$ ls
test

test.ctest.shtest.sh.i28246

test.sh.o28246

VNODE
1

CORE V_MEM
36
unlimited

84

３．利用
ITOポータル• Webインタフェースでバックエンドを利用可能• ファイル転送• コンパイル• バッチジョブ投入• 結果確認• 利用方法• 「メイン」タブの、「マニュアル」の「ITO Portal」を参照

85

Q&A
• ITOの情報• https://www.cc.kyushu-u.ac.jp/scp/system/ITO/• ITO、スーパーコンピューティングに関する問い合わせ• E-mail: zenkoku-kyodo@iii.kyushu-u.ac.jp• 九州大学

情報システム部情報基盤課 全国共同利用担当