内容に関する質問はkatagiri@cc.nagoya-u.ac.jp
まで

2024年2月28日（水）１０：００～１７：３０
Zoomによるオンライン開催

第66回 スーパーコンピュータ「不老」
利用型講習会 MPI（初級）名古屋大学情報基盤センター 片桐孝洋

1「不老」利用型MPI講習会

プログラム

9：30 - 10：00 受付（ZOOM接続可能）

10：00 - 10：30 端末設定など（演習） スーパーコンピュータ「不老」TypeⅠサブシステム（以降、FX1000システ ム）へのログイン
 FX1000システムへのジョブの投入方法

10 :30 – 12 :00 （演習） 名古屋大学情報基盤センターの計算機および利用形態
 FX1000システムの計算機構成、利用方法
 サンプルプログラムの実行

13：30 - 15：00 並列プログラミングの基本（座学）
 並列計算の基礎、性能評価指標、アムダールの法則
 MPIインターフェース説明、集団通信関数（コレクティブ通信）
 データ分散方式
 先進的並列化技法：
2

ピュアMPI実行、ハイブリッドMPI実行、NUMA最適化、など「不老」利用型MPI講習会

プログラム 15：15 - 17：00

MPIプログラム並列化実習（演習） 行列-行列積の並列アルゴリズム
 行列-行列積の並列化実習１（簡易並列化方式での演習）
 行列-行列積の並列化実習２（完全並列化方式での演習）
 17:00 - 17:30 自由演習、および、スパコン利用相談会

3「不老」利用型MPI講習会

名大情報基盤センターのスパコンのご紹介

4「不老」利用型MPI講習会

スーパーコンピュータ「不老」の役割
１．全国共同利用・共同研究拠点として学内外へ計算資源提供


全国共同利用・共同研究拠点として国が位置づけ全国の研究者の世界トップレベル研究を強力に支援
HPCI (High Performance
世界トップレベル
Computing Infrastructure) 利用者
研究の支援

国策スパコン
利用支援

簡便な
移行支援

導入支援／高性
能化／特殊処理／長時間実行名大拠点利用者
JHPCN利用者

名大「不老」
TypeⅠシステム（富岳型ノード）

２．ものつくり企業支援（地域イノベーションコア形成）

スーパーコンピュータ「富岳」

世界トップレベル
研究成果創出

産業利用制度（公開、非公開）



計算機利用型講習会による並列処理・大規模計算普及（地域特有の中小企業支援）

３．新しい計算需要に向けたサービス開拓

データサイエンス（ビッグデータ）、AI基盤の提供による新サービスの開拓

４．指定国立大学として重要な役割


数理・データ科学教育

人材育成・研究力強化・社会との連携

5・数理データ科学分野の人材育成
・AI技術基盤提供 （大規模AI計算基盤、
大規模ストレージ、サイバーフィジカル）・技術コンサルティング・・・等による社会貢献ユーザの研究分野の変遷※2020年10月現在

スーパーコンピュータ「不老」
旧システム（FX100）
総合領域

10% →

2%
2…
5% 10%「総合領域」
の割合向上

1%
2%
5%

21％

4%
5%
6%

化学

数物系科学

9%
化学

「情報学」
分野ユーザ数
31 →105

AI・データサイエンス研究が増加？
6

7%
4%
5%

工学

22%
10%

21%

26%

34%
工学

総合領域

20%
数物系科学

総合領域

複合新領域

人文学

社会科学

数物系科学

化学

工学

生物学

農学

医歯薬学

「不老」利用型MPI講習会

スーパーコンピュータ「不老」の特徴
 以下の新しいスパコン利用法を提供しています: ① TypeⅠサブシステム（｢富岳｣型）による超並列処理
 ② TypeⅡサブシステム（GPUクラスタ）による大規模機械学習 ③ 数値計算 ＋ AI 処理
 ④ ①～③のシームレスなデータ可視化 ⑤ ①～④で必要な大規模・堅牢なデータ蓄積
 ④に必要なTypeⅢサブシステム（大規模共有メモリ（48TB））、精細／遠隔可視化装置が、伝統的に名古屋大学は充実
 ⑤のコールドストレージ（100年保存可能な光ディスク）搭載スパコンは業界初
7「不老」利用型MPI講習会

名古屋大学情報基盤センターのスパコン利用の特徴
 計画書提出なし／論文出版等の義務なく利用可能
名古屋大学拠点利用の場合（HPCI、JHPCN利用を除く）
 年間随時募集（ただし、提供資源がなくなった場合を除く）
 アカデミックの方

研究目的（平和利用）、予算確保（運営費、科研費等）が明確であれば、必ず利用承認されます 研究目的の記載は数行
 成果報告書は１ページ
 事実上、発表・出版論文などの情報の登録をお願いするのみ
 申込書提出後、１週間程度で承認、アカウント発行


民間利用の方
課題の計画書提出が必要
 審査委員会で審議の上で承認（１～２週間程度）。
その後、アカウント発行。
 報告書はアンケート程度
8「不老」利用型MPI講習会

スーパーコンピュータ「富岳」との連携
同型計算機・同一ソフトウェアスタック

1.

「不老」TypeⅠサブシステムはCPUが「富岳」と同型
 OS・コンパイラ等のソフトウェアスタックも同一と想定


国策ソフトウェアの「不老」TypeⅠサブシステムのプリインストール・講習会実施

2.


国費開発ソフトウェアで「富岳」で動作するソフトウェアのいくつかを、
一般財団法人 高度情報科学技術研究機構（RIST）の協力のもと、「不老」TypeⅠで提供、ハンズオン講習会も実施
☞講習会予定をご覧ください「富岳」向けチューニングと「富岳」への移行支援

3.


9

☞「不老」のほうがより進んだバージョンが提供される可能性がありコンサルティング・教員との共同研究で「富岳」向けと想定される
コードチューニング（☞「不老」TypeⅠ向けと等価）を支援します「不老」利用型MPI講習会

名古屋大学情報基盤センターのスーパーコンピュータ
スパコンの歴史「不老」導入96

00

Fujitsu M-1800

05

13
Fujitsu HX600,
M9000

Fujitsu GP7000F/90

メインフレーム系

09

Fujitsu HPC2500

15
Fujitsu
CX400

20
CX400

Fujitsu VPP5000

ベクトル型スパコン

複合型「不老」Fujitsu CX2570

アプリケーションサーバ

GPUサーバ

スカラー型スパコン

Fujitsu VPP500

24

Fujitsu FX1Fujitsu
FX10

スーパーコンピュータ

FX100

Fujitsu FX1000
超並列

HPE Super
Dome Flex
大規模共有メモリこれまで約5年間隔でリプレイス
「不老」も5年弱（4年9ヶ月）の稼働を予定
10「不老」利用型MPI講習会

HPE ProLiant
DL560
クラウド

次
期
不
老
へ

設置状況
 7月1日、スーパーコンピュータ「不老」が稼働開始しました。現在も順調に稼働中です。
 名古屋大学 情報基盤センター 本館地下1階の様子
Type II

計算機室入口クラウド

クラウド

Type I
Type III

Type II
Type I11

計算機室入口「不老」利用型MPI講習会

スーパーコンピュータ「不老」
主な構成要素Type I, II, III, クラウドの合計で15.886PFLOPS（旧システムの約4倍）

7.782 PF7.489 PF

77.414 TF

537.6 TF

Type Iサブシステム

Type IIサブシステム

Type IIIサブシステム

クラウドシステム

FUJITSU Supercomputer FX1000「富岳」型

FUJITSU Server PRIMERGY CX2570 M5
GPUスパコン

HPE Superdome Flex
大容量メモリ・可視化

HPE ProLiant DL560
バッチ＆インタラクティブ

ホットストレージ

30 PB

12

FUJITSU PRIMGERY RX2540 M5
FUJITSU ETERNUS AF250 S2
DDN SFA18KEDDN SS9012「不老」利用型MPI講習会

コールドストレージ
SONY PetaSite 拡張型 Library

6 PB

性能諸元（主要サブシステム群）
Type II

Type III

クラウド

CPU

A64FX ×1
(Armv8.2-A + SVE)
48+2コア、2.2GHz

Xeon Gold 6230×2(Cascade Lake)
20コア、2.10-3.90 GHz

Xeon Platinum 8280M×16(Cascade Lake)
28コア、2.70-4.00 GHz

Xeon Gold 6230×4(Cascade Lake)
20コア、2.10-3.90 GHz

メインメモリ

HBM2, 32GB

DDR4, 384GB

DDR4, 24TB

DDR4, 384GB

GPU-

Tesla V100×4 (Volta)
HBM2, 32GB

Quadro RTX6000×4 (Turing)
GDDR6, 24GB

-

理論性能

3.3792 TFLOPS(DP)1,024 GB/s

・CPU
1.344 TFLOPS(DP)×2
140.784 GB/s×2
・GPU
7.8 TFLOPS(DP)×4
900 GB/s×4

・CPU
2.4192 TFLOPS(DP)×16
140.784 GB/s×16

1.344 TFLOPS(DP)×4
140.784 GB/s×4

ノード数

2,304

221

2

100

ノード間接続TofuインターコネクトD

InfiniBand EDR ×2

InfiniBand EDR

InfiniBand EDR

総理論性能

7.782 PFLOPS(DP)2.359 PB/s

7.489 PFLOPS(DP)857.8 TB/s

77.414 TFLOPS(DP)2.253 TB/s

537.6 TFLOPS(DP)56.314 TB/s

冷却方式

水冷

水冷

空冷

空冷

ノードあたりType I13「不老」利用型MPI講習会

消費電力・省電力対策
 最大消費電力
サブシステム名

 電力可視化
消費電力

TypeIサブシステム

628.1kVA

TypeIIサブシステム

393.5kVA

TypeIIIサブシステム

21.6kVA

クラウドシステム

93.0kVA

ストレージ

49.9kVA

フロントエンド

19.6kVA

運用管理システム他

52.3kVA

冷却設備

641.9kVA

合 計

14

1,899.9kVA

 湧水を用いた冷却地下の湧水を活用したら総合評価時加点 屋外チラーに散水して冷却

「不老」利用型MPI講習会

湧水による冷却システム
 情報基盤センターの地下は

夏季でも18℃程度の湧き水が毎分30L程度湧く
 この湧き水は、地下からポンプで吸い上げて雨水扱いで捨てていた 今回の仕様で、湧き水を冷熱源として使用する
場合は加点 冷却水としての利用許可・

水質検査済み15「不老」利用型MPI講習会

湧水による冷却システム

16「不老」利用型MPI講習会

湧水による冷却システム
 気温の高い

4月から11月の間で利用
 夏季の1日（2019年8月3日）の（旧）FX100システムの水冷チラーの
電気使用量(KW)

水の霧吹の温度低下
による電力削減

年間数百万円程度の電気代削減を予想
17「不老」利用型MPI講習会

使用最大電力の動的制御機構
 監視ソフトウェアから⼀定時間毎に電⼒値を取得
 出⼒された電⼒値と、あらかじめ規定したシステム全体の使⽤最⼤電⼒の上限値を⽐較し、最⼤電⼒の上限を超えないよう、計算ノードやジョブ実⾏可能範囲を制限
ピーク電⼒（例︓1.5MW）↓
電⼒マージン（例︓20%)（1.2MW）
12時間
以下で
変更
可能

電⼒上限（1.2MW）

ネットワークデバイス⽤監視ソフトウェア

定期的に格納定期的に⽐較
（例︓10分単位）

ログ整形→⽐較→条件分岐→
リソースグループ停止/開始
計算ノード制限
TypeⅠ/TypeⅡ / TypeⅢ/クラウドサブシステム
リソースユニット
リソースグループX

リソースグループW

リソースグループY

リソースグループZ

電⼒量センサーType I
サブシステムネットワークスイッチ群

18

電⼒値ログ
電⼒値ログ
電⼒値ログ

Type II
サブシステム

周辺装置群「不老」利用型MPI講習会

Hot Storage

Type III
サブシステムCold Storage

クラウド
システム

空調設備など各サブシステムの仕様と特徴：
Type I サブシステム
FUJITSU Supercomputer PRIMEHPC FX1000

機種名

計算ノード

CPU

A64FX (Armv8.2-A + SVE), 48コア+2アシスタントコア( I/O兼計算
ノードは48コア+ 4アシスタントコア ), 2.2GHz, 4ソケット相当の
NUMA

メインメモリ

HBM2, 32GiB

理論演算性能倍精度 3.3792 TFLOPS, 単精度 6.7584 TFLOPS, 半精度 13.5168
TFLOPS

メモリバンド幅

1,024 GB/s (1CMG=12コアあたり256 GB/s, 1CPU=4CMG)

ノード数、総コア数

2,304ノード, 110,592コア (+4,800アシスタントコア)

総理論演算性能

7.782 PFLOPS

総メモリ容量72 TiB

ノード間
インターコネクト

TofuインターコネクトD
各ノードは周囲の隣接ノードへ同時に合計 40.8 GB/s × 双方向 で通信可能（1リンク当たり 6.8 GB/s × 双方向, 6リンク同時通信可
能）

ユーザ用
ローカルストレージ

なし

冷却方式

水冷

19

 世界初正式運用のスーパーコンピュータ「富岳」型
システム
 自己開発のMPIプログラム向き
 超並列処理用
 AIツールも提供
ノード内構成「不老」利用型MPI講習会

各サブシステムの仕様と特徴：
Type II サブシステム
機種名
CPU
GPU

FUJITSU Server PRIMERGY CX2570 M5Intel Xeon Gold 6230, 20コア, 2.10 - 3.90 GHz × 2 ソケット
NVIDIA Tesla V100 (Volta) SXM2, 2,560 FP64コア, up to 1,530 MHz × 4ソケット

理論演算性能倍精度 33.888 TFLOPS (CPU 1.344 TFLOPS × 2 ソケット, GPU 7.8
TFLOPS × 4 ソケット)

メモリバンド幅

メインメモリ 281.5 GB/s (23.464 GB/s × 6 枚 × 2 ソケット)
デバイスメモリ 900 GB/s × 4 ソケット

GPU間接続NVLINK2 (1GPUから他の3GPUに対してそれぞれ50GB/s×双方向)

CPU-GPU間接続
ノード数、総コア数
総理論演算性能

PCI-Express 3.0 (x16)221ノード、8,840 CPUコア + 2,263,040 FP64 GPUコア
7.489 PFLOPS (CPU 0.594 PFLOPS, GPU 6.895 PFLOPS)

総メモリ容量
ノード間インターコネクト

メインメモリ 82.875 TiB、デバイスメモリ 28.288 TiBInfiniBand EDR 100 Gbps × 2, 200 Gbps

ユーザ用
ローカルストレージ

NVMe SSD 6.4TB, 一部ノードにて BeeGFS/BeeOND/NVMesh (ローカルストレージを使用した共有ファイルシステム) を提供

冷却方式

水冷

20

「不老」利用型MPI講習会

 データサイエンス研究、
機械学習用のGPUクラスタ型
 最新GPU (Volta) 4台／ノード
 充実したAIツール
 高速SSDローカルディスク

ノード内構成メインメモリ(DDR4 2933 MHz)：384 GiB (32 GiB × 6 枚 × 2 ソケット)
デバイスメモリ(HBM2)：32 GiB × 4 ソケット

計算ノード

メモリ

各サブシステムの仕様と特徴：
Type III サブシステム
HPE Superdome Flex

機種名

計算ノード

CPU

Intel Xeon Platinum 8280M, 28コア, 2.70 - 4.00 GHz × 16 ソケットGPU

NVIDIA Quadro RTX6000 × 4

メモリ

メインメモリ(DDR4 2933 MHz)：24 TiB (128 GiB × 12枚 × 16ソケット)
デバイスメモリ(GDDR6)：24 GiB × 4

理論演算性能倍精度 38.7072 TFLOPS (CPU 2419.2 TFLOPS × 16 ソケット)

メモリバンド幅

メインメモリ 2252.544 GB/s (23.464 GB/s × 12枚(6チャネル)
× 16ソケット)

CPU-GPU間接続

PCI-Express 3.0 (x16)2

総理論演算性能

77.414 TFLOPS (38.7072 TFLOPS × 2 ノード)

総メインメモリ容量

48 TiB

ノード間インターコネクト

InfiniBand EDR 100 Gbps

ユーザ用
ローカルストレージ

一方のノードに102.4 TB SSD、もう一方のノードに1008 TB 共有ストレージを接続

冷却方式

空冷

21

ノード内構成ノード数

 大規模共有メモリ（24TiB）
 プリポスト処理用・可視化処理用
 NICE DCVを用いたリモート可視化「不老」利用型MPI講習会

各サブシステムの仕様と特徴：
クラウドシステム
HPE ProLiant DL560

機種名

計算ノード

CPU

Intel Xeon Gold 6230, 20コア,
2.10 - 3.90 GHz × 4 ソケット

メモリ

メインメモリ(DDR4 2933 MHz)384 GiB (16 GiB × 6 枚 × 4 ソケット)

理論演算性能倍精度 5.376 TFLOPS(1.344 TFLOPS × 4 ソケット)

メモリバンド幅

メインメモリ 563.136 GB/s
(23.464 GB/s × 6枚 × 4 ソケット)

ノード数

100

総理論演算性能

537.6 TFLOPS(5.376 TFLOPS × 100 ノード)

総メインメモリ容量

37.5 TiB

ノード間インターコネクト

InfiniBand EDR 100 Gbps

ユーザ用ローカルストレージ

なし

冷却方式

空冷

22

 研究室クラスタから移行しやすい
Intel CPU搭載システム
 高いノードあたりCPU性能（４ソケット） 時刻を指定してのバッチジョブ・インタラクティブ
利用が可能

ノード内構成「不老」利用型MPI講習会

ホットストレージの仕様と特徴
メタデータサーバ(MDS)
機種名

FUJITSU PRIMERGY RX2540 M5

CPUIntel Xeon Gold 5222 (3.80GHz, 4コア) × 2

メインメモリ

DDR4 192 GiB

HDD

SAS 900 GB 10krpm × 2 (RAID1)Interconnect

InfiniBand EDR × 2

SAN

FibreChannel 32 Gbps &tiems; 2OS

RedHat Enterprise Linux

ノード数

4台

データストレージ(OSS/OST)
機種名

DDN SFA18KE × 1台
DDN SS9012 × 10 台

HDD

NL-SAS 14TB 7.2krpm × 730、RAID6 [8D+2P]
30 Device × 24 DCR Pool + 10HS

Interconnect

InfiniBand EDR × 8

搭載セット数

4

総容量
物理容量

40.32 PB (Global Spareを除く)

実効容量

約30.44PB

メタデータストレージサーバ(MDT)
機種名

FUJITSU ETERNUS AF250 S2

SSD

RAID1+0 [4D+4M] × 2 + 2HS
RAID1+0 [3D+3M] × 1 + 2HS

ノード数

1台

 HDD RAID
 大容量：30.44 PB （実効容量） 超高速アクセス性能：384 GB/s

23

「不老」利用型MPI講習会

コールドストレージの仕様と特徴
フェーズ2: 2021年2月1日より稼働
機種名

PetaSite拡張型 Library

総スロット数(最大搭載可能カートリッジ数)

1,980巻

総物理容量 / 最大搭載可能容量

6 PB / 10.89 PB

総ドライブ数20

ODAサーバ数

4

 6PBの大容量（スパコンで初） １度書き込み（追記）のみの光ディスクストレージ
 実験データ等の長期データ保存用 理論上100年データ保持可能
 水にぬれても読み出せる
 サービス終了後ユーザに光ディスクを返却

24「不老」利用型MPI講習会

全体システム構成

25「不老」利用型MPI講習会

高精細可視化システム
8Kタイルドディスプレイ

Type IIIサブシステム（HPE Superdome Flex）
77.4TFLOPS/48TiB MEM

185inchi 8K高精細大画面タイルドディスプレイ
（総解像度：7680×4320）
Samsung 46inchi Display×16

Intel Xeon Platinum 8280M(2.7GHz,28Core)×16CPU×2 24TiB×2
NVIDIA Quadro RTX6000×4×2
HDD:実効容量500TB(RAID6)×2, NVMe:51.2TB×2

