(事前登録者のみです ) 手順
1.
g.ecc.u-tokyo.ac.jp のアカウントで Zoom にログインして ください。念のため学生証を用意してください。
2.
( 教員 ) Zoom のチャットで出席のワンタイムパスワードを 教えます。
3.
LMS の出席管理に入力してください。
4.
( 教員 ) LMS で出席を確認します。
5.
( 教員 ) 出席者に対し、アカウント情報を LMS にアップロー ドします。
6.
LMS 上のアンケートで、コメント欄に利用者番号とパス ワードが表示されているのを確認してください。
•
授業で指示があるまで、ログイン作業を行わないでください
スーパーコンピュータを利 用しよう
東京大学情報基盤センター准教授 塙 敏博
2020年10月13日(火)10:25-12:10
講義の流れ
1. ログイン作業
2. スパコン利用の仕方
• 単純な並列プログラムの実行
3. 総和演算
4. 演習課題(講義中に行う課題)
5. レポート課題
講義日程(工学部共通科目 )
1. 9月29日(今日): ガイダンス
2. 10月6日
l 並列数値処理の基本演算(座学)
3. 10月13日:スパコン利用開始
l ログイン作業、テストプログラム実行
4. 10月20日
l 高性能プログラミング技法の基礎1
(階層メモリ、ループアンローリン グ)
5. 10月27日
l 高性能プログラミング技法の基礎2
(キャッシュブロック化)
6. 11月10日
l 行列-ベクトル積の並列化
7. 11月17日
l べき乗法の並列化
8. 11月24日
l 行列-行列積の並列化(1)
9. 12月1日
l 行列-行列積の並列化(2)
10. 12月8日
l LU分解法(1)
l コンテスト課題発表
11. 12月15日
l LU分解法(2) 、非同期通信
12. 12月22日
l RB-Hログイン、GPUプログラミン グ(1)
13. 1月5日
l GPUプログラミング(2) 、研究紹 介他
2021年2月1日(月)24時 厳守
ログイン作業
はじめてのスパコンログイン
ユーザ名の確認
• 工学部共通科目(スパコンプログラミング1、Ⅰ)
ユーザ名(利用者番号): t58 xxx
(xxxは 3 桁番号)
グループ名(課金プロジェクト名): gt58
講義時間中のジョブキュー名: lecture8-flat
Secure Shell (SSH)
•
暗号化や認証の技術により、遠隔のシステムとの間で安全に 通信をするためのプロトコル、コマンド群
•
公開鍵暗号方式でユーザ・ホストの認証、共通鍵暗号方式で 通信路を暗号化
•
リモート端末: ssh
•
ファイルコピー : scp
•
ファイル転送 : sftp
鍵の作成 → もう済んでいるはず
もしまだだったら
以下を参照しながら作業すること
https://www.cspp.cc.u-tokyo.ac.jp/hanawa/class/prepare.pdf
• もし困ったことが起きたら,「手を挙げる」か,チャット
に書き込んでください。ブレークアウト(分科会)にて
対応します。
鍵の利用 (1/2)
1. 生成した鍵は、以下に入っている
2. 以下を入力する
3. 以下を入力すると、ファイルが見える
4. ここで、以下のファイルを区別する .ssh/
$ cd .ssh/
$ ls
id_rsa id_rsa.pub known_hosts
id_rsa :秘密鍵(決して外には出さないこと)
id_rsa.pub :公開鍵
鍵の利用(2 / 2)
5. 以下を入力して、公開鍵を表示する
$ cat id_rsa.pub
<公開鍵が表示される>
userX@host:~.ssh $ cat id_rsa.pub
ssh-rsa AAAA… … … … … … … (中略、英数字がしばらく続く)
… … … …nmsbl6jA2N userX@host
(ランダムな文字列の後、空白、ユーザ名@ホスト名で終わる)
鍵の利用(2 / 2)
6. “ssh-rsa …” で始まる部分を、マウス でドラッグしてコピーしておき、
後の公開鍵の登録に使う 。
(“ userX@host ” まで )
鍵の登録( 1/2 )
1. ブラウザを立ち上げる
2. 以下のアドレスを入力する
https://ofp-www.jcahpc.jp/
3. ( “English/Japanese” メニューで言語を変 更)
4. 「ユーザ名」に、配布された
“利用者番号”をいれる。
5. 「パスワード」に、配布された
“パスワード”を入力する。
渡される情報(例)
利用者番号:t58000 パスワード: $abc1ABC
ポータル画面(ログイン前)
配られた
利用者番号 と パスワード
を入力する
パスワード変更
•
最初のログイン時にパスワード変更を求められるので、新しい パスワードを入力してください。
パスワード規約に従わないと 受け付けられないので注意!!
鍵の登録
1.
左側メニューの「 SSH 公開鍵登録」を クリックする
2.
登録方式で「直接入力」をクリックする
3.
コピーしてあった公開鍵をペーストする
4.
「登録」ボタンを押す
ポータル画面
ここをクリック
ポータル画面(公開鍵登録)
ペースト後 クリック 公開鍵をペースト
cat ~/.ssh/id_rsa.pub
ポータル画面(公開鍵登録)
ここを確認 !!
Oakforest-PACS へログイン
• ターミナルから、以下を入力する
$ ssh ofp.jcahpc.jp -l txxxxx
「 -l 」はハイフンと小文字のL、
「 txxxxx 」は利用者番号
• 接続するかと尋ねられるので、 yes を入力する
• 鍵の設定時に入れた
自分が決めたパスワード(パスフレーズ)
を入力する
• 成功すると、ログインができる
Oakforest-PACS のデータを PC に取り込む
• ターミナルで scp コマンドを使う
•
$ scp [email protected]:~/a.f90 ./
「 txxxxx 」は利用者番号
•
OFP 上のホームディレクトリにある a.f90 を PC のカレント ディレクトリに取ってくる
•
ディレクトリごと取ってくる場合は -r を指定する
•
$ scp -r [email protected]:~/SAMP ./
•
OFP 上のホームディレクトリにある SAMP フォルダを、その
中身ごと、 PC のカレントディレクトリに取ってくる
PC のファイルを Oakforest-PACS に置く
• 同様にターミナルで scp コマンドを使う
•
$ scp ./a.f90 [email protected]:
「 txxxxx 」は利用者番号
•
PC のカレントディレクトリにある a.f90 を、 OFP 上のホーム ディレクトリに置く
•
ディレクトリごと置くには、 -r を指定する
•
$ scp -r ./SAMP [email protected]:
•
PC のカレントディレクトリにある SAMP フォルダを、
その中身ごと、 OFP 上のホームディレクトリに置く
Emacs の Tramp 機能
(必要な人のみ)
•
Emacs が自分のパソコンに入っている人は、
Tramp 機能により、遠隔のファイルが操作できます
•
Oakforest-PACS の秘密鍵を、 SSH に登録します
•
emacs を立ち上げます
•
ファイル検索モードにします
^x ^f (^は control )
• “Find file: ” の現在のパス名部分を消し、以下を 入れます
Find file:/ssh:[email protected]:
• パスフレーズを入れると、ローカルファイルのように
Oakforest-PACS 上のファイルが編集できます。
異なる PC の公開鍵登録
• OFP 上の ~/.ssh/authorized_keys に公開鍵を追加 します。
• 操作を誤ると、それまで使えていた SSH ログインがで きなくなるので注意!!
•
ポータルから公開鍵を再アップロードすれば直ります。
Oakforest-PACS における注意
•
/home ファイルシステムは容量が小さく、ログインに必要な
ファイルだけを置くための場所です。
• /home に置いたファイルは計算ノードから参照できません。ジョブの実
行もできません。
•
転送が終わったら、 /work ファイルシステムに移動 (mv) してくだ さい。
•
または、直接 /work ファイルシステムを指定して転送してくださ い。
•
ホームディレクトリ : /home/t58xxx
• cd コマンドで移動できます。
•
Work ディレクトリ : /work/gt58/t58xxx
スパコンへのログイン・
テストプログラム起動
東京大学 情報基盤センター 准教授 塙 敏博
講義の流れ
1. スパコン利用の仕方
• 単純な並列プログラムの実行
2. 総和演算
テストプログラム起動
UNIX備忘録
• emacs の起動: emacs 編集ファイル名
•
^x ^s (^は control ) :テキストの保存
•
^x ^c : 終了
( ^z で終了すると、スパコンの負荷が上がる。絶対にしないこと。)
•
^g : 訳がわからなくなったとき。
•
^k : カーソルより行末まで消す。
消した行は、一時的に記憶される。
•
^y : ^k で消した行を、現在のカーソルの場所にコピーする。
•
^s 文字列 : 文字列の箇所まで移動する。
•
^M x goto-line : 指定した行まで移動する。
UNIX備忘録
• rm ファイル名: ファイル名のファイルを消す。
• rm *~ : test.c~ などの、~がついたバックアップファイルを消す。使う時は 慎重に。*~ の間に空白が入ってしまうと、全てが消えます。
• ls : 現在いるフォルダの中身を見る。
• cd フォルダ名: フォルダに移動する。
•
cd .. : 一つ上のフォルダに移動。
•
cd ~ :ホームディレクトリに行く。訳がわからなくなったとき。
• cat ファイル名: ファイル名の中身を見る
• make : 実行ファイルを作る
( Makefile があるところでしか実行できない)
•
make clean : 実行ファイルを消す。
( clean が Makefile で定義されていないと実行できない)
UNIX備忘録その 2
• less ファイル名: ファイル名の中身を見る (cat では 画面がいっぱいになってしまうとき)
• スペースキー : 1画面スクロール
• / : 文字列の箇所まで移動する。
• q : 終了 (訳がわからなくなったとき)
サンプルプログラムの実行
初めての並列プログラムの実行
サンプルプログラム名
• C言語版・Fortran 90 版共通ファイル:
Samples-ofp.tar.gz
• tar で展開後、C言語とFortran 90 言語の ディレクトリが作られる
• C/ : C 言語用
• F/ : Fortran90 言語用
• 上記のファイルが置いてある場所
/work/gt58/z30105
(1/2)
1.
cd コマンドを実行して Lustre ファイルシステムに移動する
$ cd /work/gt58/t58XXX ( 下線部は自分の ID に変えること )
2.
/work/gt58/z30105 にある Samples-ofp.tar.gz を 自分のディレクトリにコピーする
$ cp /work/gt58/z30105/Samples-ofp.tar.gz ./
3.
Samples-ofp.tar を展開する
$ tar xvfz Samples-ofp.tar.gz
4.
Samples ディレクトリに入る
$ cd Samples
5.
C 言語 : $ cd C Fortran90 言語 : $ cd F
6.
Hello ディレクトリに入る
$ cd Hello
並列版 Hello プログラムをコンパイルしよう (2/2)
6. ピュア MPI 用の Makefile (Makefile_pure) を 使って make する
$ make -f Makefile_pure
7. 実行ファイル (hello) ができていることを確認 する
$ ls
テムでのジョブ実行形態
•
以下の2通りがあります
•
インタラクティブジョブ実行
• PCでの実行のように、コマンドを入力して実行する方法
• スパコン環境では、あまり一般的でない
• デバック用、大規模実行はできない
• OFPでは、以下に限定
• 1ノード(68コア):2時間まで
• 16ノード(1,088コア):10分まで
•
バッチジョブ実行
• バッチジョブシステムに処理を依頼して実行する方法
• 実行させたい処理をファイル(ジョブスクリプト)で指示する
• スパコン環境で一般的
• 大規模実行用
• OFPでは、最大2048ノード(139,264コア)(24時間)
※講義アカウントでは バッチジョブ実行のみ、
最大 16 ノード 15 分まで
Oakforest-PACS スーパーコンピュータシス テムでのジョブ実行形態 (2)
• 2 つの異なるメモリモードを用意
•
Flat モード
• MCDRAMとDDR4メモリを個別にアクセス可能
•
Cache モード
• MCDRAMはDDR4メモリのキャッシュとして働く
• 各ジョブキューには、 -flat, -cache をそれぞれ用意
• 講義アカウントでは、Flatモードだけが使えます。
( 本講義では使えません)
•
コマンドラインで以下を入力
• 1ノード実行用
• $ pjsub --interact –g グループ名 –L rg=interactive- {flat,cache},elapse=01:00
• 16ノード実行用
• $ pjsub --interact –g グループ名 –L rg=interactive- {flat,cache},node=16,elapse=01:00
※インタラクティブ用のノードがすべて使われている場合、
資源が空くまで、ログインできません。
※講習会アカウントでは使えません。
※コマンドは改行せず1行で入力すること
コンパイラの種類とインタラクティブ実行お よびバッチ実行
•
OFP では、コンパイラはバッチ実行、インタラクティブ実行で共 通に使えます。
•
例) Intel コンパイラ
• Cコンパイラ: icc, mpiicc (Intel MPIを使う場合)
• Fortran90コンパイラ: ifort, mpiifort (Intel MPIを使う場合)
• KNL向け最適化: -xMIC-AVX512
• ログインノードやプレポスト用ノードで実行する可能性もある場合:
-axMIC-AVX512
バッチ処理とは
•
スパコン環境では、通常は、インタラクティブ実行(コマンドライ ンで実行すること)はできません。
•
ジョブはバッチ処理で実行します。
• キュー: 待ち行列
ユーザ スパコン
バッチ処理 システムが
ジョブを取り出す
実行
バッチキュー
ジョブの依頼
バッチキューの設定のしかた
• OFP でのバッチ処理は、富士通のバッチシステムで 管理されています。
• 以下、主要コマンドを説明します。
•
ジョブの投入: pjsub < ジョブスクリプトファイル名 >
•
自分が投入したジョブの状況確認: pjstat
•
投入ジョブの削除: pjdel < ジョブ ID>
•
バッチキューの状態を見る: pjstat --rsc
•
バッチキューの詳細構成を見る: pjstat --rsc -x
•
投げられているジョブ数を見る: pjstat -b
•
過去の投入履歴を見る: pjstat -H
•
同時に投入できる数/実行できる数を見る: pjstat --limit
本講義でのキュー名
• 本演習中のキュー名:
• lecture8-flat
•
最大 15 分まで
•
最大ノード数は 16 ノード (1088 コア ) まで
• 本演習時間以外( 24 時間)のキュー名:
• lecture-flat
•
利用条件は演習中のキュー名と同様
pjstat --rsc の実行画面例
$ pjstat --rsc
RSCGRP STATUS NODE regular-cache
|---- small-cache [ENABLE,START] 3846
`---- medium-cache [ENABLE,START] 3846 regular-flat
|---- small-flat [ENABLE,START] 3846
`---- medium-flat [ENABLE,START] 3846 interactive-cache
|---- interactive_n1-cache [ENABLE,START] 100
`---- interactive_n16-cache [ENABLE,START] 100 interactive-flat
|---- interactive_n1-flat [ENABLE,START] 100
`---- interactive_n16-flat [ENABLE,START] 100 debug-cache [ENABLE,START] 234
debug-flat [ENABLE,START] 234
prepost [ENABLE,START] 12
使える キュー名 ( リソース
グループ ) 現在
使えるか
ノードの
利用可能数
pjstat --rsc -x の実行画面例
$ pjstat --rsc -x
RSCGRP STATUS MIN_NODE MAX_NODE MAX_ELAPSE REMAIN_ELAPSE MEM(GB) PROJECT regular-cache
|---- small-cache [ENABLE,START] 1 128 48:00:00 48:00:00 82 pz0105
`---- medium-cache [ENABLE,START] 129 512 48:00:00 48:00:00 82 pz0105 regular-flat
|---- small-flat [ENABLE,START] 1 128 48:00:00 48:00:00 96 pz0105
`---- medium-flat [ENABLE,START] 129 512 48:00:00 48:00:00 96 pz0105 interactive-cache
|---- interactive_n1-cache [ENABLE,START] 1 1 02:00:00 02:00:00 82 pz0105
`---- interactive_n16-cache [ENABLE,START] 2 16 00:10:00 00:10:00 82 pz0105 interactive-flat
|---- interactive_n1-flat [ENABLE,START] 1 1 02:00:00 02:00:00 96 pz0105
`---- interactive_n16-flat [ENABLE,START] 2 16 00:10:00 00:10:00 96 pz0105 debug-cache [ENABLE,START] 1 128 00:30:00 00:30:00 82 pz0105 debug-flat [ENABLE,START] 1 128 00:30:00 00:30:00 96 pz0105 prepost [ENABLE,START] 1 1 06:00:00 06:00:00 222 pz0105
使える キュー名 ( リソース グループ )
現在
使えるか ノードの 実行情報
課金情報(財布)
実習では1つのみ
pjstat --rsc -b の実行画面例
$ pjstat --rsc –b
RSCGRP STATUS TOTAL RUNNING QUEUED HOLD OTHER NODE regular-cache
|---- small-cache [ENABLE,START] 45 40 5 0 0 3846
`---- medium-cache [ENABLE,START] 1 1 0 0 0 3846 regular-flat
|---- small-flat [ENABLE,START] 150 120 30 0 0 3846
`---- medium-flat [ENABLE,START] 7 3 4 0 0 3846 interactive-cache
|---- interactive_n1-cache [ENABLE,START] 0 0 0 0 0 100
`---- interactive_n16-cache [ENABLE,START] 0 0 0 0 0 100 interactive-flat
|---- interactive_n1-flat [ENABLE,START] 1 1 0 0 0 100
`---- interactive_n16-flat [ENABLE,START] 0 0 0 0 0 100 debug-cache [ENABLE,START] 7 4 3 0 0 234 debug-flat [ENABLE,START] 0 0 0 0 0 234 prepost [ENABLE,START] 0 0 0 0 0 12
使える キュー名 ( リソース グループ )
現在 使え るか
ジョブ の総数
実行して いるジョブ の数
待たされて いるジョブ の数
ノードの
利用可能
数
#!/bin/bash
#PJM -L rscgrp=lecture8-flat
#PJM -L node=16
#PJM --mpi proc=1088
#PJM -L elapse=0:01:00
#PJM -g gt58
mpiexec.hydra –n
${PJM_MPI_PROC} ./hello
JOB スクリプトサンプルの説明(ピュアMPI)
( hello-pure.bash, C 言語、 Fortran 言語共通)
リソースグループ名
: lecture8-flat
利用グループ名
: gt58
MPIジョブを68*16 = 1088 プロセス で実行する。
利用ノード数、
MPI プロセス数 実行時間制限
:1分
46
•
Intel Xeon Phi (Knights Landing)
•
Knights Landing Overview
1ノード1ソケット, 68コアChip: 36 Tiles interconnected by 2D Mesh Tile: 2 Cores + 2 VPU/core + 1 MB L2
Memory: MCDRAM: 16 GB on-package; High BW DDR4: 6 channels @ 2400 up to 384GB IO: 36 lanes PCIe Gen3. 4 lanes of DMI for chipset Node: 1-Socket only
Fabric: Omni-Path on-package (not shown)
Vector Peak Perf: 3+TF DP and 6+TF SP Flops Scalar Perf: ~3x over Knights Corner
Streams Triad (GB/s): MCDRAM : 400+; DDR: 90+
TILE
4
2 VPU Core
2 VPU Core 1MB L2
CHA
Package
Source Intel: All products, computer systems, dates and figures specified are preliminary based on current expectations, and are subject to change without notice. KNL data are preliminary based on current expectations and are subject to change without notice. 1Binary Compatible with Intel Xeon processors using Haswell Instruction Set (except TSX). 2Bandwidth numbers are based on STREAM-like memory access pattern when MCDRAM used as flat memory. Results have been estimated based on internal Intel analysis and are provided for informational purposes only. Any difference in system hardware or software design or configuration may affect actual performance.
Omni-path not shown
EDC EDC
PCIe Gen 3
EDC EDC
Tile
DDR MC DDR MC
EDC EDC misc EDC EDC
36 Tiles connected by
2D Mesh Interconnect
MCDRAM MCDRAM MCDRAM MCDRAM
3 D D R 4 C H A N N E L S
3 D D R 4 C H A N N E L S
MCDRAM MCDRAM MCDRAM MCDRAM
D M
I 2 x16
1 x4
X4 DMI
HotChips27 KNLスライド
より
compatible with main line IA. Boots standard OS.
Significant improvement in scalar and vector performance Integration of Memory on package: innovative memory architecture for high bandwidth and high capacity Integration of Fabric on package
Potential future options subject to change without notice.
All timeframes, features, products and dates are preliminary forecasts and subject to change without further notification.
Three products
KNL Self-Boot KNL Self-Boot w/ Fabric KNL Card (Baseline) (Fabric Integrated) (PCIe-Card)
2 VPU 2 VPU
Core 1MB Core L2
MCDRAM: 490GB/秒 以上 (実測)
DDR4: 115.2 GB/秒
=(8Byte×2400MHz× 6 channel)
ピュアMPIの実行状況(ノード内)
MPIプロセス 無効のタイル(例)
MCDRAM: オンパッケージ の高バンド幅メモリ16GB + DDR4メモリ 16GBx6
= 16 + 96 GB
KNL の動作モード
•
メモリモード: 3 種類
• Flat: MCDRAMとDDR4 が独立したアドレス
• Cache: MCDRAMはDDR4メモリのキャッシュとして動作
• Hybrid
•
クラスタリングモード : 5 種類
• (All-to-all: アドレス情報が全体に分散… 非推奨)
• Quadrant, Hemisphere: 内部でアドレス情報が4(または2)に分割(ユー ザからは見えない)
• SNC-4, SNC-2: NUMAドメインが明示的に4 (or 2)に分割
モードの変更には再起動が必要
=> 現時点では、各モード (Flat, Cache) のジョブ
キューを用意 (regular-flat / regular-cache 等 )
メモリモード
• Cache モード
•
MCDRAM は L3 キャッ シュとして動作
• Flat モード
•
MCDRAM を明示的に使 い分け
DDR4 96 GB MCDRAM
16 GB
MCDRAM 16 GB
DDR4 96 GB
物理 アドレス
(ピュア MPI )
• このサンプルの JOB スクリプトは
hello-pure.bash
です。
• 配布のサンプルでは、キュー名が ” lecture-flat” になっています
• $ emacs hello-pure.bash
で、 “lecture-flat” → “lecture8-flat”
に変更してください
• gt00=>gt58
並列版 Hello プログラムを実行しよう
(ピュア MPI )
1. Hello フォルダ中で以下を実行する
$ pjsub hello-pure.bash
2. 自分の導入されたジョブを確認する
$ pjstat
3. 実行が終了すると、以下のファイルが生成される hello-pure.bash.e XXXXXX
hello-pure.bash.o XXXXXX ( XXXXXX は数字)
4. 上記の標準出力ファイルの中身を見てみる
$ cat hello-pure.bash.o XXXXXX
5. “ Hello parallel world! ”が、
68 プロセス *16 ノード =1088 表示されていたら成功。
標準エラー出力
•
バッチジョブの実行が終了すると、標準出力ファイルと標準エ ラー出力ファイルが、ジョブ投入時のディレクトリに作成されま す。
•
標準出力ファイルにはジョブ実行中の標準出力、標準エラー 出力ファイルにはジョブ実行中のエラーメッセージが出力され ます。
ジョブ名 .oXXXXX --- 標準出力ファイル
ジョブ名 .eXXXXX --- 標準エラー出力ファイル
(XXXXX はジョブ投入時に表示されるジョブのジョブ ID)
並列版 Hello プログラムの説明( C 言語)
#include <stdio.h>
#include <mpi.h>
int main(int argc, char* argv[]) { int myid, numprocs;
int ierr, rc;
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);
}
MPI の初期化
自分の ID 番号を取得
:各PEで値は異なる
全体のプロセッサ台数 を取得
:各PEで値は同じ
(演習環境では 1088 、もしくは 16 ) MPI の終了
このプログラムは、全PEで起動される
並列版 Hello プログラムの説明( Fortran90 言語)
program main use mpi
implicit none
integer :: myid, numprocs integer :: ierr
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 program main
MPI の初期化
自分の ID 番号を取得
:各PEで値は異なる
全体のプロセッサ台数 を取得
:各PEで値は同じ
(演習環境では
1088 、もしくは 16 ) MPI の終了
このプログラムは、全PEで起動される
時間計測方法( C 言語)
double t0, t1, t2, t_w;
..
ierr = MPI_Barrier(MPI_COMM_WORLD);
t1 = MPI_Wtime();
<ここに測定したいプログラムを書く>
t2 = MPI_Wtime();
t0 = t2 - t1;
ierr = MPI_Reduce(&t0, &t_w, 1, MPI_DOUBLE,MPI_MAX, 0, MPI_COMM_WORLD);
バリア同期後
時間を習得し保存
各プロセッサーで、t 0 の値は 異なる。
この場合は、最も遅いものの
値をプロセッサ0番が受け取る
時間計測方法( Fortran90 言語)
double precision t0, t1, t2, t_w double precision MPI_WTIME ..
call MPI_BARRIER(MPI_COMM_WORLD, ierr) t1 = MPI_WTIME(ierr)
<ここに測定したいプログラムを書く>
t2 = MPI_WTIME(ierr) t0 = t2 - t1
call MPI_REDUCE(t0, t_w, 1, &
& MPI_DOUBLE_PRECISION, &
& MPI_MAX, 0, MPI_COMM_WORLD, ierr)
バリア同期後
時間を習得し保存
各プロセッサーで、t 0 の値 は異なる。
この場合は、最も遅いも
のの値をプロセッサ0番
が受け取る
サンプルプログラムの説明
• Hello/
• 並列版Helloプログラム
• hello-pure.bash, hello-hy68.bash : ジョブスクリプトファイル
• Cpi/
• 円周率計算プログラム
• cpi-pure.bash ジョブスクリプトファイル
• Wa1/
• 逐次転送方式による総和演算
• wa1-pure.bash ジョブスクリプトファイル
• Wa2/
• 二分木通信方式による総和演算
• wa2-pure.bash ジョブスクリプトファイル
• Cpi_m/
• 円周率計算プログラムに時間計測ルーチンを追加したもの
• cpi_m-pure.bash ジョブスクリプトファイル
MPI 実行時のリダイレクトについて
• Oakforest-PACS スーパーコンピュータシステムでは、
MPI 実行時の入出力のリダイレクトができます。
• 例) mpiexec.hydra -n
${PJM_MPI_PROC} ./a.out < in.txt > out.txt
• < 参考 > システムによっては、 mpirun のオプ
ションを使う必要があります。
実習課題
演習課題
1.
逐次転送方式のプログラムを実行
• Wa1 のプログラム
2.
二分木通信方式のプログラムを実行
• Wa2のプログラム
3.
時間計測プログラムを実行
• Cpi_mのプログラム
4.
プロセス数を変化させて、サンプルプログラムを実行
5.
Hello プログラムを、以下のように改良
• MPI_Sendを用いて、プロセス0からChar型のデータ
“Hello World!!”を、その他のプロセスに送信する
• その他のプロセスでは、MPI_Recvで受信して表示する
総和演算プログラム(逐次転送方式)
• 各プロセスが所有するデータを、全プロセスで加算し、
あるプロセス1つが結果を所有する演算を考える。
•
素朴な方法(逐次転送方式)
1. (0番でなければ)左隣のプロセスからデータを受信する;
2. 左隣のプロセスからデータが来ていたら;
1. 受信する;
2. <自分のデータ>と<受信データ>を加算する;
3. (1023番でなければ)右隣のプロセスに<2の加算した結果を>送信す る;
4. 処理を終了する;
•
実装上の注意
• 左隣りとは、(myid-1)のIDをもつプロセス
• 右隣りとは、(myid+1)のIDをもつプロセス
• myid=0のプロセスは、左隣りはないので、受信しない
• myid=p-1のプロセスは、右隣りはないので、送信しない
による加算
CPU0 CPU1 CPU2 CPU3
0 1 2 3
0
所有データ
0 + 1 = 1
1
1 + 2 = 3
3
3 + 3 = 6
送信 送信 送信
最終結果
所有データ 所有データ 所有データ
1対1通信利用例
(逐次転送方式、 C 言語)
void main(int argc, char* argv[]) { MPI_Status istatus;
….
dsendbuf = myid;
drecvbuf = 0.0;
if (myid != 0) {
ierr = MPI_Recv(&drecvbuf, 1, MPI_DOUBLE, myid-1, 0, MPI_COMM_WORLD, &istatus);
}
dsendbuf = dsendbuf + drecvbuf;
if (myid != nprocs-1) {
ierr = MPI_Send(&dsendbuf, 1, MPI_DOUBLE, myid+1, 0, MPI_COMM_WORLD);
}
if (myid == nprocs-1) printf ("Total = %4.2lf ¥n", dsendbuf);
….
}
受信用システム配列の確保
自分より一つ少ない ID番号(myid-1)から、
double型データ1つを 受信しdrecvbuf変数に 代入
自分より一つ多い ID番号(myid+1)に、
dsendbuf変数に入っ ているdouble型データ 1つを送信
(逐次転送方式、 Fortran 言語)
program main
….
integer :: istatus(MPI_STATUS_SIZE)
….
dsendbuf = myid drecvbuf = 0.0
if (myid .ne. 0) then
call MPI_RECV(drecvbuf, 1, MPI_REAL8, &
myid-1, 0, MPI_COMM_WORLD, istatus, ierr) endif
dsendbuf = dsendbuf + drecvbuf if (myid .ne. numprocs-1) then
call MPI_SEND(dsendbuf, 1, MPI_REAL8, &
myid+1, 0, MPI_COMM_WORLD, ierr) endif
if (myid .eq. numprocs-1) then print *, "Total = ", dsendbuf endif
….
stop
end program main
受信用システム配列の確保
自分より一つ少ない ID番号(myid-1)から、
double型データ1つを 受信しdrecvbuf変数に 代入
自分より一つ多い ID番号(myid+1)に、
dsendbuf変数に 入っているdouble型 データ1つを送信
総和演算プログラム(二分木通信方式)
•
二分木通信方式
1. k = 1;
2. for (i=0; i < log2(nprocs); i++)
3. if ( (myid & k) == k)
• (myid – k)番プロセスからデータを受信;
• 自分のデータと、受信データを加算する;
• k = k * 2;
4. else
• (myid + k)番プロセスに、データを転送する;
• 処理を終了する;
総和演算プログラム(二分木通信方式)
0 1 2 3 4 5 6 7
1段目
1 3 5 7
2段目
3 7
3段目=log2(8)段目
0 1 2 3 4 5 6 7
1 3 5 7
3 7
7
総和演算プログラム(二分木通信方式)
•
実装上の工夫
• 要点: プロセス番号の2進数表記の情報を利用する
• 第i段において、受信するプロセスの条件は、以下で書ける:
myid & k が k と一致
• ここで、k = 2^(i-1) 。
• つまり、プロセス番号の2進数表記で右からi番目のビットが立っている プロセスが、送信することにする
• また、送信元のプロセス番号は、以下で書ける:
myid + k
• つまり 、通信が成立するプロセス番号の間隔は2^(i-1)←二分木なので
• 送信プロセスについては、上記の逆が成り立つ。
総和演算プログラム(二分木通信方式)
•
逐次転送方式の通信回数
• 明らかに、nprocs-1 回
•
二分木通信方式の通信回数
• 見積もりの前提
• 各段で行われる通信は、完全に並列で行われる
(通信の衝突は発生しない)
• 段数の分の通信回数となる
• つまり、log2(nprocs) 回
•
両者の通信回数の比較
• プロセッサ台数が増すと、通信回数の差(=実行時間)が とても大きくなる
• 1024プロセス構成では、1023回 対 10回!
• でも、必ずしも二分木通信方式がよいとは限らない(通信衝突の多発)
性能プロファイラ
•
Oakforest-PACS
• Intel VTune Amplifier
• PAPI (Performance API)
• Oakforest-PACS PAライブラリ
•
Web ポータルから「 ドキュメント閲覧 」 ⇨ Oakforest-PACS システム利用手引書 7.1. パフォーマンス分析ツール
または
Oakforest-PACS PA ライブラリ利用ガイド
を参照してください。
レポート課題
7.
[L05] MPI とは何か説明せよ。
8.
[L10] 逐次転送方式、2分木通信方式の実行時間を計測し、ど
の方式が何台のプロセッサ台数で有効となるかを明らかにせよ。
また、その理由について、考察せよ。
9.
[L15] 二分木通信方式について、プロセッサ台数が2のべき乗
でないときにも動作するように、プログラムを改良せよ。
問題のレベルに関する記述:
•L00: きわめて簡単な問題。
•L10: ちょっと考えればわかる問題。
•L20: 標準的な問題。
•L30: 数時間程度必要とする問題。
•L40: 数週間程度必要とする問題。複雑な実装を必要とする。
•L50: 数か月程度必要とする問題。未解決問題を含む。
※L40以上は、論文を出版するに値する問題。