4K

4K

Quadro RTX6000

光ケーブル

2K Display×4

4K

SINET
リモート
可視化

4K

2K Display×4

大規模共有メモリ：
24TiB ×2ノード

2K Display×4

HDMI

画像処理装置（Windows
可視化サーバ）スーパーコンピュータ共有ストレージ

2K Display×4

4K Display×4

Intel Xeon Gold 5122
3.6GHz 4 Cores, 512 GiB MEM
NVIDIA Quadro RTX8000
SATA SSD 2TB
光Disk 5.5TBドライブ ODS-D380U
ホットストレージ
DDN SFA18KE
総実行容量： 30PB

26

コールドストレージ
Sony ODA PetaSite 拡張型ライブラリ
搭載容量：6PB（5.5TB×1091巻）
最大容量：10.89PB（5.5TB×1980巻）「不老」利用型MPI講習会

スーパーコンピュータ「不老」
ソフトウェア利用環境
プログラム開発環境など
フロントエン Type I サブシ Type II サブシ Type III サブシ クラウドシステ 画像処理 サー オンサイト 利
ド システム
ステム
ステム
ステム
ム
バ
用装置
Intel Parallel
StudioComputing
Suite

コンパイラ
(Fortran, C/C++),
プロファイラ/デバッガ, MPI, 数値
計算ライブラリ○○

NVIDIAHPC SDK

コンパイラ(Fortran, C/C++,
OpenACC, CUDA
Fortran), プロファ
イラ/デバッガ, MPI,
数値計算ライブラリ○○

FUJITSUTechnical
Computing
Suite

コンパイラ
(Fortran,C/C++),
プロファイラ/デバッガ, MPI, 数値
計算ライブラリ○

Arm Forge
Proffesional
NVIDIA
CUDA SDK
Singularity

プロファイラ/デ
バッガ/最適化
GPU統合開発環境
コンテナ環境

その他

27

○

○

企業利用

●

●

○

●

○

○

○

○

●

○

○

●

GV, Gfortran,
GCC, perl, Python,Ruby, R, Emacs, vi,
nkf, etc.

○

OpenGL

○

○

○

●

○

○

○

○

●

○

○

○

○

●

スーパーコンピュータ「不老」
ソフトウェア利用環境
ライブラリ利用環境
フロントエンド Type I サブシス Type II サブシ
システム
テム
ステム

Type III サブシ クラウド サブシ 画像処理 サー オンサイト 利用
ステム
ステム
バ
装置

企業利用

FFTW, SuperLU,
SuperLU MT,
SuperLU DIST,METIS, MT-METIS,ParMETIS, Scotch, PTScotch, PETSc,
MUMPUS, Xabclib
数値計算
ライブラリ ppOpen-HPCライブラ
リ：ppOpen-APPL,
ppOpen-AT, ppOpenMATH

○

○

○

○

○

●

○

○

○

○

○

●

○

○

○

○

○

●

○

○

○

○

○

●

精度保障ライブラリ：
LINSYS_V,
DHPMM_F
入出力
NetCDF, Parallel
フォーマッ
netCDF, HDF5,
トライブラ
JHPCN-DFリ
画像処理
ソフトウエ OpenCV, Geant4アCaffe, Chainer, Keras,
PyTorch, TensorFlow,
Theano, Mxnet,
機械学習 ONNX
ソフトウエ
パッケージ：conda,
ア
Numpy, Scipy, scikitimage, pillow,
matplotlib, jupyterlab
28「不老」利用型MPI講習会

スーパーコンピュータ「不老」
ソフトウェア利用環境
解析ソフトウェア利用環境•*1 Type III サブシステムの会話型ノード(lm01)で利用可。
•*2 CPU並列版の他にGPU対応版が利用可。

フロントエンド システム

流体解析

OpenFOAM,
FrontFlow
blue/red

Type I サブ
システム

Type II サブ
システム

○

○

LS-DynaType III サブ クラウド サブ
システム
システム

画像処理
サーバ

オンサイト
利用装置

企業利用

○

○

●

○

○

●

○

構造解析

計算化学
解析

メッシャー

FrontISTR

○

○

AMBER

○

○ *2

○

Gaussian,Gamess,Gromacs,
LAMMPS,
NAMD

○

○ *2

○

●

Modylas

○

○

○

●

Pointwise

統合ソフトウHyperWorks
エア

29

○ *1

○
○ *2

○

「不老」利用型MPI講習会

スーパーコンピュータ「不老」
ソフトウェア利用環境
可視化ソフトウェア利用環境•*1 Type III サブシステムの会話型ノード(lm01)で利用可。

フロント
エンド
システム
リモート可 NICE
DCV
視化
FieldView
AVS/Expre
ss,
Paraview,
POV-Ray,
VMD
3D AVS
可視化ソ Player,
フトウエア ffmpeg,
ffplayIDL, ENVI

30

Type I
サブシス
テム

Type II
サブシス
テム

Type III
サブシス
テム

クラウド
サブシス
テム

画像処理 オンサイト
企業利用
サーバ 利用装置

○

○ *1

○

○

○

○

○

○

○

○

●

○

○ *1

○

○

●

○

○

○

●

MicroAVS○

3dsMax,VisualStudio Pro○「不老」利用型MPI講習会●

OSS活用事例
 タンパク質構造予測ソフト

AlphaFold2 を TypeⅡ
サブシステム上で簡単に利用できるように整備(2022年2月2日)
https://icts.nagoyau.ac.jp/ja/sc/news/maintenance/2022-01-28alphafold.html(source: https://github.com/deepmind/alphafold) AlphaFoldの利用規約が更新され民間利用のユーザも利用可能 分散ノードのSSDを利用可能とするNVMESHにデータベース配置⇒10時間以上かかるHHblits処理が10分に短縮

31「不老」利用型MPI講習会

Fujitsu PRIMEHPC FX1000の計算機アーキテクチャ

32「不老」利用型MPI講習会

FX100とFX1000のアーキテクチャ比較
FX100

FX1000(「不老」TypeI)

演算能力／ノード

倍精度：1.011 TFLOPS
単精度：2.022 TFLOPS

倍精度 3.3792 TFLOPS,
単精度 6.7584 TFLOPS,
半精度 13.5168 TFLOPS

演算コア数

32

48

アシスタントコア

2

2

SIMD幅

256

512

SIMD命令整数演算、ストライド＆間接ロード／ストアを強化

・8/16/32ビット整数演算
・Combined Gather (128バイ
ト アラインブロック単位)

L1Dキャッシュ／コア

64KB、4ウェイ

64KB、4ウェイ

L2キャッシュ／ノード

24MB

32MB, 16ウェイ/CMG

メモリバンド幅

480GB/秒

1024GB/秒

出典：https://www.ssken.gr.jp/MAINSITE/event/2015/20151028-sci/lecture-04/SSKEN_sci2015_miyoshi_presentation.pdf
https://monoist.atmarkit.co.jp/mn/articles/1905/07/news013.html

33「不老」利用型MPI講習会

FX1000計算ノードの構成

4ソケット相当、NUMA(Non Uniform Memory Access)Tofu D
Network

MemoryMemoryHMC2 8GB

L2 (12コアで共有、8MB)
L2 (12コアで共有、12MB)

ICC: L1データ
L1
L1
L1
L1
L1
キャッシュ
… L1… Core L1Core L1Core L1Core L1: L1データAssist.
Core L1Core L1Core L1Core L1
#0
#1
#2
#3
64KBキャッシュ
… Core Assist.
… …#9 Core#9 Core#10 Core#11 Core
Core
Core
Core
Core
#0
#1
#2
#3
#9
#9
#10
#11
64KB … Core
L1

L1

L1

L1

ソケット0 (CMG(Core Memory Group))
ソケット2 (CMG)
Core
Core
Core
Core
: L1データ#12 Core#13 Core#14 Core#15 Core
L1#12 L1#13 L1#14 L1

L1

L1

L1

ソケット１ (CMG)
ソケット3 (CMG)
HMC2 8GB

Assist.
Core Assist.
…

…

: L1データL1#15キャッシュ…
キャッシュ
L164KB
…
64KB

Core
Core
Core
Core
#20 Core#21 Core#22 Core#23 Core

… …L1

#20L1

#21 L1#22 L1

#23

L1

L1

L1

L1

L1

Core

L2 (12コアで共有、8MB)
L2 (12コアで共有、12MB)

MemoryMemoryノード内合計メモリ量：32GB
34

読込み：512GB/秒「不老」利用型MPI講習会
書込み：512GB/秒=合計：1024GB/秒

FX1000通信網：TofuインターコネクトD
計算ノード内１TOFU単位
ノード

ノード

ノード

ノード
ノード
ノード

ノード

ノード

1TOFU単位
間の結合用

ノード

ノード

ノード

35

ノード

ノード

・6本それぞれ6.8GB/秒×双方向=13.6GB/秒
・6リンク同時転送可能

各ノードは周囲の隣接ノードへ
同時に合計 40.8 GB/s×双方向 で通信が可能「不老」利用型MPI講習会

FX1000通信網：TofuインターコネクトD
３次元接続
１
TOFU
単位

１
TOFU
単位

１
TOFU
単位

１
TOFU
単位

１
TOFU
単位

１
TOFU
単位

１
TOFU
単位

36

１
TOFU
単位

１１
TOFU
TOFU
単位
単位

１１
TOFU
TOFU
単位
単位

１
TOFU
単位

１
TOFU
単位

１
TOFU
単位

１
TOFU
単位

１
TOFU
単位

１１
TOFU
TOFU
単位
単位

１１
TOFU
TOFU
単位
単位

１
TOFU
単位

１
TOFU
単位

１
TOFU
単位

１
TOFU
単位

１
TOFU
単位

１
TOFU
単位

 ユーザから見ると、X軸、Y軸、Z軸について、
奥の1TOFUと、手前の１TOFUは、繋がってみえます（３次元トーラス接続）
 ただし物理結線では
 X軸はトーラス Y軸はメッシュ
 Z軸はメッシュまたは、
トーラスになっています「不老」利用型MPI講習会

課金体系

37

「不老」利用型MPI講習会

スーパーコンピュータ「不老」
課金体系 (1/8)
 前払い定額制（プリペイド形式）
 利用すべき資源の料金を前払いして利用 利用ポイントに変換して利用

 単年度会計(４月１日～翌年３月３１日)
 年度途中で申込み可能だが、利用終了は年度末
 年度末に余った利用ポイントは没収

 一度の申込みで全てのサブシステムと可視化システムを利用可能
 Type I、Type II、Type III、クラウド
38

全て共通

「不老」利用型MPI講習会

スーパーコンピュータ「不老」
課金体系 (2/8)
 アカデミックユーザ（大学、研究機関など所属）

向けプラン
 基本負担金 利用登録1名につき年額10,000円（登録料）
 10,000⇒6,500利用ポイントを付加（他ユーザへの譲渡不可）
 追加負担金 1,000円単位で追加が可能
 50万円未満： 1円あたり1⇒0.65 ポイント付加
 50万円以上： 1円あたり1.25⇒0.8125ポイント付加
39「不老」利用型MPI講習会

スーパーコンピュータ「不老」
課金体系 (3/8)
 TypeIサブシステム（「富岳」型ノード）消費ポイント
 計算課金：利用ノード数×経過時間[s] × 0.0056
 基本負担金１万円＝0.65万ポイント付加で利用可能な目安
 １ノードを

約２１日 ⇒ 約１３．７日
 ４ノードを 約 ５日 ⇒ 約 ３．２日
 １０万円（基本利用料金１万円、追加料金９万円）＝6.5万ポイント付加で利用可能な目安
 １ノードを 約２０７日 ⇒ 約１３５日
 ４ノードを 約 ５２日 ⇒ 約 ３４日
 ８ノードを 約 ２６日 ⇒ 約 １７日
 １ノードの年間利用額：約１６万９０００円⇒約２５万８５００円
 保守日等を考慮し年間３５０日利用できると仮定、以下同様
40「不老」利用型MPI講習会

スーパーコンピュータ「不老」
課金体系 (4/8)
 TypeIIサブシステム（GPUノード）消費ポイント
 計算課金：利用GPU数×経過時間[s] × 0.007
 基本負担金１万円＝０．６５万ポイント付加で利用可能な目安
 １ノード（１GPU）を 約１７日 ⇒ 約１１．１日
 １ノード（４GPU）を 約 ４日 ⇒ 約 ２．６日
 １０万円（基本利用料金１万円、追加料金９万円）＝６．５万ポイント付加で利用可能な目安
 １ノード（１GPU）を 約１６５日 ⇒ 約１０８日
 １ノード（４GPU）を 約 ４１日 ⇒ 約 ２７日
 ４ノード（16GPU）を 約 １０日 ⇒ 約 ７日
 １ノード（４GPU）の年間利用額：約８４万７０００円⇒約１２８万５０００円
41「不老」利用型MPI講習会

スーパーコンピュータ「不老」
 Type III：１ソケット当たり２８コア
課金体系 (5/8)
 クラウド：１ソケット当たり２０コア
 TypeIIIサブシステム（大規模共有メモリノード）、

およびクラウドシステムの消費ポイント
 計算課金：利用ソケット数×経過時間[s] × 0.002
 基本負担金１万円＝０．６５万ポイント付加で利用可能な目安
 １ソケットを 約５８日 ⇒ 約３７．９日
 ４ソケットを 約１４日 ⇒ 約 ９．１日
 １０万円（基本利用料金１万円、追加料金９万円）＝６．５万ポイント付加で利用可能な目安
 ４ソケットを 約１４５日 ⇒ 約９５日
 ３２ソケットを 約 １８日 ⇒ 約１２日
 ２ソケットの年間利用額：約１２万１０００円⇒約１８万５０００円
42「不老」利用型MPI講習会

スーパーコンピュータ「不老」
課金体系 (6/8)
 会話型利用：
ログインノード上での処理の消費ポイント
 課金：無料 主にインストール作業での利用想定です。

計算利用はご遠慮ください。
 Type IIIサブシステム（会話型処理）の課金はありますのでご注意ください。
 各計算ノードの備えるinteractiveジョブクラスはバッチジョブ扱いの課金です（fx-interactive, cx-interactive, cl-interactive）
43「不老」利用型MPI講習会

スーパーコンピュータ「不老」
課金体系 (7/8)
 ホットストレージ ファイル課金
 １TB 以下の場合(Home + Large)：徴収しない
 ファイルの使用容量が１TB を超えた場合：

超えた容量について、１GB につき １日当たり 0.01 ポイ
ント 例) 2TB(2000GB)利用：1000GBが課金対象⇒ １０ポイント/日 ⇒３００円/３０日、３，５００円/３５０日（保守などで停止する日については徴収しない）※１２８TBを超える場合は、全体容量を考慮して、削除依頼をさせていただくことがあります【予定】。
※１２８TBを超える容量が必要な場合は、事前に相談ください。
44「不老」利用型MPI講習会

スーパーコンピュータ「不老」
事前納入の光ディスク６PB売り
課金体系 (8/8)
 コールドストレージ ファイル課金

切り後は、ユーザによる持ち込み
のみなります（上限１０PBまで）。
管理料１万円／年と格安です！
すでに、３PB程度が売れています！
ご購入はお早めに！

 １口：50TB
 １回だけ書き込める（追記可能）の光ディスク×10枚（１枚約5TB）
 ファイル負担経費（初回利用時のみ必要）：
１口 190,000円
 ファイル管理経費（毎年必要、基本負担金とは別）：
１口 10,000円※ユーザの利用終了時、もしくは、「不老」運用終了時に、
光ディスクを持ち帰りいただけます。
45「不老」利用型MPI講習会

46「不老」利用型MPI講習会

Windows/Mac OSを搭載したPCに、USB3.2又はUSB3.0で単体ドライブを接続して、専用のFilerソフトを使って利用できます。

光ディスクカートリッジ

単体ドライブ

詳細は、以下をご覧ください：47
https://icts.nagoya-u.ac.jp/ja/sc/pdf/pamphlet-cold-202012.pdf

スーパーコンピュータ「不老」
新サービス：ノード準占有利用
 ノード準占有利用
 1時間以内のジョブ実行開始を保証
 バッチ利用のみ １ノード、１ヶ月間の利用負担金
 Type IIサブシステム：

210,000円⇒330,000円（通常価格の約2.8倍）
 クラウドシステム：
62,000円⇒95,000円（通常価格の約2.8倍）
提供資源量が無くなり次第、受付終了
→お早めに
48

「不老」利用型MPI講習会

スーパーコンピュータ「不老」
新サービス：クラウドノード予約利用
 クラウドノード予約利用
 専用の予約システム「UNCAI」（Webブラウザで操作）でノードを予約して利用する
 利用料金 計算課金：利用コア数×経過時間[s] × 0.0001（ソケット当たりコア数を考えればバッチ実行と同等）
 １ソケット当たり20コア、10コア（0.5ソケット）から利用可能 利用可能なメモリ容量もコア数に比例 基本負担金1万円でXeon Gold 20コア1ソケットを約58日⇒約38日間使用可能
49「不老」利用型MPI講習会

スーパーコンピュータ「不老」
新サービス：グループ利用
 グループ利用

売れています！

 １口１０人まで、１０万円で100,000 ⇒ 65,000

ポイント付与 登録料なし
 個人利用（個別に１万円×１0人が個別に基本負担金を払う）との違い
 65,000ポイントを１0人で共有利用できます 個人利用では、購入した6,500ポイントを他者と共有できません
50「不老」利用型MPI講習会

お試し利用、リテラシー利用
 トライアルユース
 ソフトウェアの動作確認などを、無料で行える制度です。
 お1人様1回限りで申請できます。
 企業においては、同一の課で１回のみです。
 アカデミックユーザ（無審査）、企業ユーザ（書類審査）
 10,000ポイント付加（値上前と同じ）

 有効期限1ヶ月

 リテラシー利用（アカデミックユーザのみ）
 名大学内外の学部・大学院等の講義や演習で利用いただける制度です。
 利用登録25 件につき10,000 円、50,000ポイント付与（値上前と同じ）
 有効期限：上限6ヶ月（講義・演習実施期間に依存）
51「不老」利用型MPI講習会

スーパーコンピュータ「不老」
民間利用制度（産業利用）
 書類での審査があります。追加負担金も同額です。
 公開型
 １０アカウントまで２０万円
 アカデミック利用の料金の申込み金額に応じたポイント優遇
はございません。
詳しくは、産業利用のパンフレット
をご参照ください。

２倍（２０万円当たり１００,０００⇒６５,０００ポイント）
 企業名、課題名、報告書をWebで公開（延期制度あり）
 非公開型
 １０アカウントまで４０万円
 アカデミック利用の料金の４倍（４０万円当たり１００,０００ ⇒６５,０００ポイント） 外部に情報は非公開（ただし内部会議では情報が出ます）
52「不老」利用型MPI講習会

優先ジョブクラス（アカデミック・民間）
 TypeI、TypeII、クラウドの各サブシステム
 ポイントを通常の２倍消費することで利用可能な

ジョブクラス 専用のキューにジョブを投げることで利用 通常のジョブクラスが混んでいるときでも早く実行
したい、というユーザの利用を想定 （優先ジョブクラスも混んでしまったらすいません）

53「不老」利用型MPI講習会

コンサルティング
 並列化、利用高度化、ISVアプリの利用方法などに関するコンサルティングを行っています。
 本センター教職員や学内外の専門家で構成される専門分野相談員によるコンサルティング（面談）ができます。
Web受付 Q&A SYSTEM
各種ご質問、ご相談等は下記Webサイトからお問合せください。
 https://qa.icts.nagoya-u.ac.jp/

面談相談（※ZOOMによる遠隔面談も可）
実際に画面を見ながらなど、電話やメールでは伝えにくいご質問やご相談は面談でも受け付けています。
 事前にお約束の上、本センター3階図書室内のIT相談コーナーにお越しください。または、相談員が訪問させていただくことも可能です。
 連絡先：052-789-4366（IT相談コーナー直通）、または
上記のQ&A SYSTEMから54「不老」利用型MPI講習会

可視化設備 情報基盤センター可視化室（本館１階）
 可視化室の利用は予約制となります（無料）• 8K 185型タイルドディスプレイ
• 全天周映像視聴システム• 円偏光立体視システム など
55「不老」利用型MPI講習会

可視化設備 情報基盤センター可視化室（本館１階）
 可視化室の利用は予約制となります（無料）8K 185型
タイルド
ディスプレイ

16「不老」利用型MPI講習会

利用者支援室（２部屋） 情報基盤センター利用者支援室（本館３階）
 利用者支援室の利用は予約制となります（無料）57「不老」利用型MPI講習会

訪問者が現地で利用可能な機材


画像処理装置（1F可視化室）

Windows10が動作するデスクトップパソコン（１台）
対話型のプリ・ポスト処理や共有ファイルストレージの大容量ファイル取り扱い用
10Gbps SINETによる高速インターネットが利用可能USB外付けHDDやディスクメディア（Blu-rayディスク）を持ち込んでホットストレージに対するデータの読み書
きが可能
可視化室に設置された185インチ8K高精細ディスプレ
イに接続、大規模データの高品位なプリポスト処理やコンテンツ生成に活用可能

画像処理装置

オンサイト利用装置（3F利用者支援室）
Linuxが動作する計算サーバ（２台）
対話型のプリ・ポスト処理、スーパーコンピュータシ
ステムとの大容量ファイル取り扱い用
USB外付けHDDや光ディスクメディア（Blu-rayディスク）を持ち込んでホットストレージに対するデータの読み書きが可能予約制の部屋貸し切りで、ハードディスク持ち込み
で大規模データの入力、回収が可能

ODA単体ドライブコールドストレージの光ディスク
アーカイブと互換性のあるUSB接続
ドライブ
画像処理装置・オンサイト利用装置に接続して利用可能
58

オンサイト利用装置

ODA単体ドライブの貸し出しできます（宅配便で郵送できる専用ケースも有）ご相談ください「不老」利用型MPI講習会

スーパーコンピュータ「不老」
講習会等 開催情報（2024年2月～）
2023年度「不老」利用型講習会 開催予定
（オンライン開催）
2024年
 3月11日：OpenMP（初級） 3月12日：「不老」およびmdxオンライン
利用説明会
 2024年4月以降も、多数開催予定
 最新状況は以下のHPをご覧ください

https://www2.itc.nagoya-u.ac.jp/cgi-bin/kousyu/csview2.cgi
59「不老」利用型MPI講習会

スパコン利用の方法

60「不老」利用型MPI講習会

マニュアルなどの入手方法
 スパコンへのログインなど初歩的なことや最新のTips（便利な使い方）、最適化のためのお役立ち情報等
 情報基盤センターのWebページで誰でも入手可能
 「スーパーコンピュータ「不老」基本マニュアルおよび関連資料」
 http://www.icts.nagoya-u.ac.jp/ja/sc/usage.html
 各サブシステムのマニュアルなど
 HPC Portalからダウンロード
 「不老」のアカウントを持つ利用者のみがアクセス可能 https://portal.cc.nagoya-u.ac.jp/

61「不老」利用型MPI講習会

基本的な使い方 SSH公開鍵の設定、マニュアルの閲覧：

HPC PortalにWebアクセス
 バッチジョブ：SSHで接続し、バッチジョブシステムにジョブを登録
 クラウドシステムの時間指定ジョブ実行：Webシステム（UNCAI）から予約、時間になったらSSHで接続して利用
 多くのスパコンと同様、「不老」もバッチジョブシステムでプログラムの実行を管理
 多数のユーザの多数のジョブを効率よく処理するため

 利用者はSSH接続環境を整備しジョブスクリプトの書き方を習得する必要がある
62「不老」利用型MPI講習会

接続先（ログインノードとHPC PortalとUNCAI）
 SSH接続先
対象計算サブシステム

SSH接続先Type Iサブシステム

flow-fx.cc.nagoya-u.ac.jp

Type IIサブシステム

flow-cx.cc.nagoya-u.ac.jp

GPU搭載

Type IIIサブシステム

flow-lm.cc.nagoya-u.ac.jp

GPU搭載

Type IIIサブシステム（可視化用） post.cc.nagoya-u.ac.jp
クラウドシステム

備考

リモート可視化用

flow-cloud.cc.nagoya-u.ac.jp

 HPC Portal：https://portal.cc.nagoya-u.ac.jp/
 UNCAI：https://portal.cc.nagoya-u.ac.jp/reserve/

63「不老」利用型MPI講習会

共有ファイルシステム上の大規模ファイルの収納について
 /home領域は容量制限があります。性能的にも良くありません。
 １TB以上のデータは容量制限があり、デフォルト
設定では置くことができません。
 大規模ファイル、もしくは、高性能が必要なファイル
は、以下に収納してください /data/group１/の自分のID名があるフォルダの下 TypeⅡサブシステム利用の場合は、ノードローカルのメモリ(SSD)を一時的に使うことで高速化できる可能性があります。

64「不老」利用型MPI講習会

バッチジョブシステムの操作
 （スパコンでは一般的ですが）計算ノードにジョブを実行させたり情報を取得したりするには、内容と実行方法を記述したジョブスクリプトと、ジョブ制御用のコマンドを使います Type I, II, III, クラウドの各計算サブシステムで共通のジョ
ブ制御用コマンドが使えます 主なジョブ制御用コマンド
 pjsub：ジョブを投入する（プログラムの実行を指示する）
 pjstat, pjstat2（推薦）：ジョブの投入状況を確認する
 pjdel：投入したジョブを削除する
 各コマンドの詳細や指定できる引数については

manコマンドや--helpオプションで確認してください
65「不老」利用型MPI講習会

バッチジョブスクリプトの基本的な書き方
 シェルスクリプトで記述する#!/bin/bash -x#PJM -L rscunit=fx#PJM -L rscgrp=fx-small#PJM -L node=2#PJM --mpi proc=4#PJM -L elapse=1:00:00#PJM -j#PJM -S（-xを付けておくと出力ファイルにコマンド自体も出力される）
リソースユニット（利用するサブシステム）名をfx=Type Iに指定
リソースグループ（ジョブキュー）名をfx-smallに指定
2ノード実行合計4プロセス実行
最大実行時間を1時間に指定
標準エラー出力を標準出力に統合
実行時の統計情報を出力する

module avail
module list

利用できるmodulefilesを確認ロードしてあるmodulefilesを確認

export
OMP_NUM_THREADS=24
mpiexec ./a.out

プロセス当たりのスレッド数を24に指定
MPIを用いてプログラムを実行

66「不老」利用型MPI講習会

リソースグループの選択 実行したいジョブの設定に合わせてリソースグループを選択する必要がある
 ユーザから見れば何も気にせずに実行できるのが楽だが、大量のジョブをスムーズに実行するにはユーザの協力が不可欠 基本的には利用するノード数や実行したい時間が適切なものを選べば良い 指定した利用時間を過ぎると問答無用で強制終了されます ちょうど良いリソースグループ・空いているリソース

グループを適切に選んで効率よく利用してください

67「不老」利用型MPI講習会

Type Iサブシステムのリソースグループ一覧※現在の状況はHPをご覧ください。

デフォルトの割当方法を「離散」に変更（2021年6月）
最長実行時
最長実行時
最大ノード 最大CPUコ
間(デフォル間(最大値)
数
ア数
ト値)

リソース
グループ名

最小ノード
数

最大メモリ
容量 (*)

割当方法(トーラス)

fxinteractive

1

4

192

1時間

fx-debug

1

36

1,728

fx-small1

24

fx-middle

12

fx-large

24時間

28 GiB x 4

不可

可

会話型バッ
チ

1時間

1時間

28 GiB x
36

不可

可

短時間デ
バッグ用

1,152

12時間

168時間

28 GiB x
24

不可

可 1 BoB単位

96

4,608

12時間

72時間

28 GiB x
96

可可

2 シェルフ
単位

96

192

9,216

12時間

72時間

28 GiB x
192

可可

1/2 ラック単位

fx-xlarge

96

768

36,864

12時間

24時間

28 GiB x
768

可可 2 ラック単位

fx-special

1

2,304

110,592

unlimited

unlimited

28 GiB x
2,304

可

可

事前予約制
(†)

fx-middle2

1

96

4,608

12時間

72時間

28 GiB x
96

可

可

実行優先度
強化型 ()68「不老」利用型MPI講習会

割当方法
備考
(離散)

Type IIサブシステムのリソースグループ一覧※現在の状況はHPをご覧ください。

ローカルストレージ
リソース
グループ名

最大
ノード数

最大
CPUコア数

最長実行時間（デフォルト値）

最長実行時間（最大値）

最大
メモリ容量（*）

NVMeSSD
6.4TB
利用可能

BeeGFS(NVMesh)利用可能(申請
制)

BeeOND
利用可能

cx-interactive

1

1

1時間

24時間

338 GiB○

cx-debug

4

160

1時間

1時間

338 GiB x 4○

cx-share

1/4(共有)

10

1時間

168時間

84 GiB○(共有)

cx-single
cx-smallcx-middle
cx-large
cx-special

1
8
16
64
221

40
320
640
2,560
8,840

1時間
1時間
1時間
1時間
unlimited

336時間
168時間
72時間
72時間
unlimited

338 GiB x 1
338 GiB x 8
338 GiB x 16
338 GiB x 64
338 GiB x 221

○
○
○
○
○

○
○
○

cx-middle2

16

640

1時間

72時間

338 GiB x 16○○

cxgfs-interactive

1

40

1時間

168時間

338 GiB x 1

cxgfs-share

1/4（共有）

10

1時間

168時間

84 GiB x 1

cxgfs-single
cxgfs-small
cxgfs-middle
cxgfs-special

1
8
16
50

40
320
640
2,000

1時間
1時間
1時間
1時間

336時間
168時間
72時間
72時間

338 GiB x 1
338 GiB x 8
338 GiB x 16
338 GiB x 50

契約次第

契約次第

unlimited

unlimited

338 GiBx 実行ノード数

準占有利用

69

備考

会話型バッチ
短時間デバッグ
用、準占有利用
ノードと共有ノード共有(**)、
資源を1/4に分割、ジョブ実行および
インタラクティブ
ジョブ実行が可
能

事前予約制 (†)
実行優先度強化型 ()○ 会話型バッチ
ノード共有（**）、
資源を1/4に分割。
ジョブ実行および○（共有）
インタラクティブ
ジョブ実行が可能○○○○ 事前予約制 (†)○

「不老」利用型MPI講習会

要相談

要相談

Type IIIサブシステムのリソースグループ一覧※現在の状況はHPをご覧ください。

リソース
グループ名

最大CPU
最大
ソケット数
ノード数
(CPUコア数)

最長
実行時間
(デフォル
ト値)

最長
実行時間
(最大値)

備考

8,034 GiB

lm-middle

16(168)

24時間

72時間

lm-large

1

16(448)

24時間

24時間 21,424 GiB

70「不老」利用型MPI講習会

クラウドシステムのリソースグループ一覧※現在の状況はHPをご覧ください。
リソース
グループ名
clinteractive

最長
最長実行時
最小
最大
最大
最大
実行時間
備考
間
ノー ノードCPU(デフォルト
メモリ容量
(最大値)
ド数
数 コア数
値)
338 GiB x インタラクティブ実行
1
1
80
1時間
168時間
1用

cl-debug

1

4

320

1時間

1時間

cl-share

1

1

20

1時間

168時間

cl-single

1

1

80

1時間

168時間

cl-small

2

8

640

1時間

168時間

cl-middle

8

16

1,280

1時間

72時間

50

4,000

cl-special
71

unlimited unlimited

338 GiB x 短時間デバッグ用、準4 占有利用ノードと共有
84 GiB ノード共有
338 GiB x
1
338 GiB x
8
338 GiB x
16
338 GiB x
全ノード、事前予約制
50「不老」利用型MPI講習会

計算サブシステムの使い分け
どのサブシステムを使えば良いのか

72「不老」利用型MPI講習会

各サブシステムの特徴から選ぶ
 Type Iサブシステム


特徴：FX100の後継機、「富岳」と同じアーキテクチャ、ノード数が多い
主な対象利用者：FX100や「富岳」で実績のあるプログラムを動かしたい、
富士通コンパイラを使いたい、大規模分散(MPI)並列実行したい Type IIサブシステム


特徴：Intel CPU + NVIDIA GPU 、ローカルSSD搭載
主な対象利用者：GPUを使いたい、高いI/O性能が欲しい Type IIIサブシステム


特徴：大容量メモリ環境、可視化システムと接続想定される利用者：大容量メモリを使いたい、可視化システムを使いたい クラウドシステム
73

特徴：インタラクティブ実行、Intel CPU×4ソケット搭載想定される利用者：インタラクティブ処理がしたい、高いノード内
CPU並列演算性能が欲しい、研究室のワークステーション・
小規模クラスタの代わりに使いたい「不老」利用型MPI講習会

用途から選ぶ（1／3）
 旧システム利用者はどのシステムを使うのがオススメ？
→ Type Iサブシステム
 旧CXシステム → Type IIサブシステム またはクラウドシステム 旧UVシステム → Type IIIサブシステム
 旧FXシステム

74「不老」利用型MPI講習会

用途から選ぶ（2／3）
 対象プログラムの属性とサブシステムの対応

大規模分散(MPI)並列 → Type Iサブシステム
GPU、高速I/O → Type IIサブシステム
可視化、大容量メモリ → Type IIIサブシステム
ノード内CPU並列実行で高い計算性能 → クラウドシステム


機械学習 → Type Iサブシステム または Type IIサブシステム





75

OpenMP並列化は行えているがMPI並列化は行えていない場合など
対象プログラム（利用するフレームワークなど）がGPU向けに最適化されているならType II、「富岳」向けに最適化されているならType I

インタラクティブ実行 → 大容量メモリも必要ならType IIIサブシステム、
それ以外はクラウドシステム
研究室のワークステーションや小規模PCクラスタ（Core i, Xeonなどx86系のCPUを搭載）の代わりに使いたい、高速化・大規模化したい→ GPUを使いたいならType IIサブシステム、それ以外はクラウドシステム「不老」利用型MPI講習会

用途から選ぶ（3／3）
 「○○というソフトウェアを使いたいのだが？」「ソフトウェア利用環境」の表に従う、以下のWebページでも公開中

http://www.icts.nagoya-u.ac.jp/ja/sc/overview.html#software

それ以外は、利用実績を元に考えると良い「富岳」での利用実績がある → Type Iサブシステム
 GPUを用いた利用実績がある → Type IIサブシステム
 それ以外 → クラウドシステム、大容量メモリが必要であればType IIIサブ
システム




各サブシステムに適したコンパイラの違いも参考にType I：富士通、LLVM
 Type II：Intel、LLVM、GNU、PGI
 Type III：Intel、LLVM、GNU クラウド：Intel、LLVM、GNU ※OSSとして公開されているソフトウェア等を自分でコンパイルして利用する場合は、対応するコンパイラや関係するライブラリの情報も確認してサブシステム選択に役立ててください

76「不老」利用型MPI講習会

以降、Cygwinなどのターミナルを利用する人に特化されています
MobaXtermなどを利用の方は、送付済みの別資料をご覧ください。

テストプログラム起動

77「不老」利用型MPI講習会

ＵＮＩＸ備忘録
 emacsの起動：

emacs <編集ファイル名> ^x^s （＾はcontrol） ：テキストの保存 ^x ^c ： 終了
（ ^z で終了すると、スパコンの負荷が上がる。絶対にしないこと。）
 ^g: 訳がわからなくなったとき。
 ^k : カーソルより行末まで消す。
消した行は、一時的に記憶される。
 ^y : ^kで消した行を、現在のカーソルの場所にコピーする。
 ^s 文字列 : 文字列の箇所まで移動する。
 ^M ｘ goto-line : 指定した行まで移動する。
(^MはESCキーを押す)
78「不老」利用型MPI講習会

ＵＮＩＸ備忘録
 rm ファイル名：


ファイル名のファイルを消す。

rm *~ : test.c~ などの、~がついたバックアップファイルを消す。

 ls : 現在いるフォルダの中身を見る。
 cd

フォルダ名： フォルダに移動する。

 cd.. : 一つ上のフォルダに移動。
 cd ~ ：ホームディレクトリに行く。訳がわからなくなったとき。
 cat

ファイル名： ファイル名の中身を見る make : 実行ファイルを作る（Makefile があるところでしか実行できない）
 makeclean : 実行ファイルを消す。
（clean がMakefileで定義されていないと実行できない）

79「不老」利用型MPI講習会

ノートパソコンの設定：
鍵の生成、ログイン

80「不老」利用型MPI講習会

ユーザ名の確認
 本講習会でのユーザー名：

利用者番号 :
 本講習会のキュー名（後ほど説明）：fx-workshop

81「不老」利用型MPI講習会

無線ＬＡＮの設定
 各自のパソコンにおいて、無線ＬＡＮの設定をしてください 詳細は会場にある無線LAN情報をご覧ください82「不老」利用型MPI講習会

鍵の作成
1.
2.

ターミナルを起動する
以下を入力する$ ssh-keygen –t rsa
3.
4.

5.
6.
83

鍵の収納先を聞かれるので、リターンを押す
鍵を使うためのパスワードを聞かれるので、センターのパスワードではない、自分の好きなパスワードを入れる（パスフレーズとよぶ）
もう一度、上記のパスフレーズを入れる
鍵が生成される「不老」利用型MPI講習会

鍵の利用（１/２）
生成した鍵は、以下に入っている.ssh/
2. 以下を入力する$ cd .ssh/
3. 以下を入力すると、ファイルが見える$ ls
id_rsa id_rsa.pub known_hosts ここで、以下のファイルを区別する
id_rsa： 秘密鍵 この公開鍵の収納ディレクトリ
id_rsa.pub：公開鍵 を覚えておく（後で使います）
1.

84「不老」利用型MPI講習会

鍵の利用（２/２）
4.

以下を入力して、公開鍵を表示する$ cat id_rsa.pub＜公開鍵が表示される＞
5.

85“ssh-rsa …”で始まる部分を、マウスでカットアンドペーストし、公開鍵の登録に使う 。

「不老」利用型MPI講習会

「不老」への公開鍵の登録
 以下をアクセスする。

https://portal.cc.nagoya-u.ac.jp/cgibin/hpcportal.ja/index.cgi
 ユーザ名とパスワードを聞かれるので、センターから発行されたユーザ名とパスワード
を入れる。
86

「不老」利用型MPI講習会

ポータル画面（ログイン前）

センターから配られた
利用者番号 と パスワード
を入れる

87

「不老」利用型MPI講習会

鍵の登録「ログイン」ボタンを押す
成功すると、ログインメッセージがでる
左側メニューの「SSH公開鍵登録」をクリックする「公開鍵」の画面に、公開鍵をカットアンドペーストする「新規登録」ボタンを押す

1.
2.
3.
4.
5.

 ２度は鍵登録できません １度登録すれば「不老」全サブシステムで使えます
88「不老」利用型MPI講習会

ポータル画面（ログイン後）ここをクリック

89「不老」利用型MPI講習会

ポータル画面（公開鍵登録）：

公開鍵をペースト
ペースト後
クリック

90

「不老」利用型MPI講習会

「不老」TypeⅠサブシステムへログイン
ターミナルから、以下を入力する$ ssh flow-fx.cc.nagoya-u.ac.jp -l w490xx

「-l」はハイフンと小文字のＬ、「aYYxxx」は利用者番号（数字）“aYYxxx”は、利用者番号を入れる
接続するかと聞かれるので、 yes を入れる
鍵の設定時に入れた
自分が決めたパスワード（パスフレーズ）を入れる
成功すると、ログインができる





91

「不老」利用型MPI講習会

「不老」TypeIサブシステム上のデータをPCに取り込む
ターミナルから、以下を入力する

$ scp aYYxxx@flow-fx.cc.nagoya-u.ac.jp:~/a.f90 ./「aYYxxx」は利用者番号（数字）“aYYxxx”は、利用者番号を入れる
「不老」上に“a.f90”というファイルが無いとだめです。

「不老」上のホームディレクトリにある”a.f90”を、PCのカレントディレクトリに取ってくる
ディレクトリごと取ってくるには、”-r” を指定$ scp -r aYYxxx@flow-fx.cc.nagoya-u.ac.jp:~/SAMP ./「不老」上のホームディレクトリにあるSAMPフォルダを、その中身ごと、PCのカレントディレクトリに取ってくる92「不老」利用型MPI講習会

PCのファイルを「不老」TypeI
サブシステム上に置くターミナルから、以下を入力する

$ scp ./a.f90 aYYxxx@flow-fx.cc.nagoya-u.ac.jp:「aYYxxx」は利用者番号（数字）“aYYxxx”は、利用者番号を入れる
 PCのカレントディレクトリにある”a.f90”を、「不老」上のホームディレクトリに置く
 ディレクトリごと置くにはには、”-r” を指定$ scp -r ./SAMP aYYxxx@flow-fx.cc.nagoya-u.ac.jp:
 PCのカレントディレクトリにあるSAMPフォルダを、その中身ごと、「不老」上のホームディレクトリに置く
93「不老」利用型MPI講習会

参考：emacs の tramp機能（必要な人のみ） emacs が自分のパソコンに入っている人は、

Tramp機能により、遠隔のファイルが操作できます 「不老」の秘密鍵を、SSHに登録します emacs を立ち上げます ファイル検索モードにします^x ^f （＾はcontrol）
 “Find file: ”の現在のパス名部分を消し、以下を入れます（ただし、t～は自分のログインIDにする）
Find file:/ssh:aYYxxx@flow-fx.cc.nagoya-u.ac.jp:
 パスフレーズを入れると、ローカルファイルのようにF「不老」上のファイルが編集できます。
94「不老」利用型MPI講習会

サンプルプログラムの実行
初めての並列プログラムの実行

95「不老」利用型MPI講習会

サンプルプログラム名
 Ｃ言語版・Ｆｏｒｔｒａｎ90版共通ファイル：

Samples-flow-fx.tar
 tarで展開後、Ｃ言語とＦｏｒｔｒａｎ90言語のディレクトリが作られる
 C/: C言語用 F/ : Fortran90言語用
 上記のファイルが置いてある場所/center/a49904a
96「不老」利用型MPI講習会

並列版Helloプログラムをコンパイルしよう
(1/2)
1.

2.
3.
4.
5.
97

/center/a49904a にある Samples-flow-fx.tar を
自分のディレクトリにコピーする$ cp /center/a49904a/Samples-flow-fx.tar ./Samples-fx.tar を展開する$ tar xvf Samples-flow-fx.tar
Samples フォルダに入る$ cd Samples
C言語： $ cd C
Fortran90言語 ： $ cd F
Hello フォルダに入る$ cd Hello「不老」利用型MPI講習会

並列版Helloプログラムをコンパイルしよう(2/2)
ピュアＭＰＩ用のＭaｋefileをコピーする$ cp Makefile_pure Makefile
7. make する$ make8. 実行ファイル(hello)ができていることを確認
する
$ ls
6.

98

「不老」利用型MPI講習会

バッチ処理とジョブの投入

99「不老」利用型MPI講習会

「不老」のジョブ実行形態の例
 以下の２通りがあります インタラクティブジョブ実行

ＰＣでの実行のように、コマンドを入力して実行する方法
 スパコン環境では、あまり一般的でない デバック用、大規模実行はできない 「不老」TypeIサブシステムでは以下に限定
 最大4ノード（192コア）（標準１時間まで、最大で24時間）
 バッチジョブ実行

バッチジョブシステムに処理を依頼して実行する方法
 スパコン環境で一般的
 大規模実行用
 「不老」TypeIサブシステムでは：

通常サービス： 最大768ノード（36,864コア）（24時間まで）
 申込み制： 2304ノード（110,592コア）（実行時間制限無し）


100「不老」利用型MPI講習会

バッチ処理とは スパコン環境では、インタラクティブ実行（コマンドラインで実行すること）は提供されていないことがあります。特に、大規模並列実行ができないようになっています。
 ジョブはバッチ処理で実行します。
バッチキュー
ジョブの依頼

バッチ処理
システムがジョブを取り出す

実行
ユーザ
101

スパコン
「不老」利用型MPI講習会

コンパイラの種類とインタラクティブ実行
およびバッチ実行の例
インタラクティブ実行、およびバッチ実行で、利用するコンパイラ（Ｃ言語、Ｃ＋＋言語、Ｆｏｒｔｒａｎ９０言語）の種類が違います インタラクティブ実行では
 オウンコンパイラ（そのノードで実行する実行ファイルを生成する
コンパイラ）を使います

バッチ実行では

クロスコンパイラ（そのノードでは実行できないが、バッチ実行する時のノードで実行できる実行ファイルを生成するコンパイラ）を使います

それぞれの形式（富士通社の例）
 オウンコンパイラ： ＜コンパイラの種類名＞
 クロスコンパイラ： ＜コンパイラの種類名＞px
 例）富士通Fortran90コンパイラ
オウンコンパイラ： frt
 クロスコンパイラ： frtpx
102「不老」利用型MPI講習会

バッチキューの設定のしかた バッチ処理は、富士通社のバッチシステム(PJM)

で管理されています。
 以下、主要コマンドを説明します。
 ジョブの投入：
pjsub <ジョブスクリプトファイル名> 自分が投入したジョブの状況確認：
pjstat もしくは pjstat2
 投入ジョブの削除： pjdel <ジョブID>
 バッチキューの状態を見る： pjstat2 --rsc -b
もしくは pjstat2 --use
 システム制限値を見る： pjstat2 --rsc –x
103「不老」利用型MPI講習会

インタラクティブ実行のやり方の例
 コマンドラインで以下を入力
 １ノード実行用$ pjsub -L "rscgrp=fx-interactive" --interact
 4ノード実行用$ pjsub -L "rscgrp=fx-interactive,node=4"--interact
104「不老」利用型MPI講習会

pjstat2 --rsc の実行画面例$ pjstat2 --rsc
RSCGRP
fx-interactive
fx-smallfx-debugfx-extrafx-middle
fx-large
fx-xlarge
fx-special
fx-middle2

STATUS[ENABLE,START][ENABLE,START][ENABLE,START][ENABLE,START][ENABLE,START][ENABLE,START][ENABLE,START][ENABLE,START][ENABLE,START]

使える
キュー名
(リソース
グループ)
105

NODE
384: 4x6x16
384: 4x6x16
384: 4x6x16
384: 4x6x16
1536: 8x12x16
1536: 8x12x16
1536: 8x12x16
2304: 12x12x16
1536: 8x12x16

現在使えるかENABLE: キューにジョブ投入可能
START: ジョブが
流れている

ノードの
物理構成情報pjstat2 --rsc -x の実行画面例$ pjstat2 --rsc -x
RSCGRP
fx-interactive
fx-smallfx-debugfx-extrafx-middle
fx-large
fx-xlarge
fx-special
fx-middle2

STATUSMIN_NODE[ENABLE,START]
1[ENABLE,START]
1[ENABLE,START]
1[ENABLE,START]
1[ENABLE,START]12[ENABLE,START]96[ENABLE,START]96[ENABLE,START]
1[ENABLE,START]
1

最小
ノード
数
106

最大
ノード
数

MAX_NODE
4
24
36
36
96
192
768
2304
96

最大
実行時間
「不老」利用型MPI講習会

MAX_ELAPSE MEM(GB)
24:00:00
28
168:00:00
28
01:00:00
28
12:00:00
28
72:00:00
28
72:00:00
28
24:00:00
28
unlimited28
72:00:00
28

pjstat2 --rsc -b の実行画面例$ pjstat2 --rsc -b
RSCGRP
fx-interactive
fx-smallfx-debugfx-extrafx-middle
fx-large
fx-xlarge
fx-special
fx-middle2

STATUSTOTAL RUNNING QUEUED HOLD OTHERNODE[ENABLE,START]
11000 384:4x6x16[ENABLE,START]
83
33
50
0
2 384:4x6x16[ENABLE,START]
40
22
18
0
0 384:4x6x16[ENABLE,START]
20
8
12
0
2 384:4x6x16[ENABLE,START]
33
7
26
0
0 1536:8x12x16[ENABLE,START]
103
70
0 1536:8x12x16[ENABLE,START]
51
40
0 1536:8x12x16[ENABLE,START]
20200 304:12x12x16[ENABLE,START]
102
80
0 1536:8x12x16

総合
ジョブ数

107

実行中
ジョブ数

待たされているジョブ数「不老」利用型MPI講習会

pjstat2 --use の実行画面例$ pjstat2 --use
RSCGRP
Used nodes/ Total nodes
fx-debug groups (total 768 nodes)
172/768
fx-interactive ------------------------- 0%2
fx-small******------------------- 22%
170
fx-debug------------------------- 0%0
fx groups (total 1536 nodes)
751/ 1536
fx-middle**----------------------- 7%
111
fx-middle2------------------------- 0%0
fx-large*******------------------ 25%384
fx-xlarge*****-------------------- 17%
256
fx-special------------------------- 0%
0/ 2304

当該キューに割り当てられたノード数の何％が使われているか
108

使われている
ノード数

当該キューに割り当てられているノード数（キュー間で重複あり）「不老」利用型MPI講習会

pjstat2 の実行画面例$ pjstat2
JOB_ID
95647

JOB_NAME STATUS
hello-pure
RUNNING

ジョブID

109

GROUP
RSCGROUP
jhpcn2602 fx-debug

START_DATE(09/15 16:47)<

実行してい
るか：
RUNNING:
実行中「不老」利用型MPI講習会

ELAPSE
00:00:00

NODE
12

JOBスクリプトサンプルの説明（ピュアＭＰＩ）（hello-pure.bash, C言語、Fortran言語共通）#!/bin/bash#PJM -L "rscunit=fx"#PJM -L "rscgrp=fx-workshop"#PJM -L "node=12"#PJM --mpi "proc=576"#PJM -L "elapse=1:00"
mpirun ./hello
MPIジョブを48＊12ノード= 576プロセス で実行する
110「不老」利用型MPI講習会

リソースグループ名：fx-workshop
利用ノード数
利用コア数（ＭＰＩプロセス数）
実行時間制限：１分

FX1000計算ノードの構成
HMC2 ＭＰＩプロセス
8GB

4ソケット相当、NUMA(Non Uniform Memory Access)Tofu D
Network

MemoryMemoryL2 (12コアで共有、8MB)
L2 (12コアで共有、12MB)

ICC: L1データ
L1
L1
L1
L1
L1
キャッシュ
… L1… Core L1Core L1Core L1Core L1: L1データAssist.
Core L1Core L1Core L1Core L1
#0
#1
#2
#3
64KBキャッシュ
… Core Assist.
… …#9 Core#9 Core#10 Core#11 Core
Core
Core
Core
Core
#0
#1
#2
#3
#9
#9
#10
#11
64KB … Core
L1

L1

L1

L1

ソケット0 (CMG(Core Memory Group))
ソケット2 (CMG)
Core
Core
Core
Core
: L1データ#12 Core#13 Core#14 Core#15 Core
L1#12 L1#13 L1#14 L1

L1

L1

L1

ソケット１ (CMG)
ソケット3 (CMG)
HMC2 8GB

Assist.
Core Assist.
…

…

: L1データL1#15キャッシュ…
キャッシュ
L164KB
…
64KB

Core
Core
Core
Core
#20 Core#21 Core#22 Core#23 Core

… …L1

#20L1

#21 L1#22 L1

#23

L1

L1

L1

L1

L1

Core

L2 (12コアで共有、8MB)
L2 (12コアで共有、12MB)

MemoryMemoryノード内合計メモリ量：32GB
111

読込み：240GB/秒
書込み：240GB/秒=合計：480GB/秒

並列版Helloプログラムを実行しよう（ピュアMPI）
1.
2.
3.

4.
5.

112

Helloフォルダ中で以下を実行する$ pjsub hello-pure.bash
自分の導入されたジョブを確認する$ pjstat
実行が終了すると、以下のファイルが生成される
hello-pure.bash.ＸＸＸＸＸＸ.err
hello-pure.bash.ＸＸＸＸＸＸ.out （XXXXXXは数字）
上記の標準出力ファイルの中身を見てみる$ cat hello-pure.bash.ＸＸＸＸＸＸ.out“Hello parallel world!”が、48プロセス*１２ノード=５７６個表示されていたら成功。
「不老」利用型MPI講習会

バッチジョブ実行による標準出力、
標準エラー出力
 バッチジョブの実行が終了すると、標準出力ファイルと標準エラー出力ファイルが、ジョブ投入時のディレクトリ
に作成されます。
 標準出力ファイルにはジョブ実行中の標準出力、
標準エラー出力ファイルにはジョブ実行中のエラーメッセージが出力されます。

ジョブ名.XXXXX.out --- 標準出力ファイル
ジョブ名.XXXXX.err --- 標準エラー出力ファイル(XXXXX はジョブ投入時に表示されるジョブのジョブID)

113「不老」利用型MPI講習会

並列版Helloプログラムを実行しよう（ハイブリッドMPI）
 (準備)

Helloフォルダ中で以下を実行する$ make clean$ cp Makefile_hy48 Makefile$ make114「不老」利用型MPI講習会

並列版Helloプログラムを実行しよう（ハイブリッドMPI）
1.
2.
3.

4.
5.

Helloフォルダ中で以下を実行する$ pjsub hello-hy48.bash
自分の導入されたジョブを確認する$ pjstat
実行が終了すると、以下のファイルが生成される
hello-hy48.bash.ＸＸＸＸＸＸ.err
hello-hy48.bash.ＸＸＸＸＸＸ.out （XXXXXXは数字）
上記標準出力ファイルの中身を見てみる$ cat hello-hy48.bash.ＸＸＸＸＸＸ.out“Hello parallel world!”が、1プロセス*12ノード=12 個表示されていたら成功。
115「不老」利用型MPI講習会

JOBスクリプトサンプルの説明（ハイブリッドＭＰＩ）（hello-hy48.bash, C言語、Fortran言語共通）#!/bin/bash#PJM -L "rscunit=fx"#PJM -L "rscgrp=fx-workshop"#PJM -L "node=12"#PJM --mpi "proc=12"#PJM -L "elapse=1:00"
export OMP_NUM_THREADS=48
mpirun ./hello
MPIジョブを1＊12 = 12 プロセスで
実行する。
116

リソースグループ名：fx-workshop
利用ノード数
利用コア数（ＭＰＩプロセス数）
実行時間制限：１分
１ＭＰＩプロセス当たり
４８スレッド生成※ただし効率的な実行形式ではありません「不老」利用型MPI講習会

FX1000計算ノードの構成
HMC2 ＭＰＩプロセス
8GB
スレッド

4ソケット相当、NUMA(Non Uniform Memory Access)Tofu D
Network

MemoryMemoryL2 (12コアで共有、8MB)
L2 (12コアで共有、12MB)

ICC: L1データ
L1
L1
L1
L1
L1
キャッシュ
… L1… Core L1Core L1Core L1Core L1: L1データAssist.
Core L1Core L1Core L1Core L1
#0
#1
#2
#3
64KBキャッシュ
… Core Assist.
… …#9 Core#9 Core#10 Core#11 Core
Core
Core
Core
Core
#0
#1
#2
#3
#9
#9
#10
#11
64KB … Core
L1

L1

L1

L1

ソケット0 (CMG(Core Memory Group))
ソケット2 (CMG)
Core
Core
Core
Core
: L1データ#12 Core#13 Core#14 Core#15 Core
L1#12 L1#13 L1#14 L1

L1

L1

L1

ソケット１ (CMG)
ソケット3 (CMG)
HMC2 8GB

Assist.
Core Assist.
…

…

: L1データL1#15キャッシュ…
キャッシュ
L164KB
…
64KB

Core
Core
Core
Core
#20 Core#21 Core#22 Core#23 Core

… …L1

#20L1

#21 L1#22 L1

#23

L1

L1

L1

L1

L1

Core

L2 (12コアで共有、8MB)
L2 (12コアで共有、12MB)

MemoryMemoryノード内合計メモリ量：32GB
読込み：512GB/秒
117 書込み：512GB/秒=合計：1024GB/秒「不老」利用型MPI講習会

MPI実行時のリダイレクトについて
 一般に、スーパーコンピュータでは、

MPI実行時の入出力のリダイレクトができません ×例）mpirun ./a.out < in.txt > out.txt
 専用のリダイレクト命令が用意されています。
 FX1000でリダイレクトを行う場合、以下のオプションを指定します。
 ○例) mpirun --stdin ./in.txt --stdout out.txt ./a.out

118「不老」利用型MPI講習会

MPIプロセスのノード割り当て
 「不老」TypeIサブシステムでは、何もしないと（デフォルトでは）、

確保ノードが物理的に連続に確保されない⇒通信性能が劣化する場合がある 物理的に連続したノード割り当てをしたい場合は、
ジョブスクリプトにその形状を記載する


ただしノード割り当て形状を指定すると、待ち時間が増加する

 記載法：
<形状>：= { １次元 | ２次元 | ３次元 }#PJM -L “node= <形状>:<機能>“

１次元 := { a }, 2次元 := {a x b}, 3次元 := {a x b x c}

<機能> := { 離散 | メッシュ | トーラス }

離散 : = { noncont }, メッシュ := {mesh}, トーラス := {torus}：12ノード以上

 例：24ノード、３次元（2x4x3）、トーラス

119#PJM -L “node= 2x4x3 : torus“「不老」利用型MPI講習会

NUMA affinity指定について
 NUMA計算機では、MPIプロセスのソケットへの割り当てが性能面で重要となる（NUMA affinityとよぶ）
 MPIプロセスのソケット（富士通用語でCMC）の割り当ては、「不老」TypeIサブシステムでは富士通社のNUMA affinity (MCAパラメタ)で設定する
 環境変数で設定する

120「不老」利用型MPI講習会

NUMAメモリポリシー指定
 環境変数名：plm_ple_memory_allocation_policy


代入する値


localalloc: プロセスが動作中のCPU(コア)の属するNUMAノードからメモリを割り当てる。

interleave_local: プロセスの「ローカルノード集合」内の各NUMAノードから交互にメモリ割り当てる。

interleave_nonlocal: プロセスの「非ローカルノード集合」内の各NUMAノードから交互にメモリ割り当てる。

interleave_all: プロセスの「全ノード集合」内の各NUMAノードから交互にメモリを取得する。

bind_local: プロセスの「ローカルノード集合」に属する各NUMAノードで、ノードIDの若い順にメモリ割り当てを行う。

bind_nonlocal: プロセスの「非ローカルノード集合」に属する各NUMAノードで、ノードIDの若い順にメモリ割り当てを行う。

bind_all: プロセスの「全ノード集合」のNUMAノードにバインドする。



prefer_local: プロセスの「ローカルノード集合」のうち、NUMAノードIDが最も若いものを「優先ノード」とし、「優先ノード」からメモリ割り当てを行う。



prefer_nonlocal: プロセスの「非ローカルノード集合」のうち、NUMAノードIDが最も若いものを「優先ノード」とし、「優先ノード」からメモリ割り当てを行う。

 通常は、localallocでよい。
 export
121

plm_ple_memory_allocation_policy=localalloc「不老」利用型MPI講習会

CPU(コア)割り当てポリシー指定
 環境変数名：plm_ple_numanode_assign_policy
 代入する値

simplex: NUMAノードを占有するように割り当てる。
share_cyclic: NUMAノードを他のプロセスと共有するように割り当てる。異なるNUMA
ノードに順番にプロセスを割り当てる。
share_band: NUMAノードを他のプロセスと共有するように割り当てる。同一NUMA
ノードに連続してプロセスを割り当てる。

export plm_ple_numanode_assign_policy=simplex
 各ソケットを各MPIプロセスで独占したいときはsimplexを指定
 例）



各ノードへ割り当てるMPIプロセス数が2個で、それぞれのMPIプロセスは16個のスレッド実行するとき

 MPIプロセスをプロセス順に各ソケットに詰め込みたいときは、

share_bandを指定
ノード当たり32個のMPIプロセスを、ランク番号が122近い順に割り当てたい場合「不老」利用型MPI講習会

サンプルプログラムの説明










Hello/


並列版Helloプログラム



hello-pure.bash, hello-hy16.bash : ジョブスクリプトファイル

Cpi/


円周率計算プログラム

cpi-pure.bash ジョブスクリプトファイル

Wa1/


逐次転送方式による総和演算

wa1-pure.bash ジョブスクリプトファイル

Wa2/


二分木通信方式による総和演算

wa2-pure.bash ジョブスクリプトファイル

Cpi_m/


円周率計算プログラムに時間計測ルーチンを追加したもの

cpi_m-pure.bash ジョブスクリプトファイル

123「不老」利用型MPI講習会

MPIプログラム実例

124「不老」利用型MPI講習会

MPIの起動
 MPIを起動するには
1.

MPIをコンパイルできるコンパイラでコンパイル 実行ファイルは a.out

2.

とする（任意の名前を付けられます）

以下のコマンドを実行 インタラクティブ実行では、以下のコマンドを直接入力
 バッチジョブ実行では、ジョブスクリプトファイル中に記載$ mpirun –np 8./a.out

MPI起動
コマンド

MPIの
実行ファイル
名

125

MPI
プロセス
数

※スパコンのバッチジョブ実行
では、MPIプロセス数は専用の指示文で指定する場合があります。
その場合は以下になることがあります。

$mpirun ./a.out「不老」利用型MPI講習会

MPIの起動
mpirun -np 4 ./a.out

a.out

126

a.out

a.out

「不老」利用型MPI講習会

a.out並列版Helloプログラムの説明（C言語）#include <stdio.h>#include <mpi.h>

このプログラムは、全ＰＥで起動される

void main(int argc, char* argv[]) {int
int

MPIの初期化

myid, numprocs;
ierr, rc;

自分のID番号を取得：各ＰＥで値は異なる

ierr = MPI_Init(&argc, &argv);
ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid);ierr = MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
printf("Hello parallel world! Myid:%d ¥n", myid);rc = MPI_Finalize();exit(0);}127

全体のプロセッサ台数を取得：各ＰＥで値は同じ

MPIの終了「不老」利用型MPI講習会

変数myidの説明図

同じ変数名でも別メモリ上に別変数で確保
128

MPI
プログラム

MPI
プログラム

MPI
プログラム

MPI
プログラム

ランク０
myid=0

ランク１
myid=1

ランク２
myid=2

ランク３
myid=3「不老」利用型MPI講習会

並列版Helloプログラムの説明（Fortran言語）
このプログラムは、全ＰＥで起動される

program main
include 'mpif.h'common /mpienv/myid,numprocs
integer myid, numprocs
integer ierr

MPIの初期化
自分のID番号を取得：各ＰＥで値は異なる

call MPI_INIT(ierr)call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)print *, "Hello parallel world! Myid:", myid
call MPI_FINALIZE(ierr)
stop
end
129

全体のプロセッサ台数を取得：各ＰＥで値は同じ

MPIの終了「不老」利用型MPI講習会

プログラム出力例
 ４プロセス実行の出力例

Hello parallel world! Myid:0
Hello parallel world! Myid:3
Hello parallel world! Myid:１
Hello parallel world! Myid:2

4プロセスなので、表示が４個でる（1000プロセスなら1000個出力がでる）
myid番号が表示される。全体で重複した番号は無い。
必ずしも、myidが0から3まで、連続して出ない→各行は同期して実行されていない→実行ごとに結果は異なる
130「不老」利用型MPI講習会

総和演算プログラム（逐次転送方式）


各プロセスが所有するデータを、全プロセスで加算し、あるプロセス１つが結果を所有する演算を考える。

 素朴な方法（逐次転送方式）（0番でなければ）左隣のプロセスからデータを受信する；
左隣のプロセスからデータが来ていたら；

1.
2.
1.
2.
3.
4.

受信する;
＜自分のデータ＞と＜受信データ＞を加算する;（最終ランクでなければ）右隣のプロセスに＜2の加算した結果を＞送信する;
処理を終了する;

実装上の注意

左隣りとは、（myid-１）のIDをもつプロセス

右隣りとは、（myid+１）のIDをもつプロセス131

myid=0のプロセスは、左隣りはないので、受信しない

myid=p-１のプロセスは、右隣りはないので、送信しない「不老」利用型MPI講習会

バケツリレー方式による加算
所有データ

所有データ
０

１

０

所有データ

所有データ

２

３

１

CPU0

３

CPU１
送信

０ ＋ １ ＝ １

CPU２
送信

CPU３
送信

１ ＋ ２ ＝ ３

３ ＋ ３ ＝ ６

最終結果

132

「不老」利用型MPI講習会

１対１通信利用例（逐次転送方式、C言語）
受信用システム配列の確保
void main(int argc, char* argv[]) {MPI_Status istatus;
自分より一つ少ない….
ID番号（myid-1）から、dsendbuf = myid;
double型データ１つをdrecvbuf = 0.0;
受信しdrecvbuf変数に
if (myid != 0) {ierr = MPI_Recv(&drecvbuf, 1, MPI_DOUBLE, myid-1, 0, 代入
MPI_COMM_WORLD, &istatus);}
自分より一つ多い
dsendbuf = dsendbuf + drecvbuf;
ID番号（myid+1）に、if (myid != nprocs-1) {ierr = MPI_Send(&dsendbuf, 1, MPI_DOUBLE, myid+1, 0, dsendbuf変数に入っているdouble型データ
MPI_COMM_WORLD);
１つを送信}
if (myid == nprocs-1) printf ("Total = %4.2lf ¥n", dsendbuf);
….
}
133

「不老」利用型MPI講習会

１対１通信利用例（逐次転送方式、Fortran言語）
program main
受信用システム配列の確保
integer istatus(MPI_STATUS_SIZE)….
dsendbuf = myid
自分より一つ少ない
drecvbuf = 0.0
ID番号（myid-1）から、
if (myid .ne. 0) thendouble型データ１つを
call MPI_RECV(drecvbuf, 1, MPI_DOUBLE_PRECISION,
受信しdrecvbuf変数に&
myid-1, 0, MPI_COMM_WORLD, istatus, ierr)endif
代入
dsendbuf = dsendbuf + drecvbuf
if (myid .ne. numprocs-1) thencall MPI_SEND(dsendbuf, 1, MPI_DOUBLE_PRECISION,&
myid+1, 0, MPI_COMM_WORLD, ierr)
自分より一つ多い
endif
ID番号（myid+1）に、if (myid .eq. numprocs-1) thendsendbuf変数にprint *, "Total = ", dsendbuf
endif
入っているdouble型….
データ１つを送信
stop
end
134

「不老」利用型MPI講習会

総和演算プログラム（二分木通信方式）
 二分木通信方式

k = １;for (i=0; i < log2(nprocs); i++)if ( (myid & k) == k)

1.
2.
3.




else

4.



135

(myid – k)番 プロセス からデータを受信；
自分のデータと、受信データを加算する；
k = k * 2;
(myid + k)番 プロセス に、データを転送する；
処理を終了する；「不老」利用型MPI講習会

総和演算プログラム（二分木通信方式）
３段目＝ｌog2（８）段目

3

1

3

２段目
0

1段目

1

2

7
5

3

4

7

5

6

7

7
7

3

0
136

5

3

1
1

2

3

4

7
5

「不老」利用型MPI講習会

6

7

総和演算プログラム（二分木通信方式）
 実装上の工夫 要点： プロセス番号の２進数表記の情報を利用する
 第i段において、受信するプロセスの条件は、以下で書ける：

myid & k が k と一致 ここで、k = 2^(i-１) 。
 つまり、プロセス番号の２進数表記で右からi番目のビットが立っている

プロセスが、送信することにする また、送信元のプロセス番号は、以下で書ける：

myid + k つまり 、通信が成立するPE番号の間隔は２＾(i-１)←二分木なので 送信プロセスについては、上記の逆が成り立つ。

137「不老」利用型MPI講習会

総和演算プログラム（二分木通信方式）
 逐次転送方式の通信回数
 明らかに、nprocs－１ 回

 二分木通信方式の通信回数
 見積もりの前提
 各段で行われる通信は、完全に並列で行われる（通信の衝突は発生しない）
 段数の分の通信回数となる
 つまり、log2(nprocs) 回

 両者の通信回数の比較
 プロセッサ台数が増すと、通信回数の差（＝実行時間）がとても大きくなる １０２４構成では、１０２３回 対 １０回！


138

でも、必ずしも二分木通信方式がよいとは限らない（通信衝突の多発）「不老」利用型MPI講習会

性能プロファイラ
 富士通コンパイラには、性能プロファイラ機能がある
 富士通コンパイラでコンパイル後、実行コマンドで指定し利用する 以下の3種類があります1.

基本プロファイラ 主な用途：プログラム全体で、最も時間のかかっている関数を同定する

2.

詳細プロファイラ 主な用途：最も時間のかかっている関数内の特定部分において、メモリアク
セス効率、キャッシュヒット率、スレッド実行効率、ＭＰＩ通信頻度解析、を行う

3.

CPU性能解析レポート
 主な用途：詳細プロファイラデータを視覚的に表示する（Excel利用）

139「不老」利用型MPI講習会

性能プロファイラの種類の詳細
 基本プロファイラ

コマンド例：fipp –C
 表示コマンド：fipppx
 ユーザプログラムに対し一定間隔(デフォルト時100 ミリ秒間隔)毎に割り込みをかけ情報を収集する。
 収集した情報を基に、コスト情報等の分析結果を表示。
 測定場所を指定可能。
 詳細プロファイラ

コマンド例：fapp –C
 表示コマンド：fapppx


ユーザプログラムの中に測定範囲を設定し、測定範囲のハードウェアカウン
タの値を収集。
 収集した情報を基に、MFLOPS、MIPS、各種命令比率、キャッシュミス等の詳細な分析結果を表示。
140「不老」利用型MPI講習会

基本プロファイラ利用例
 プロファイラデータ用の空のディレクトリがないとダメ /Wa2 に Profディレクトリを作成$ mkdir Prof Ｗａ２ の wa2-pure.bash 中に以下を記載
fipp -C -d Prof mpirun ./wa2
 実行する$ pjsub wa2-pure.bash
 テキストプロファイラを起動$ fipppx –A -d Prof141

「不老」利用型MPI講習会

基本プロファイラ出力例（1/2）-----------------------------------------------------------------------------------------Fujitsu Instant Profiler Version 1.2.0
Measured time

: Thu Apr 19 09:32:18 2012

CPU frequency: ProcessType of program

: MPI

0-

127 1848 (MHz)Average at sampling interval : 100.0 (ms)Measured range: All ranges

Virtual coordinate: (12, 0, 0)-----------------------------------------------------------------------------------------____________________________________________________________________________________
Time statistics
Elapsed(s)User(s)System(s)--------------------------------------------2.1684

53.9800

87.0800 Application--------------------------------------------2.1684

0.51000.6400 Process

112.15880.46000.6800 Process

88

2.15800.50000.6400 Process

99

2.15680.66001.4200 Process

111

…

142

「不老」利用型MPI講習会

基本プロファイラ出力例（2/2）__________________________________________________________________________________________

Procedures profile*************************************************************************************
Application - procedures*************************************************************************************
Cost

%

Mpi

%

Start

End

---------------------------------------------------------------------475 100.0000

312

65.6842---- Application---------------------------------------------------------------------31265.6842312 100.0000

82

17.263200.0000---- __GI___sched_yield80

16.842100.0000---- __libc_poll

10.21050.0000---- __pthread_mutex_unlock_usercnt

0145 MAIN__*************************************************************************************
Process

11 - procedures*************************************************************************************
Cost

%

Mpi

%

Start

End

---------------------------------------------------------------------5 100.0000

480.0000---- Process11---------------------------------------------------------------------4

80.0000

4 100.0000

1

20.0000

00.00001--45 MAIN__-- __GI___sched_yeld

….

143

「不老」利用型MPI講習会

CPU解析レポート（エクセル形式）
 性能プロファイルは見にくい 性能プロファイルデータ（マシン語命令の種類や、実行時間に占める割合など）を、Ｅｘｃｅｌで可視化してくれるツール コマンド例：fapp –c –Hevent=pa1 ./a.out 単体レポート： １回測定
 標準レポート：１１回測定
 詳細レポート：１７回測定

144「不老」利用型MPI講習会

CPU解析レポート（エクセル形式）
 手順
1.
2.
3.
4.
5.
6.

145

対象箇所（ループ）を、専用のAPIで指定する
プロファイルを入れるフォルダを＜測定数分＞か所をつくる
プロファイルのためのコマンドで＜測定数分＞回実行する
エクセル形式に変換する
4のエクセル形式を手元のパソコンに持ってくる
5のファイルを、指定のエクセルと同一のフォルダに入れてから、指定のエクセルを開く「不老」利用型MPI講習会

CPU解析レポートのための指示ＡＰＩ
 以下のAPIで、対象となるループを挟む（Fortranの場合）

call fapp_start (“region”, １)<対象となるループ>
call fapp_stop (“region”, １) 詳細プロファイラの指定APIと同じです “region”は、対象となる場所の名前なので、任意の名前を付けることが可能（後で、専用エクセルを開くときに使う）
 “１”は、レベルの指定で、数字を書く
 -L オプションで指定したレベル以上を測定
146「不老」利用型MPI講習会

実行のさせ方 a.out という実行ファイルの場合、以下のように１１回実行する
 実行するディレクトリに、pa1、pa2、…、pa11という、ディレクトリを作っておく必要がある 以下のように実行する
fapp -C –d pa1 -Hpa=1 mpiexec a.out
fapp -C –d pa2 -Hpa=2 mpiexec a.out
fapp -C –d pa3 -Hpa=3 mpiexec a.out
fapp -C –d pa4 -Hpa=4 mpiexec a.out
fapp -C –d pa5 -Hpa=5 mpiexec a.out
fapp -C –d pa6 -Hpa=6 mpiexec a.out….
fapp -C –d pa11 -Hpa=11 mpiexec a.out
147「不老」利用型MPI講習会

エクセルデータへの変換
 pa1、pa2、…、pa11の中に、プロファイルデータがあることを確認する
 以下のコマンドを実行する
fapppx -A -d pa1 -o output_prof_1.csv -tcsv -Hpa
fapppx -A -d pa2 -o output_prof_2.csv -tcsv -Hpa
fapppx -A -d pa3 -o output_prof_3.csv -tcsv -Hpa
fapppx -A -d pa4 -o output_prof_4.csv -tcsv -Hpa
fapppx -A -d pa5 -o output_prof_5.csv -tcsv -Hpa
fapppx -A -d pa6 -o output_prof_6.csv -tcsv -Hpa….
fapppx -A -d pa11 -o output_prof_11.csv -tcsv -Hpa
148

「不老」利用型MPI講習会

エクセルデータを手元のＰＣに転送 以下の「不老」上のエクセルデータを、手元のＰＣに転送
 output_prof_1.csv、output_prof_2.csv、…、

output_prof_11.csv
 上記のエクセルデータが入ったフォルダで、ポータル上で公開されている専用エクセルを開く
 詳細なエクセルデータの利用法、分析されたデータの見方は、マニュアル参照

149「不老」利用型MPI講習会

表示例

ソース：FUJITSU Software Technical Computing Suite V4.0L20
Development Studioプロファイラ使用手引書, J2UL-2483-02Z0(00), 2020年3月
150「不老」利用型MPI講習会

表示例

ソース：FUJITSU Software Technical Computing Suite V4.0L20
Development Studioプロファイラ使用手引書, J2UL-2483-02Z0(00), 2020年3月
151「不老」利用型MPI講習会

表示例

ソース：FUJITSU Software Technical Computing Suite V4.0L20
Development Studioプロファイラ使用手引書, J2UL-2483-02Z0(00), 2020年3月
152「不老」利用型MPI講習会

演習課題
逐次転送方式のプログラムを実行

1.


Wa1 のプログラム

二分木通信方式のプログラムを実行2.


Wa2のプログラム

時間計測プログラムを実行

3.


Cpi_mのプログラム

プロセス数を変化させて、サンプルプログラムを実行
Helloプログラムを、以下のように改良

4.
5.


153

MPI_Sendを用いて、プロセス0からＣｈａｒ型のデータ“Hello World!!”を、その他のプロセスに送信する
その他のプロセスでは、MPI_Recvで受信して表示する「不老」利用型MPI講習会

並列プログラミングの基本
（座学）

154

「不老」利用型MPI講習会

教科書（演習書）
 「スパコンプログラミング入門－並列処理とMPIの学習－」 片桐 孝洋 著、
 東大出版会、ISBN978-4-13-062453-4、
発売日：2013年3月12日、判型:A5, 200頁
 【本書の特徴】
 C言語で解説
 C言語、Fortran90言語のサンプルプログラムが付属
 数値アルゴリズムは、図でわかりやすく説明
 本講義の内容を全てカバー
 内容は初級。初めて並列数値計算を学ぶ人向けの入門書
155「不老」利用型MPI講習会

教科書（演習書）
「並列プログラミング入門：
サンプルプログラムで学ぶOpenMPとOpenACC」
 片桐 孝洋 著
 東大出版会、ISBN-10: 4130624563、ISBN-13: 978-4130624565、発売日： 2015年5月25日
 【本書の特徴】
 C言語、Fortran90言語で解説
 C言語、Fortran90言語の複数のサンプルプログラムが入手可能（ダウンロード形式）
 本講義の内容を全てカバー
 Windows PC演習可能(Cygwin利用)。スパコンでも演習可能。
 内容は初級。初めて並列プログラミングを学ぶ人向けの
入門書

156

「不老」利用型MPI講習会

参考書
 「スパコンを知る:

その基礎から最新の動向まで」
 岩下武史、片桐孝洋、高橋大介 著
 東大出版会、ISBN-10: 4130634550、ISBN-13: 978-4130634557、
発売日：2015年2月20日、176頁
 【本書の特徴】
 スパコンの解説書です。以下を
分かりやすく解説します。
 スパコンは何に使えるか スパコンはどんな仕組みで、なぜ速く計算できるのか
 最新技術、今後の課題と将来展望、など
157「不老」利用型MPI講習会

参考書


「並列数値処理 - 高速化と性能向上のために -」 金田康正 東大教授 理博 編著、
片桐孝洋 東大特任准教授 博士（理学） 著、黒田久泰 愛媛大准教授
博士（理学） 著、山本有作 神戸大教授 博士（工学） 著、 五百木伸洋㈱日立製作所 著、
 コロナ社、発行年月日：2010/04/30 ， 判 型： A5， ページ数：272頁、ISBN：978-4-339-02589-7， 定価：3,990円 （本体3,800円＋税5%)
 【本書の特徴】
 Fortran言語で解説
 数値アルゴリズムは、数式などで厳密に説明
 本講義の内容に加えて、固有値問題の解法、疎行列反復解法、FFT、ソート、など、主要な数値計算アルゴリズムをカバー 内容は中級～上級。専門として並列数値計算を学びたい
人向き
158「不老」利用型MPI講習会

スパコンの基本：並列処理
並列化とは何か？
 逐次実行のプログラム（実行時間T ）を、ｐ台の計算機を使って、T / ｐ にすること。
T
T / ｐ 素人考えでは自明。
 実際は、できるかどうかは、対象処理の内容（アルゴリズム）で 大きく 難しさが違う
 アルゴリズム上、絶対に並列化できない部分の存在
 通信のためのオーバヘッドの存在
 通信立ち上がり時間
 データ転送時間
159「不老」利用型MPI講習会

並列と並行 並列（Parallel）
 物理的に並列（時間的に独立）
 ある時間に実行されるものは多数

T 並行（Concurrent）
 論理的に並列（時間的に依存）
 ある時間に実行されるものは１つ（＝１プロセッサで実行）
T

時分割多重、疑似並列
 OSによるプロセス実行スケジューリング（ラウンドロビン方式）
160「不老」利用型MPI講習会

並列計算機の分類
 Michael J. Flynn教授（スタンフォード大）の分類（１９６６）
 単一命令・単一データ流（SISD, Single Instruction Single Data Stream）
 単一命令・複数データ流（SIMD, Single Instruction Multiple Data Stream）
 複数命令・単一データ流（MISD, Multiple Instruction Single Data Stream）
 複数命令・複数データ流（MIMD, Multiple Instruction Multiple Data Stream）

161「不老」利用型MPI講習会

並列計算機のメモリ型による分類
1.

共有メモリ型（SMP、
Symmetric Multiprocessor）

2.

分散メモリ型（メッセージパッシング）

3.

分散共有メモリ型（DSM、
Distributed Shared Memory）
162「不老」利用型MPI講習会

並列計算機のメモリ型による分類（分散メモリ型並列計算機）
共有・非対称メモリ型（ccNUMA、Cache Coherent
Non-Uniform Memory Access）
4.

163「不老」利用型MPI講習会

並列計算機の分類とMPIとの関係
 MPIは分散メモリ型計算機を想定
 MPIは、分散メモリ間の通信を定めているため

 MPIは共有メモリ型計算機でも動く
 MPIは、共有メモリ内でもプロセス間通信ができるため

 MPIを用いたプログラミングモデルは、（基本的に）SIMD MPIは、（基本的には）プログラムが１つ（＝命令と等価）しかないが、データ（配列など）は複数あるため

164「不老」利用型MPI講習会

並列プログラミングのモデル
 実際の並列プログラムの挙動はMIMD
 アルゴリズムを考えるときは＜SIMDが基本＞
 複雑な挙動は理解できないので

165「不老」利用型MPI講習会

並列プログラミングのモデル
 MIMD上での並列プログラミングのモデル
1.

SPMD（Single Program Multiple Data）
 １つの共通のプログラムが、並列処理開始時に、
全プロセッサ上で起動する
 MPI（バージョン１）のモデル

2.

166

Master / Worker（Master / Slave）
 １つのプロセス（Master）が、複数のプロセス（Worker）
を管理（生成、消去）する。
「不老」利用型MPI講習会

並列プログラムの種類
 マルチプロセス MPI （Message Passing Interface）
 HPF （High Performance Fortran）


自動並列化Fortranコンパイラ

ユーザがデータ分割方法を明示的に記述プロセスとスレッドの違い•メモリを意識するかどうかの違い•別メモリは「プロセス」•同一メモリは「スレッド」

 マルチスレッド Pｔhread (POSIX スレッド)
 Solaris Thread (Sun Solaris OS用)

 NT thread (Windows NT系、Windows95以降)


スレッドの Fork（分離） と Join（融合） を明示的に記述

 Java

言語仕様としてスレッドを規定

 OpenMP

167

ユーザが並列化指示行を記述

マルチプロセスとマルチスレッドは共存可能→ハイブリッドMPI/OpenMP実行「不老」利用型MPI講習会

並列処理の実行形態（１） データ並列
 データを分割することで並列化する。
 データの操作（＝演算）は同一となる。

SIMDの考え方と同じ データ並列の例：行列－行列積

 1 2 3   9 8 7   1 * 9 + 2 * 6 + 3 * 3 1 * 8 + 2 * 5 + 3 * 2 1 * 7 + 2 * 4 + 3 *1   ＝  4 * 9 + 5 * 6 + 6 * 3 4 * 8 + 5 * 5 + 6 * 2 4 * 7 + 5 * 4 + 6 *1 4 5 6   6 5 4   7 * 9 + 8 * 6 + 9 * 3 7 * 8 + 8 * 5 + 9 * 2 7 * 7 + 8 * 4 + 9 *1 
7 8 9 3 2 1 
 


●並列化

2 3


CPU１  4 5 6 
CPU２  7 8 9 

CPU０  1

168

全CPUで共有

9 8 7 1 * 9 + 2 * 6 + 3 * 3 1 * 8 + 2 * 5 + 3 * 2 1 * 7 + 2 * 4 + 3 *1 
 ＝  4 * 9 + 5 * 6 + 6 * 3 4 * 8 + 5 * 5 + 6 * 2 4 * 7 + 5 * 4 + 6 *1
6 5 4 7 * 9 + 8 * 6 + 9 * 3 7 * 8 + 8 * 5 + 9 * 2 7 * 7 + 8 * 4 + 9 *1 
3 2 1 並列に計算：初期データは異なるが演算は同一
「不老」利用型MPI講習会

並列処理の実行形態（２） タスク並列
 タスク（ジョブ）を分割することで並列化する。
 データの操作（＝演算）は異なるかもしれない。
 タスク並列の例：カレーを作る

仕事１：野菜を切る
 仕事２：肉を切る
 仕事３：水を沸騰させる
 仕事４：野菜・肉を入れて煮込む
 仕事５：カレールゥを入れる


●並列化

仕事１
仕事２

仕事４

仕事３
169

仕事５

時間
「不老」利用型MPI講習会

性能評価指標
並列化の尺度

170「不老」利用型MPI講習会

性能評価指標－台数効果
 台数効果SP = TS / TP (0 ≤ S p)
TP ：P台での実行時間
 TS ：逐次の実行時間、
 P台用いてSP = P のとき、理想的な（ideal）速度向上
 P台用いてSP > P のとき、スーパリニア・スピードアップ 式： 主な原因は、並列化により、データアクセスが局所化されて、キャッシュヒット率が向上することによる高速化
 並列化効率

EP = SP / P ×100 (0 ≤ Ep) [%] 飽和性能 式：

 速度向上の限界
 Saturation、「さちる」
171

Ｐ「不老」利用型MPI講習会

アムダールの法則
K とする。
そのうち、並列化ができる割合を α とする。
 このとき、台数効果は以下のようになる。
 逐次実行時間を

SP = K /(Kα / P + K(1−α))= 1/(α / P + (1−α)) = 1/(α(1/ P −1) +1)
 上記の式から、たとえ無限大の数のプロセッサを使っても（P→∞）、台数効果は、高々 １／（１－α） である。
（アムダールの法則）
 全体の９０％が並列化できたとしても、無限大の数のプロセッサをつかっても、 １/(１-0.9) = １0 倍 にしかならない！
→高性能を達成するためには、少しでも並列化効率を上げる実装をすることがとても重要である
172「不老」利用型MPI講習会

アムダールの法則の直観例
並列化できない部分（１ブロック） 並列化できる部分（８ブロック）●逐次実行＝88.8%が並列化可能●並列実行（４並列）

9/3=3倍●並列実行（８並列）

9/2=4.5倍 ≠ 6倍

173

「不老」利用型MPI講習会

内容に関する質問はkatagiri@cc.nagoya-u.ac.jp
まで

MPIの基礎名古屋大学情報基盤センター 片桐孝洋

174

「不老」利用型MPI講習会

MPIの特徴
 メッセージパッシング用のライブラリ規格の１つ

メッセージパッシングのモデルである
コンパイラの規格、特定のソフトウエアやライブラリを指すものではない！

 分散メモリ型並列計算機で並列実行に向く
 大規模計算が可能

１プロセッサにおけるメモリサイズやファイルサイズの制約を打破可能
プロセッサ台数の多い並列システム（MPPシステム、Massively Parallel
Processingシステム）を用いる実行に向く

１プロセッサ換算で膨大な実行時間の計算を、短時間で処理可能

移植が容易
 API（Application Programming Interface）の標準化

 スケーラビリティ、性能が高い



175

通信処理をユーザが記述することによるアルゴリズムの最適化が可能
プログラミングが難しい（敷居が高い）「不老」利用型MPI講習会

MPIの経緯（1/2）
 MPIフォーラム（http://www.mpi-forum.org/）が仕様策定
 １９９４年５月1.0版（MPI-１）
 １９９５年６月1.1版
 １９９７年７月1.2版、 および 2.0版（MPI-2）

 米国アルゴンヌ国立研究所、およびミシシッピ州立大学

で開発
 MPI-2 では、以下を強化：
 並列I/O
 C++、Fortran 90用インターフェース 動的プロセス生成/消滅 主に、並列探索処理などの用途

176「不老」利用型MPI講習会

MPIの経緯 MPI3.1策定
 以下のページで経緯・ドキュメントを公開中
 http://mpi-forum.org/docs/mpi-3.1/mpi31-report.pdf(Implementation Status, as of June 4, 2015)
 注目すべき機能 ノン・ブロッキングの集団通信機能（MPI_IALLREDUCE、など）
 片方向通信（RMA、Remote Memory Access) Fortran2008 対応、など

177「不老」利用型MPI講習会

MPIの経緯 MPI4.0策定
 以下のページで経緯・ドキュメントを公開中
 http://mpi-forum.org/mpi-40/
 検討されている機能
 ハイブリッドプログラミングへの対応
 MPIアプリケーションの耐故障性（Fault Tolerance, FT）
 いくつかのアイデアを検討中
 Active Messages (メッセージ通信のプロトコル)
計算と通信のオーバラップ 最低限の同期を用いた非同期通信
 低いオーバーヘッド、パイプライン転送
 バッファリングなしで、インタラプトハンドラで動く Stream Messaging
 新プロファイル・インターフェース
178「不老」利用型MPI講習会

MPIの実装
 MPICH（エム・ピッチ） 米国アルゴンヌ国立研究所が開発
 LAM（Local Area Multicomputer）
 ノートルダム大学が開発
 その他
 OpenMPI（FT-MPI、LA-MPI、LAM/MPI、PACX-MPIの統合プロジェクト） YAMPII（（旧）東大・石川研究室）（SCore通信機構をサポート） 注意点:メーカ独自機能拡張がなされていることがある
179「不老」利用型MPI講習会

MPIによる通信
 郵便物の郵送に同じ
 郵送に必要な情報：
1.
2.
3.
4.
5.

自分の住所、送り先の住所中に入っているものはどこにあるか中に入っているものの分類中に入っているものの量（荷物を複数同時に送る場合の）認識方法（タグ） MPIでは：
1.
2.
3.
4.
5.
180

自分の認識ID、および、送り先の認識ID
データ格納先のアドレス
データ型
データ量
タグ番号
「不老」利用型MPI講習会

MPI関数 システム関数
 MPI_Init； MPI_Comm_rank； MPI_Comm_size； MPI_Finalize； １対１通信関数
 ブロッキング型
 MPI_Send；

MPI_Recv；

 ノンブロッキング型
 MPI_Isend；

MPI_Irecv；

 １対全通信関数
 MPI_Bcast

 集団通信関数
 MPI_Reduce；

MPI_Allreduce； MPI_Barrier； 時間計測関数
 MPI_Wtime
181「不老」利用型MPI講習会

コミュニケータ
 MPI_COMM_WORLDは、コミュニケータとよばれる概念を保存する変数 コミュニケータは、操作を行う対象のプロセッサ群を定める
 初期状態では、０番～numprocs –１番までのプロセッサが、１つのコミュニケータに割り当てられる この名前が、“MPI_COMM_WORLD”

 プロセッサ群を分割したい場合、MPI_Comm_split 関数を利用 メッセージを、一部のプロセッサ群に放送するときに利用 “マルチキャスト”で利用
182「不老」利用型MPI講習会

基本演算
 逐次処理では、「データ構造」が重要
 並列処理においては、「データ分散方法」が重要

になる！
1.

2.
3.
4.

各PEの「演算負荷」を均等にする
ロード・バランシング： 並列処理の基本操作の一つ

粒度調整
各PEの「利用メモリ量」を均等にする
演算に伴う通信時間を短縮する
各PEの「データ・アクセスパターン」を高速な方式にする（＝逐次処理におけるデータ構造と同じ）

 行列データの分散方法＜次元レベル＞： １次元分散方式、２次元分散方式
 ＜分割レベル＞： ブロック分割方式、サイクリック（循環）分割方式
183「不老」利用型MPI講習会

１次元分散
N/4行

PE=0

N/4行

PE=1

N/4行

PE=2

N/4行

PE=3

•（行方向) ブロック分割方式•(Block, *) 分散方式

N列
1行•(行方向) サイクリック分割方式•(Cyclic, *) 分散方式

2行•(行方向)ブロック・サイクリック分割方式•(Cyclic(2), *) 分散方式

この例の「２」： ＜ブロック幅＞とよぶ
184「不老」利用型MPI講習会

2次元分散
N/2

N/2

N/2

PE=0 PE=1

N/2

PE=2 PE=3•ブロック・ブロック分割方式•(Block, Block)分散方式•サイクリック・サイクリック分割方式•(Cyclic, Cyclic)分散方式

0

1

0

1

0

1

0

1

2

3

2

3

2

3

2

3

0

1

0

1

0

1

0

1

2

3

2

3

2

3

2

3

0

1

0

1

0

1

0

1

2

3

2

3

2

3

2

3

0

0

1

1

0

0

1

1

0

1

0

1

0

1

0

1

0

0

1

1

0

0

1

1

2

3

2

3

2

3

2

3

2

2

3

3

2

2

3

3

2

2

3

3

2

2

3

3

0

0

1

1

0

0

1

1

0

0

1

1

0

0

1

1

2

2

3

3

2

2

3

3

2

2

3

3

2

2

3

3

•二次元ブロック・サイクリック分割方式•(Cyclic(2), Cyclic(2))分散方式「不老」利用型MPI講習会

185

ベクトルどうしの演算 以下の演算z = a x+ y

 ここで、αはスカラ、ｚ、ｘ、ｙはベクトル

 どのようなデータ分散方式でも並列処理が可能
 ただし、スカラ α は全PEで所有する。
 ベクトルはO(ｎ)のメモリ領域が必要なのに対し、スカラはO(１)のメモリ領域で大丈夫。
→スカラメモリ領域は無視可能
 計算量：O(N/P)
 あまり面白くない
186

＝

ｚ

「不老」利用型MPI講習会

＋

α

ｘ

ｙ

行列とベクトルの積 ＜行方式＞と＜列方式＞がある。

…

…

…

 ＜データ分散方式＞と＜方式＞組のみ合わせがあり、少し面白い
①②
①②
①②
①
①
①
②
②
②
…
=
=

for(i=0;i<n;i++){y[i]=0.0;
for(j=0;j<n;j++){y[i] += a[i][j]*x[j];}}for(j=0; j<n; j++) y[j]=0.0;
for(j=0; j<n; j++) {for (i=0; i<n; i++) {y[i] += a[i][j]*x[j];}}＜行方式＞： 自然な実装
C言語向き
187

＜列方式＞： Fortran言語向き「不老」利用型MPI講習会

行列とベクトルの積＜行方式の場合＞＜行方向分散方式＞ ：行方式に向く分散方式
PE=0

PE=0

PE=1

PE=1

=

PE=2
PE=3

PE=2
PE=3

右辺ベクトルを MPI_Allgather関数を利用し、全PEで所有する各PE内で行列ベクトル積を行う＜列方向分散方式＞ ：ベクトルの要素すべてがほしいときに向く=
各PE内で行列-ベクトル積
を行う
188

+

+

+

MPI_Reduce関数で総和を求める（※ある１PEにベクトルすべてが集まる）「不老」利用型MPI講習会

行列とベクトルの積＜列方式の場合＞＜行方向分散方式＞ ：無駄が多く使われない
PE=0

PE=0

PE=1

PE=1

PE=2

= + + + = PE=2

PE=3

PE=3

右辺ベクトルを MPI_Allgather関数を利用して、全PEで所有する結果をMPI_Reduce関数により総和を求める＜列方向分散方式＞ ：列方式に向く分散方式=
各PE内で行列-ベクトル積
を行う
189

+

+

+

MPI_Reduce関数で総和を求める（※ある１PEにベクトルすべてが集まる）「不老」利用型MPI講習会

基本的なMPI関数
送信、受信のためのインタフェース

190「不老」利用型MPI講習会

略語とMPI用語
 MPIは「プロセス」間の通信を行います。
 プロセスは、HT（ハイパースレッド）などを使わなければ、「プロセッサ」（もしくは、コア）に１対１で割り当てられます。
 今後、「MPIプロセス」と書くのは長いので、ここではPE（Processer Elementsの略）と書きます。


ただし用語として「PE」は、現在あまり使われていません。

 ランク（Rank）
各「MPIプロセス」の「識別番号」のこと。
 通常MPIでは、MPI_Comm_rank関数で設定される変数（サンプルプログラムではmyid）に、０～全PE数－１ の数値が入る
 世の中の全MPIプロセス数を知るには、MPI_Comm_size関数を使う。
（サンプルプログラムでは、numprocs に、この数値が入る）
191「不老」利用型MPI講習会

ランクの説明図

192

MPI
プログラム

MPI
プログラム

MPI
プログラム

MPI
プログラム

ランク０

ランク１

ランク２

ランク３

「不老」利用型MPI講習会

C言語インターフェースとFortranインターフェースの違い
 Ｃ版は、 整数変数ierr が戻り値
ierr = MPI_Xxxx(….);
 Ｆｏｒｔｒａｎ版は、最後に整数変数ierrが引数
call MPI_XXXX(…., ierr) システム用配列の確保の仕方
 Ｃ言語

MPI_Status istatus;
 Ｆｏｒｔｒａｎ言語
integer istatus(MPI_STATUS_SIZE)
193「不老」利用型MPI講習会

C言語インターフェースとFortranインターフェースの違い
 MPIにおける、データ型の指定
 C言語

MPI_CHAR (文字型) 、 MPI_INT (整数型)、
MPI_FLOAT (実数型)、MPI_DOUBLE(倍精度実数型)
 Fortran言語
MPI_CHARACTER (文字型) 、MPI_INTEGER (整数型)、
MPI_REAL (実数型)、MPI_DOUBLE_PRECISION(倍精度実数型) 、MPI_COMPLEX(複素数型)
 以降は、Ｃ言語インタフェースで説明する

194「不老」利用型MPI講習会

基礎的なMPI関数―MPI_Recv（１／２）
 ierr =MPI_Recv(recvbuf, icount, idatatype, isource,
itag, icomm, istatus);

 recvbuf :受信領域の先頭番地を指定する。
 icount : 整数型。受信領域のデータ要素数を指定する。
 idatatype : 整数型。受信領域のデータの型を指定する。
 MPI_CHAR (文字型) 、MPI_INT (整数型)、

MPI_FLOAT (実数型)、 MPI_DOUBLE(倍精度実数型)
 isource :整数型。受信したいメッセージを送信するPEのランクを指定する。

 任意のPEから受信したいときは、MPI_ANY_SOURCE を指定する。

195「不老」利用型MPI講習会

基礎的なMPI関数―MPI_Recv（２／２）
 itag : 整数型。受信したいメッセージに付いているタグの値を指定。
 任意のタグ値のメッセージを受信したいときは、MPI_ANY_TAG を指定。

 icomm : 整数型。PE集団を認識する番号であるコミュニケータ

を指定。
 通常ではMPI_COMM_WORLD を指定すればよい。



istatus : MPI_Status型（整数型の配列）。受信状況に関する情報が入る。かならず専用の型宣言をした配列を確保すること。
 要素数がMPI_STATUS_SIZEの整数配列が宣言される。
 受信したメッセージの送信元のランクが istatus[MPI_SOURCE]、

タグが istatus[MPI_TAG] に代入される。
 C言語： MPI_Status istatus;
 Fortran言語： integer istatus(MPI_STATUS_SIZE)ierr(戻り値) : 整数型。エラーコードが入る。
196「不老」利用型MPI講習会

基礎的なMPI関数―MPI_Send ierr = MPI_Send(sendbuf, icount, idatatype, idest,

itag, icomm);
 sendbuf :送信領域の先頭番地を指定
 icount : 整数型。送信領域のデータ要素数を指定
 idatatype : 整数型。送信領域のデータの型を指定
 idest : 整数型。送信したいPEのicomm内でのランクを指定 itag : 整数型。受信したいメッセージに付けられたタグの値を指定
 icomm : 整数型。プロセッサー集団を認識する番号である
コミュニケータを指定
 ierr (戻り値) : 整数型。エラーコードが入る。
197「不老」利用型MPI講習会

Send－Recvの概念（１対１通信）
PE0

PE１

PE２

PE３

MPI_Send

MPI_Recv

198「不老」利用型MPI講習会

基礎的なMPI関数―MPI_Bcast ierr = MPI_Bcast(sendbuf, icount, idatatype,iroot, icomm);
 sendbuf :送信および受信領域の先頭番地を指定する。
 icount : 整数型。送信領域のデータ要素数を指定する。
 idatatype : 整数型。送信領域のデータの型を指定する。
 iroot : 整数型。送信したいメッセージがあるPEの番号を指定する。全PEで同じ値を指定する必要がある。
 icomm : 整数型。PE集団を認識する番号である
コミュニケータを指定する。
 ierr (戻り値) : 整数型。エラーコードが入る。

199「不老」利用型MPI講習会

MPI_Bcastの概念（集団通信）
PE0
MPI_Bcast()

PE１
MPI_Bcast()

iroot

200

PE２

PE３

MPI_Bcast()

MPI_Bcast()

全PEが関数を呼ぶこと「不老」利用型MPI講習会

リダクション演算
 ＜操作＞によって＜次元＞を減少（リダクション）させる処理
 例：

内積演算
ベクトル（ｎ次元空間） → スカラ（１次元空間）

 リダクション演算は、通信と計算を必要とする
 集団通信演算（collective communication operation）と呼ばれる
 演算結果の持ち方の違いで、２種のインタフェースが存在する
201「不老」利用型MPI講習会

リダクション演算 演算結果に対する所有PEの違い
 MPI_Reduce関数
 リダクション演算の結果を、ある一つのPEに所有させる

PE0
PE0
PE1

操作
操作

PE2

PE0

 MPI_Allreduce関数
 リダクション演算の結果を、全てのPEに所有させる

PE0
PE1
202

PE0

操作
PE2

PE1
「不老」利用型MPI講習会

PE2

基礎的なMPI関数―MPI_Reduce ierr = MPI_Reduce(sendbuf, recvbuf, icount,

idatatype, iop, iroot, icomm);
 sendbuf : 送信領域の先頭番地を指定する。
 recvbuf : 受信領域の先頭番地を指定する。iroot で指定したPEのみで書き込みがなされる。
送信領域と受信領域は、同一であってはならない。
すなわち、異なる配列を確保しなくてはならない。
 icount : 整数型。送信領域のデータ要素数を指定する。
 idatatype : 整数型。送信領域のデータの型を指定する。
 （Fortran）＜最小／最大値と位置＞を返す演算を指定する場合は、MPI_2INTEGER(整数型)、 MPI_2REAL(単精度型)、MPI_2DOUBLE_PRECISION(倍精度型) 、を指定する。
203「不老」利用型MPI講習会

基礎的なMPI関数―MPI_Reduce iop :

整数型。演算の種類を指定する。

 MPI_SUM (総和)、 MPI_PROD (積)、 MPI_MAX (最大)、MPI_MIN (最小)、 MPI_MAXLOC (最大と位置)、
MPI_MINLOC (最小と位置) など。
 iroot :整数型。結果を受け取るPEのicomm 内でのランクを指定する。全てのicomm 内のPEで同じ値を指定する必要がある。
 icomm : 整数型。PE集団を認識する番号であるコ
ミュニケータを指定する。
 ierr : 整数型。 エラーコードが入る。
204「不老」利用型MPI講習会

MPI_Reduceの概念（集団通信）
PE0
MPI_Reduce()

PE１

PE２

PE３

MPI_Reduce()

MPI_Reduce()

MPI_Reduce()

データ３

データ４

iroot
データ１

データ２

iop（指定された演算）

205「不老」利用型MPI講習会

MPI_Reduceによる２リスト処理例（MPI_2DOUBLE_PRECISION と MPI_MAXLOC）
PE0
PE１
PE２
PE３
MPI_Reduce()

MPI_Reduce()

MPI_Reduce()

MPI_Reduce()

iroot
3.1

4.1

5.9

2.6

2.0

5.0

9.0

13.0

MPI_MAXLOC
5.9
9.0
206

LU分解の枢軸選択処理「不老」利用型MPI講習会

基礎的なMPI関数―MPI_Allreduce ierr = MPI_Allreduce(sendbuf, recvbuf, icount,

idatatype, iop, icomm);
 sendbuf : 送信領域の先頭番地を指定する。
 recvbuf : 受信領域の先頭番地を指定する。iroot で指定したPEのみで書き込みがなされる。
送信領域と受信領域は、同一であってはならない。
すなわち、異なる配列を確保しなくてはならない。
 icount : 整数型。送信領域のデータ要素数を指定する。
 idatatype : 整数型。送信領域のデータの型を指定する。
 最小値や最大値と位置を返す演算を指定する場合は、

MPI_2INT(整数型)、MPI_2FLOAT (単精度型)、
MPI_2DOUBLE(倍精度型) を指定する。

207「不老」利用型MPI講習会

基礎的なMPI関数―MPI_Allreduce iop :

整数型。演算の種類を指定する。
 MPI_SUM (総和)、 MPI_PROD (積)、 MPI_MAX(最大)、MPI_MIN (最小)、 MPI_MAXLOC (最大と位置)、 MPI_MINLOC (最小と位置) など。
 icomm : 整数型。PE集団を認識する番号であるコ
ミュニケータを指定する。
 ierr : 整数型。 エラーコードが入る。

208「不老」利用型MPI講習会

MPI_Allreduceの概念（集団通信）
PE0

PE１

PE２

PE３

MPI_Allreduce()

MPI_Allreduce()

MPI_Allreduce()

MPI_Allreduce()

データ０

データ１

データ２

データ３

iop（指定された演算）
演算済みデータの放送

209「不老」利用型MPI講習会

リダクション演算
 性能について リダクション演算は、１対１通信に比べ遅い
 プログラム中で多用すべきでない！
 MPI_Allreduce は MPI_Reduce に比べ遅い
 MPI_Allreduce は、放送処理が入る。
 なるべく、MPI_Reduce を使う。

210

「不老」利用型MPI講習会

行列の転置A が（Block,＊）分散されているとする。
T 行列 A の転置行列 A を作るには、MPIでは
 行列

次の２通りの関数を用いる
 MPI_Gather関数

abc MPI_Scatter関数

a b c

211

a b c

a
b
c
「不老」利用型MPI講習会

集めるメッセージ
サイズが各PEで均一のとき使う
集めるサイズが各PEで均一でないときは：
MPI_GatherV関数
MPI_ScatterV関数

基礎的なMPI関数―MPI_Gather
 ierr = MPI_Gather (sendbuf, isendcount, isendtype,recvbuf, irecvcount, irecvtype, iroot, icomm);
 sendbuf :送信領域の先頭番地を指定する。
 isendcount: 整数型。送信領域のデータ要素数を指定する。
 isendtype : 整数型。送信領域のデータの型を指定する。
 recvbuf : 受信領域の先頭番地を指定する。iroot で指定したPEのみで書き込みがなされる。
 なお原則として、送信領域と受信領域は、同一であってはならない。

すなわち、異なる配列を確保しなくてはならない。
 irecvcount:

整数型。受信領域のデータ要素数を指定する。

 この要素数は、１PE当たりの送信データ数を指定すること。
 MPI_Gather 関数では各PEで異なる数のデータを収集することはできないので、同じ値を指定すること。
212「不老」利用型MPI講習会

基礎的なMPI関数―MPI_Gather
 irecvtype :整数型。受信領域のデータ型を指定する。
 iroot : 整数型。収集データを受け取るPEのicomm 内でのランクを指定する。
 全てのicomm 内のPEで同じ値を指定する必要がある。
 icomm : 整数型。PE集団を認識する番号である
コミュニケータを指定する。
 ierr : 整数型。エラーコードが入る。
213「不老」利用型MPI講習会

MPI_Gatherの概念（集団通信）
PE0

PE１

PE２

PE３

MPI_Gather()

MPI_Gather()

MPI_Gather()

MPI_Gather()

データC

データD

iroot
データA

データB

収集処理
データA
データB
データC
データD
214

「不老」利用型MPI講習会

基礎的なMPI関数―MPI_Scatter ierr = MPI_Scatter ( sendbuf, isendcount, isendtype,recvbuf, irecvcount, irecvtype, iroot, icomm);
 sendbuf :送信領域の先頭番地を指定する。
 isendcount: 整数型。送信領域のデータ要素数を指定する。
 この要素数は、１PE当たりに送られる送信データ数を指定すること。
 MPI_Scatter 関数では各PEで異なる数のデータを分散することはできないので、同じ値を指定すること 。
 isendtype :整数型。送信領域のデータの型を指定する。
iroot で指定したPEのみ有効となる。
 recvbuf : 受信領域の先頭番地を指定する。
 なお原則として、送信領域と受信領域は、同一であってはならない。

すなわち、異なる配列を確保しなくてはならない。
 irecvcount:215

整数型。受信領域のデータ要素数を指定する。
「不老」利用型MPI講習会

基礎的なMPI関数―MPI_Scatter irecvtype :整数型。受信領域のデータ型を指定する。
 iroot : 整数型。収集データを受け取るPEのicomm 内でのランクを指定する。
 全てのicomm 内のPEで同じ値を指定する必要がある。
 icomm : 整数型。PE集団を認識する番号である
コミュニケータを指定する。
 ierr : 整数型。エラーコードが入る。
216「不老」利用型MPI講習会

MPI_Scatterの概念（集団通信）
PE0

PE１

PE２

PE３

MPI_Scatter()

MPI_Scatter()

MPI_Scatter()

MPI_Scatter()

iroot
データA
データB
データC
データD

分配処理
データA
217

データB

データC
「不老」利用型MPI講習会

データD

参考文献
1.
2.

3.
4.

218

MPI並列プログラミング、P.パチェコ 著 ／ 秋葉 博 訳
並列プログラミング虎の巻MPI版、青山幸也 著、
高度情報科学技術研究機構（ＲＩＳＴ） 神戸センター（ http://www.hpci-office.jp/pages/seminar_text ）Message Passing Interface Forum（ http://www.mpi-forum.org/ ）並列コンピュータ工学、富田眞治著、昭晃堂（１９９６）「不老」利用型MPI講習会

MPIプログラミング実習（演習）219「不老」利用型MPI講習会

講義の流れ
1.
2.
3.
4.
5.

220

行列-行列とは（３０分）
行列-行列積のサンプルプログラムの実行
サンプルプログラムの説明
演習課題（１）：簡単なもの
演習課題（２）：ちょっと難しいもの（中級）「不老」利用型MPI講習会

行列‐行列積の演習の流れ
 演習課題（Ⅱ）
 簡単なもの（３０分程度で並列化）
 通信関数が一切不要

 演習課題（Ⅲ）
 ちょっと難しい（１時間以上で並列化）
 １対１通信関数が必要
 演習課題（Ⅰ）が早く終わってしまった方は、やってみてください。
221「不老」利用型MPI講習会

行列-行列積とは実装により性能向上が見込める基本演算

222「不老」利用型MPI講習会

１.5 行列の積
C = A ・ B は、コンパイラや計算機のベンチマークに使われることが多い 理由１：実装方式の違いで性能に大きな差がでる 理由２：手ごろな問題である（プログラムし易い） 理由３：科学技術計算の特徴がよく出ている
1. 非常に長い＜連続アクセス＞がある
2. キャッシュに乗り切らない＜大規模なデータ＞
に対する演算である
3. メモリバンド幅を食う演算（メモリ・インテンシブ）な処理である

 行列積

223「不老」利用型MPI講習会

行列積コード例（Ｃ言語） コード例for (i=0; i<n; i++)for (j=0; j<n; j++)for (k=0; k<n; k++)C[i][j] += A[i][k] *B[k][j];
j

k

C
i

A
i

224

j

B
k

「不老」利用型MPI講習会

１.5 行列の積n 行列積

cij =  aik bkj (i, j = 1, 2, ..., n)k =1の実装法は、次の二通りが知られている：

ループ交換法1.


ブロック化（タイリング）法

2.


225

連続アクセスの方向を変える目的で、行列-行列積を実現する３重ループの順番を交換する
キャッシュにあるデータを再利用する目的で、あるまとまった行列の部分データを、何度もアクセスするように実装する「不老」利用型MPI講習会

１.5 行列の積
 ループ交換法
 行列積のコードは、以下のような３重ループになる（Ｃ言語）

for(i=0; i<n; i++) {for(j=0; j<n; j++) {for(k=0; k<n; k++) {c[ i ][ j ] = c[ i ][ j ] + a[ i ][ k ] * b[ k][ j ];}}}
 最内部の演算は、外側の３ループを交換しても、計算結果が変わらない→ ６通りの実現の方法がある
226「不老」利用型MPI講習会

１.5 行列の積
 ループ交換法
 行列積のコードは、以下のような３重ループになる（Fortran言語）

do i=1, n
do j=1, n
do k=1, nc( i , j ) = c( i, j) + a( i , k ) * b( k , j )
enddo
enddo
enddo
 最内部の演算は、外側の３ループを交換しても、計算結果が変わらない→ ６通りの実現の方法がある
227「不老」利用型MPI講習会

１.5 行列の積
 行列データへのアクセスパターンから、以下の３種類に分類できる
1. 内積形式 (inner-product form)
最内ループのアクセスパタンが＜ベクトルの内積＞と同等
2. 外積形式 (outer-product form)
最内ループのアクセスパタンが＜ベクトルの外積＞と同等
3. 中間積形式 (middle-product form)
内積と外積の中間
228「不老」利用型MPI講習会

１.5 行列の積
 内積形式 (inner-product form）
 ijk, jikループによる実現（Ｃ言語）A

 for (i=0; i<n; i++) {for (j=0; j<n; j++) {dc = 0.0;
for (k=0; k<n; k++){dc = dc + A[ i ][ k ] * B[ k ][ j ];}C[ i ][ j ]= dc;}}※以降、最外のループからの変数の順番で実装法を呼ぶ。たとえば上記のコードは＜ijkループ＞。
229

B
….

●行方向と列方向のアクセスあり→行方向・列方向格納言語の両方で性能低下要因
解決法：
A, Bどちらか一方を転置しておく「不老」利用型MPI講習会

１.5 行列の積
 内積形式 (inner-product form）
 ijk, jikループによる実現（Fortran言語）A do i=1, n

do j=1, n
dc = 0.0d0
do k=1, n
dc = dc + A( i , k ) * B( k , j )enddo
C( i , j ) = dc
enddo
enddo

※以降、最外のループからの変数の順番で実装法を呼ぶ。たとえば上記のコードは＜ijkループ＞。
230

B
….

●行方向と列方向のアクセスあり→行方向・列方向格納言語の両方で性能低下要因
解決法：
A, Bどちらか一方を転置しておく「不老」利用型MPI講習会

１.5 行列の積
 外積形式 (outer-product form）
 kij, kjiループによる実現（Ｃ言語） for (i=0; i<n; i++) {for (j=0; j<n; j++) {C[ i ][ j ] = 0.0;
}

A

B
….

}
for (k=0; k<n; k++) {for (j=0; j<n; j++) {db = B[ k ][ j ];●kjiループではfor (i=0; i<n; i++) {列方向アクセスがメイン→列方向格納言語向き
C[ i ][ j ]= C[ i ][ j ]+ A[ i ][ k ]* db;（Ｆｏｒｔｒａｎ言語）
}
}
}
231
「不老」利用型MPI講習会

１.5 行列の積
 外積形式 (outer-product form）
 kij, kjiループによる実現（Fortran言語）
 do i=1, nAB
do j=1, n
C( i , j ) = 0.0d0
….
enddo
enddo
do k=1, n
do j=1, n
db = B( k , j )●kjiループでは
do i=1, n
列方向アクセスがメイン
C( i , j ) = C( i , j )+ A( i , k ) * db
→列方向格納言語向き（Ｆｏｒｔｒａｎ言語）
enddo
enddo
232enddo「不老」利用型MPI講習会

１.5 行列の積
 中間積形式 (middle-product form）
 ikj, jkiループによる実現（Ｃ言語） for (j=0; j<n; j++){for (i=0; i<n; i++) {C[ i ][ j ] = 0.0;}
for (k=0; k<n; k++) {db = B[ k ][ j ];for (i=0; i<n; i++) {C[ i ][ j ] = C[ i ][ j ] + A[ i ][ k ] * db;
}

}
}
233

A

B
.
.

●jkiループでは

全て列方向アクセス→列方向格納言語に最も向いている（Ｆｏｒｔｒａｎ言語）「不老」利用型MPI講習会

１.5 行列の積
 中間積形式 (middle-product form）
 ikj, jkiループによる実現（Fortran言語）
 do j=1, n

do i=1, n
C( i , j ) = 0.0d0
enddo
do k=1, n
db = B( k , j )do i=1, n
C( i , j ) = C( i , j ) + A( i , k ) * db
enddo
enddo
enddo
234

A

B
.
.

●jkiループでは

全て列方向アクセス→列方向格納言語に最も向いている（Ｆｏｒｔｒａｎ言語）「不老」利用型MPI講習会

１.5 行列の積
 小行列ごとの計算に分けて（配列を用意し）計算（＜ブロック化＞, ＜タイリング＞:コンパイラ用語）n/ 以下の計算n~~ ~C ij =  A ik B kj

n

k =1

235

=

~
~ … A
A i1
i p
「不老」利用型MPI講習会

…

~
C ij

~
B1 j
~
B pj

p
n/

p

１.5 行列の積
 各小行列をキャッシュに収まるサイズにする。

ブロック単位で高速な演算が行える
並列アルゴリズムの変種が構築できる

1.
2.

 並列行列積アルゴリズムは、データ通信の形態

から、以下の２種に分類可能：
1. セミ・シストリック方式


フル・シストリック方式

2.

236

行列A、Bの小行列の一部をデータ移動（Cannonのアルゴリズム）
行列A、Bの小行列のすべてをデータ移動（Foxのアルゴリズム）「不老」利用型MPI講習会

サンプルプログラムの実行（行列-行列積）237「不老」利用型MPI講習会

行列-行列積のサンプルプログラムの注意点
 C言語版/Fortran言語版の共通ファイル名

Mat-Mat-flow-fx.tar

238「不老」利用型MPI講習会

行列-行列積のサンプルプログラムの実行 以下のコマンドを実行する$ cp /center/a49904a/Mat-Mat-flow-fx.tar ./$ tar xvf Mat-Mat-flow-fx.tar$ cd Mat-Mat 以下のどちらかを実行$ cd C : C言語を使う人$ cd F : Ｆｏｒｔｒａｎ言語を使う人
 以下共通$ make$ pjsub mat-mat.bash
 実行が終了したら、以下を実行する$ cat mat-mat.bash.XXXXXX.out
239「不老」利用型MPI講習会

行列-行列積のサンプルプログラムの実行（Ｃ言語）
 以下のような結果が見えれば成功

N = 2000
Mat-Mat time = 0.324356 [sec.]
49328.561198 [MFLOPS]
OK!

１コアのみで、49.3GＦＬOPSの性能

240「不老」利用型MPI講習会

行列-行列積のサンプルプログラムの実行（Fortran言語）
 以下のような結果が見えれば成功

NN = 2000
Mat-Mat time[sec.] = 0.3214948605746031
MFLOPS = 49767.51395343402
OK!

１コアのみで、49.7ＧＦＬOPSの性能

241「不老」利用型MPI講習会

サンプルプログラムの説明
 #defineN
2000の、数字を変更すると、行列サイズが変更できます #define DEBUG １の「０」を「１」にすると、行列-行列積の演算結果が検証できます。
 MyMatMat関数の仕様
 Ｄｏｕｂｌｅ型N×N行列ＡとＢの行列積をおこない、Ｄｏｕｂｌｅ型Ｎ×Ｎ行列Ｃにその結果が入ります
242「不老」利用型MPI講習会

Fortran言語のサンプルプログラムの注意
 行列サイズＮの宣言は、以下のファイルにあります。
mat-mat.inc 行列サイズ変数が、ＮＮとなっています。
integer NN
parameter (NN=2000)

243「不老」利用型MPI講習会

演習課題（１） MyMatMat関数を並列化してください。
 #defineN576
 #define DEBUG １として、デバッグをしてください。
 行列Ａ、Ｂ、Ｃは、各ＰＥで重複して、かつ全部（Ｎ×Ｎ）所有してよいです。

244「不老」利用型MPI講習会

演習課題（１） サンプルプログラムでは、行列Ａ、Ｂの要素を全部１として、行列-行列積の結果をもつ行列
Ｃの全要素がＮであるか調べ、結果検証しています。デバックに活用してください。
 行列Ｃの分散方式により、演算結果チェックルーチンの並列化が必要になります。注意してください。
245「不老」利用型MPI講習会

並列化のヒント 以下のようなデータ分割にすると、とても簡単です。

Ｃ
PE0

Ｎ/4

Ａ
Ｎ/4

PE１
PE2

Ｂ

PE0
PE１

＝

PE2

PE3

PE3

N

N

＊

 通信関数は一切不要です。

246「不老」利用型MPI講習会

PE0
PE１
PE2
PE3

全ＰＥで重複して全要素を所有MPI並列化の大前提（再確認） ＳＰＭＤ 対象のプログラム（mat-mat.c, mat-mat.f） は、
 すべてのＰＥで、かつ、
 同時に起動された状態から処理が始まる。
 分散メモリ型並列計算機
 各ＰＥは、完全に独立したメモリを持っている。他のＰＥからは、通信なしには参照できない。（共有メモリではない）
247「不老」利用型MPI講習会

MPI並列化の大前提（再確認） 各ＰＥでは、＜同じプログラムが同時に起動＞されて開始されます。

mpirun mat-mat.c
ＰＥ０

ＰＥ１

ＰＥ２

ＰＥ３

mat-mat.c

mat-mat.c

mat-mat.c

mat-mat.c

248「不老」利用型MPI講習会

MPI並列化の大前提（再確認） 各ＰＥでは、＜別配列が個別に確保＞されます。
ＰＥ０
Ａ［N］［N］

ＰＥ１

ＰＥ２

Ａ［N］［N］

Ａ［N］［N］

ＰＥ３
Ａ［N］［N］

 myid変数は、MPI_Init()関数（もしくは、サブルーチン）が呼ばれた段階で、＜各ＰＥ固有の値＞になっています。
ＰＥ０
myid = 0249

ＰＥ１
myid = １

ＰＥ２
myid = 2「不老」利用型MPI講習会

ＰＥ３
myid = 3

各PEでの配列の確保状況
 実際は、以下のように配列が確保されていて、部分的に使うだけになります

Ｎ/4

PE0

PE１

PE２

PE３

Ａ

Ａ

Ａ

Ａ

PE0
PE１
PE2
PE3
N
250

N

N
「不老」利用型MPI講習会

N本実習プログラムのTIPS myid, numprocs は大域変数です myid (=自分のＩＤ)、および、numprocs(=世の中のＰＥ台数)の変数は大域変数です。MyMatVec関数
内で、引数設定や宣言なしに、参照できます。
 myid, numprocs の変数を使う必要があります MyMatMat関数を並列化するには、 myid 、および、

numprocs変数を利用しないと、並列化ができません。

251「不老」利用型MPI講習会

並列化の考え方（行列-ベクトル積の場合、Ｃ言語）
 SIMDアルゴリズムの考え方（４ＰＥの場合）
各ＰＥで
行列Ａ
重複して
for ( j=0; j<n/4; j++) { 内積( j, i ) }

所有する

PE0
for ( j=0; j<n; j++){ 内積( j, i ) }for ( j=n/4; j<(n/4)*2; j++) { 内積( j, i ) }PE１
for ( j=(n/4)*2; j<(n/4)*3; j++) { 内積( j, i ) }PE2for ( j=(n/4)*3; j<n; j++) { 内積( j, i ) }
PE3

252

「不老」利用型MPI講習会

ベクトルｘ並列化の考え方（行列-ベクトル積の場合、Fortran言語）
 SIMDアルゴリズムの考え方（４ＰＥの場合）
各ＰＥで
行列Ａ
重複して
do j=1, n/4
内積( j, i )PE0 enddo

do j=1, n
内積( j, i )
enddo

所有する

do j=(n/4)+1, (n/4)*2
内積( j, i )PE１ enddo
do j=(n/4)*2+1, (n/4)*3
内積( j, i )PE2 enddo
do j=(n/4)*3+1, n
内積( j, i )PE3 enddo

253「不老」利用型MPI講習会

ベクトルｘ並列化の方針（Ｃ言語）
全PEで行列AをN×Nの大きさ、ベクトルｘ、ｙをNの大きさ、確保してよいとする。
各PEは、担当の範囲のみ計算するように、ループの開始値と終了値を変更する。

1.
2.


ブロック分散方式では、以下になる（n が numprocs で割り切れる場合）
ib = n / numprocs;for ( j=myid*ib; j<(myid+１)*ib; j++){…}（２の並列化が完全に終了したら）各PEで担当のデータ部分しか行列を確保しないように変更する。

3.

254

上記のループは、以下のようになる。
for ( j=0; j<ib; j++) { … }「不老」利用型MPI講習会

並列化の方針（Fortran言語）
全PEで行列AをN×Nの大きさ、ベクトルｘ、ｙをNの大きさ、確保してよいとする。
各PEは、担当の範囲のみ計算するように、ループの開始値と終了値を変更する。

1.
2.


ブロック分散方式では、以下になる（n が numprocs で割り切れる場合）
ib = n / numprocs
do j = myid*ib+１, (myid+１)*ib
…..
enddo

（２の並列化が完全に終了したら）各PEで担当のデータ部分しか行列を確保しないように変更する。

3.


255

上記のループは、以下のようになる。
do j=１, ib…
「不老」利用型MPI講習会
enddo実装上の注意 ループ変数をグローバル変数にすると、性能が出ません。

必ずローカル変数か、定数（ 2 など）にしてください。

ローカル変数にすること for (i=i_start; i<i_end; i++) {

…
…
}
256

「不老」利用型MPI講習会

257「不老」利用型MPI講習会

参考資料

258

「不老」利用型MPI講習会

サンプルプログラムの実行（行列-行列積（その２））259「不老」利用型MPI講習会

行列-行列積のサンプルプログラムの注意点
 C言語版/Fortran言語版のファイル名

Mat-Mat-d-flow-fx.tar

260「不老」利用型MPI講習会

行列-行列積(2)のサンプルプログラムの実行 以下のコマンドを実行する$ cp /center/a49904a/Mat-Mat-d-flow-fx.tar ./$ tar xvf Mat-Mat-d-flow-fx.tar$ cd Mat-Mat-d 以下のどちらかを実行$ cd C : C言語を使う人$ cd F : Ｆｏｒｔｒａｎ言語を使う人
 以下共通$ make$ pjsub mat-mat-d.bash
 実行が終了したら、以下を実行する$ cat mat-mat-d.bash.XXXXXX.out
261「不老」利用型MPI講習会

行列-行列積のサンプルプログラムの実行（Ｃ言語版）
 以下のような結果が見えれば成功

N = 576
Mat-Mat time = 0.000918 [sec.]
416291.869587 [MFLOPS]
Error! in ( 0 , 1 )-th argument in PE 0
Error! in ( 0 , 1 )-th argument in PE 16
Error! in ( 0 , 1 )-th argument in PE 13
Error! in ( 0 , 1 )-th argument in PE 101
Error! in ( 0 , 1 )-th argument in PE 105
Error! in ( 0 , 1 )-th argument in PE 129
・・・・
262

並列化が完成していないのでエラーが出ます。
ですが、これは
正しい動作です「不老」利用型MPI講習会

行列-行列積のサンプルプログラムの実行（Fortran言語）
 以下のような結果が見えれば成功
NN = 576
Mat-Mat time = 5.562599748373032E-03
MFLOPS = 68709.95008167029
Error! in ( 1 , 2 )-th argument in PE 0
Error! in ( 1 , 2 )-th argument in PE 21
Error! in ( 1 , 2 )-th argument in PE 22
Error! in ( 1 , 2 )-th argument in PE 43
Error! in ( 1 , 2 )-th argument in PE 16
Error! in ( 1 , 2 )-th argument in PE 17
Error! in ( 1 , 2 )-th argument in PE 19

並列化が
完成して
いないので
エラーが出ます。
ですが、これは正しい動作です。

Error! in ( 1 , 2 )-th argument in PE 3…
263

「不老」利用型MPI講習会

サンプルプログラムの説明
 #defineN576

 数字を変更すると、行列サイズが変更できます #define

DEBUG １

 「０」を「１」にすると、行列-行列積の演算結果が検証できます。
 MyMatMat関数の仕様
 Ｄｏｕｂｌｅ型の行列Ａ（（N/NPROCS）×N行列）とＢ（（N×（N/NPROCS）行列））の行列積をおこない、Ｄｏｕｂｌｅ型の（N/NPROCS)×Ｎ行列Ｃに、その結果が
入ります。

264

「不老」利用型MPI講習会

Fortran言語のサンプルプログラムの注意
 行列サイズＮの宣言は、以下のファイルにあります。
mat-mat-d.inc 行列サイズ変数が、ＮＮとなっています。
integer NN
parameter (NN=576)

265「不老」利用型MPI講習会

演習課題（１） MyMatMat関数（手続き）を並列化してください。
 デバック時は#define N 576
としてください。
 行列Ａ、Ｂ、Ｃの初期配置（データ分散）を、十分に考慮してください。

266「不老」利用型MPI講習会

行列Ａ、Ｂ、Ｃの初期配置
 行列Ａ、Ｂ、Ｃの配置は以下のようになっています。

（ただし以下は４PEの場合で、実習環境は576PEです。）

Ｃ
N/
NPROCS

PE0
PE１
PE2

Ａ
N/
NPROCS
＝

Ｂ

PE0
PE１
PE2

PE3

PE3

N

N

＊ PE0 PE１ PE2 PE3

N/NPORCS １対１通信関数が必要です。
 行列Ａ、Ｂ、Ｃの配列のほかに、受信用バッファの配列が必要です。
267「不老」利用型MPI講習会

N

入力と出力仕様
N/
NPROCS

入力：

Ａ

Ｂ

PE0
PE１
PE2

PE0 PE１ PE2 PE3

PE3

Ｃ
N/
NPROCS

N

PE0
PE１
PE2

：出力

N/NPROCSこの例は４PEの場合ですが、実習環境は
５７６PEです。

PE3
268

N

「不老」利用型MPI講習会

N並列化の注意（Ｃ言語） 各配列は、完全に分散されています。
 各ＰＥでは、以下のようなインデックスの配列となってい

ます。

j

0
0

N-1
Ａ[i][j]i00jN/NPROCS-10i

B[i][j]0N-1
C[i][j]i

N/NPROCS-1

N/NPROCS-1
N-1

 各PEで行う、ローカルな行列-行列積演算時のインデックス指定に注意してください。
269

j「不老」利用型MPI講習会

並列化の注意（Fortran言語）
 各配列は、完全に分散されています。
 各ＰＥでは、以下のようなインデックスの配列となってい
j

ます。
1
1

N
Ａ( i, j )

i

1
1

j

N/NPROCS
1i

B( i, j )j1NC( i, j )i

N/NPROCS

N/NPROCS
N 各PEで行う、ローカルな行列-行列積演算時のインデックス指定に注意してください。
270「不老」利用型MPI講習会

並列化のヒント 行列積を計算するには、各PEで完全な行列Bのデータがないので、行列Bのデータについて通信が必要です。
 たとえば、以下のように計算する方法があります。
 ステップ１

Ｃ

Ａ

PE0

PE0

PE１

PE１

Ｎ／ＮＰＲＯＣＳＮ／
ＮＰＲＯＣＳ

PE2
PE3

＝

PE2

Ｂ
＊ PE0 PE１ PE2 PE3

PE3
ローカルなデータを使って得られた行列-行列積結果

271「不老」利用型MPI講習会

並列化のヒント ステップ２

Ｂ
自分の持っているデータをひとつ左隣りに転送する（ＰＥ０は、ＰＥ３に送る）【循環左シフト転送】

PE0 PE１ PE2 PE3

Ｃ

Ａ

PE0

PE0

PE１

PE１

PE2
PE3

272

＝

PE2

Ｂ
＊

PE3
ローカルなデータを使って得られた行列-行列積結果「不老」利用型MPI講習会

PE0 PE１ PE2 PE3並列化のヒント ステップ3Ｂ

PE0 PE１ PE2 PE3

Ｃ

Ａ

PE0

PE0

PE１

PE１

PE2
PE3

273

＝

PE2

自分の持っているデータをひとつ左隣りに転送する（ＰＥ０は、ＰＥ３に送る）【循環左シフト転送】

Ｂ＊ PE0 PE１ PE2 PE3

PE3
ローカルなデータを使って得られた行列-行列積結果「不老」利用型MPI講習会

並列化の注意（１／３）
 循環左シフト転送を実装する際、全員がMPI_Sendを先に発行すると、その場所で処理が止まる。
（正確には、動いたり、動かなかったり、する）…
MPI_Send(…);
MPI_Recv(…);…
274

このMPI_Send
で止まる「不老」利用型MPI講習会

並列化の注意（２／３）
 MPI_Send で止まる理由
1.
2.
3.
4.
5.

275

MPI_Sendの処理中で、大きいメッセージを送るとき、システムのバッファ領域がなくなる。
バッファ領域が空くまで待つ（スピンウェイトする）。
バッファ領域が空くには、相手の受信が呼ばれる必要がある。
しかし、世の中に受信（MPI_Recv）をコールする人はいない。
バッファ領域が、永遠に空かない。
→一生、スピンウェイトから脱出できない。
（MPI_Sendの箇所でずっと止まる）「不老」利用型MPI講習会

並列化の注意（３／３）
 これ（デットロック）を回避するため、以下の実装を行う。
 ＰＥ番号が２で割り切れるＰＥ：
 MPI_Send(); MPI_Recv();
 それ以外のＰＥ：
それぞれに対応
 MPI_Recv();
 MPI_Send();276「不老」利用型MPI講習会

デットロック回避の通信パターン
 以下の２ステップで、循環左シフト通信をする

Ｂ

ステップ１：
２で割り切れるＰＥがデータを送るPE0 PE１ PE2 PE3

ステップ２：
２で割り切れないＰＥがデータを送る
277「不老」利用型MPI講習会

基礎的なMPI関数―MPI_Recv（１／２）
 ierr =MPI_Recv(recvbuf, icount, idatatype, isource,
itag, icomm, istatus);

 recvbuf :受信領域の先頭番地を指定する。
 icount : 整数型。受信領域のデータ要素数を指定する。
 idatatype : 整数型。受信領域のデータの型を指定する。
 MPI_CHAR (文字型) 、MPI_INT (整数型)、

MPI_FLOAT (実数型)、 MPI_DOUBLE(倍精度実数型)
 isource :整数型。受信したいメッセージを送信するPEのランクを指定する。

 任意のPEから受信したいときは、MPI_ANY_SOURCE を指定する。

278「不老」利用型MPI講習会

基礎的なMPI関数―MPI_Recv（２／２）
 itag : 整数型。受信したいメッセージに付いているタグの値を指定する。
 任意のタグ値のメッセージを受信したいときは、MPI_ANY_TAG を指定する。
 icomm : 整数型。PE集団を認識する番号であるコミュニケータ

を指定する。
 通常ではMPI_COMM_WORLD を指定すればよい。



istatus : MPI_Status型（整数型の配列）。受信状況に関する情報が入る。専用の配列を宣言すること。
 要素数がMPI_STATUS_SIZEの整数配列が宣言される。
 受信したメッセージの送信元のランクが istatus[MPI_SOURCE]、

タグが istatus[MPI_TAG] に代入される。

279

ierr(戻り値) : 整数型。エラーコードが入る。
「不老」利用型MPI講習会

実装上の注意 タグ(itag)について
 MPI_Send(), MPI_Recv()で現れるタグ（itag）は、任意のint型の数字を指定してよいです。
 ただし、同じ値（0など）を指定すると、どの通信に対応する
かわからなくなり、誤った通信が行われるかもしれません。
 循環左シフト通信では、MPI_Send()と MPI_Recv()の対が、２つでてきます。これらを別のタグにした方が、より安全です。
 たとえば、一方は最外ループの値iloopとして、もう一方をiloop+NPROCSとすれば、全ループ中でタグがぶつかることがなく、安全です。
280「不老」利用型MPI講習会

さらなる並列化のヒント
以降、本当にわからない人のための資料です。
ほぼ回答が載っています。

281「不老」利用型MPI講習会

並列化のヒント
1.
2.
3.
4.

282

循環左シフトは、ＰＥ総数-１回 必要
行列Ｂのデータを受け取るため、行列B[][]に関するバッファ行列B_T[][]が必要受け取ったB_T[][] を、ローカルな行列-行列積で使うため、B[][]へコピーする。
ローカルな行列-行列積をする場合の、
対角ブロックの初期値：ブロック幅*myid。
ループ毎にブロック幅だけ増やしていくが、Nを超えたら0に戻さなくてはいけない。
「不老」利用型MPI講習会

並列化のヒント（ほぼ回答，Ｃ言語）
 以下のようなコードになる。

283

ib = n/numprocs;for (iloop=0; iloop<NPROCS; iloop++ ) {ローカルな行列-行列積 C = A * B;
if (iloop != (numprocs-1) ) {if (myid % 2 == 0 ) {MPI_Send(B, ib*n, MPI_DOUBLE, isendPE,
iloop, MPI_COMM_WORLD);MPI_Recv(B_T, ib*n, MPI_DOUBLE, irecvPE,
iloop+numprocs, MPI_COMM_WORLD, &istatus);} else {MPI_Recv(B_T, ib*n, MPI_DOUBLE, irecvPE,
iloop, MPI_COMM_WORLD, &istatus);
MPI_Send(B, ib*n, MPI_DOUBLE, isendPE,
iloop+numprocs, MPI_COMM_WORLD);}
B[ ][ ] へ B_T[ ][ ] をコピーする；}}「不老」利用型MPI講習会

並列化のヒント（ほぼ回答，Ｃ言語）
 ローカルな行列-行列積は、以下のようなコードになる。

jstart=ib*( (myid+iloop)%NPROCS );for (i=0; i<ib; i++) {for(j=0; j<ib; j++) {for(k=0; k<n; k++) {C[ i ][ jstart + j ] += A[ i ][ k ] * B[ k ][ j ];
}
}
}

284

「不老」利用型MPI講習会

並列化のヒント（ほぼ回答，Fortran言語）
 以下のようなコードになる。

285

ib = n/numprocs
do iloop=0, NPROCS-1
ローカルな行列-行列積 C = A * B
if (iloop .ne. (numprocs-1) ) thenif (mod(myid, 2) .eq. 0 ) thencall MPI_SEND(B, ib*n, MPI_DOUBLE_PRECISION, isendPE,&
iloop, MPI_COMM_WORLD, ierr)call MPI_RECV(B_T, ib*n, MPI_DOUBLE_PRECISION, irecvPE,&
iloop+numprocs, MPI_COMM_WORLD, istatus, ierr)else
call MPI_RECV(B_T, ib*n, MPI_DOUBLE_PRECISION, irecvPE,&
iloop, MPI_COMM_WORLD, istatus, ierr)call MPI_SEND(B, ib*n, MPI_DOUBLE_PRECISION, isendPE,&
iloop+numprocs, MPI_COMM_WORLD, ierr)endif
B へ B_T をコピーする
endif
enddo
「不老」利用型MPI講習会

並列化のヒント（ほぼ回答，Fortran言語）
 ローカルな行列-行列積は、以下のようなコードになる。

imod = mod( (myid+iloop), NPROCS )jstart = ib* imod
do i=1, ib
do j=1, ib
do k=1, n
C( i , jstart + j ) = C( i , jstart + j ) + A( i , k ) * B( k , j )
enddo
enddo
enddo

286

「不老」利用型MPI講習会

おわり
お疲れさまでした

287「不老」利用型MPI講習会