(事前登録者のみです )
1. 本人証明ができるものを用意します
• 学生証、運転免許証、など
• いずれも無い場合は、学内サービス (UTokyo- Wifi など)にログインできることで証明する
2. 名前が呼ばれます
3. 本人確認の上、アカウントが記載され た紙を配布します
4. 授業で指示があるまで、ログイン作業
を行わないでください
スーパーコンピュータを利 用しよう
東京大学情報基盤センター准教授 塙 敏博
2019年10月8日(火)10:25-12:10
講義の流れ
1. ログイン作業
2. スパコン利用の仕方
• 単純な並列プログラムの実行
3. 総和演算
4. 演習課題(講義中に行う課題)
5. レポート課題
講義日程(工学部共通科目 )
1. 9
月
24日: ガイダンス
2. 10
月
1日
l 並列数値処理の基本演算(座学)
3. 10月8日:スパコン利用開始
l ログイン作業、テストプログラム実行
4. 10
月
15日
l 高性能プログラミング技法の基礎1
(階層メモリ、ループアンローリン グ)
5. 10
月
29日
l 高性能プログラミング技法の基礎2
(キャッシュブロック化)
6. 11
月
5日
l 行列-ベクトル積の並列化
7. 11
月
12日
l べき乗法の並列化
8. 11
月
26日
l 行列-行列積の並列化(1)
9. 12
月
3日
l 行列-行列積の並列化(2)
10. 12
月
10日
l LU分解法(1)
l コンテスト課題発表
11. 12
月
17日
l LU分解法(2)
12. 1
月
7日
l LU分解法(3)、非同期通信
13. 1
月
14日
l RB-Hお試し、研究紹介他
2020年2月3日(月)24時 厳守
ログイン作業
はじめてのスパコンログイン
ユーザ名の確認
• 工学部共通科目(スパコンプログラミング1、Ⅰ)
ユーザ名(利用者番号): t 34 xxx
(xxxは 3 桁番号)
グループ名(課金プロジェクト名): gt34
講義時間中のジョブキュー名: lecture4-flat
鍵の作成
すでに作成済みの人は改めて作る必要はありません。
1. ターミナルを起動する
2. 以下を入力する
$ ssh-keygen -t rsa
3. 鍵の収納先を聞かれるので、リターンを押す
4. 鍵を使うためのパスワードを聞かれるので、
センターのパスワードではない、自分の好きな パスワードを入れる(パスフレーズとよぶ)
5. もう一度、上記のパスフレーズを入れる
6. 鍵が生成される
鍵の利用 (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
<公開鍵が表示される>
6. “ssh-rsa …” で始まる部分を、マウス でドラッグしてコピーし、公開鍵の
登録に使う 。
(“.u-tokyo.ac.jp” まで )
鍵の登録( 1/2 )
1. ブラウザを立ち上げる
2. 以下のアドレスを入力する
https://ofp-www.jcahpc.jp/
3. ( “English/Japanese” メニューで言語を変 更)
4. 「ユーザ名」にセンターから配布された、
“利用者番号”をいれる。
5. 「パスワード」に、センターから配布された
“パスワード”を入力する。
ポータル画面(ログイン前)
センターから配られた
利用者番号 と パスワード
を入力する
パスワード変更
•
最初のログイン時にパスワード変更を求められるので、新しい
パスワードを入力してください。
鍵の登録
1.
左側メニューの「 SSH 公開鍵登録」を クリックする
2.
登録方式で「直接入力」をクリックする
3.
コピーしてあった公開鍵をペーストする
4.
「登録」ボタンを押す
ポータル画面
ここをクリック
ポータル画面(公開鍵登録)
ペースト後 クリック 公開鍵をペースト
cat ~/.ssh/id_rsa.pub
ポータル画面(公開鍵登録:別のやり方)
指定後クリック
~/.ssh/id_rsa.pub
“RSA” である
ことを確認
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/t34xxx
• cd
コマンドで移動できます。
•
Work ディレクトリ : /work/gt34/t34xxx
スパコンへのログイン・
テストプログラム起動
東京大学 情報基盤センター 准教授 塙 敏博
講義の流れ
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/gt34/z30105
(1/2)
1.
cd コマンドを実行して Lustre ファイルシステムに移動する
$ cd /work/gt34/t34XXX ( 下線部は自分の ID に変えること )
2.
/work/gt34/z30105 にある Samples-ofp.tar.gz を 自分のディレクトリにコピーする
$ cp /work/gt34/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 gt34 –L rg=interactive- {flat,cache},elapse=01:00
• 16
ノード実行用
• $ pjsub --interact –g gt34 –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
本講義でのキュー名
• 本演習中のキュー名:
• lecture4-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=lecture4-flat
#PJM -L node=16
#PJM --mpi proc=1088
#PJM -L elapse=0:01:00
#PJM -g gt34
mpiexec.hydra –n
${PJM_MPI_PROC} ./hello
JOB スクリプトサンプルの説明(ピュアMPI)
( hello-pure.bash, C 言語、 Fortran 言語共通)
リソースグループ名
: lecture-flat
利用グループ名
: gt34
MPI
ジョブを
68*16 = 1088プロセス で実行する。
利用ノード数、
MPI プロセス数 実行時間制限
:1分
44
•
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” → “lecture4-flat”
に変更してください
• gt00=>gt34
並列版 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以上は、論文を出版するに値する問題。
来週へつづく
単体性能チューニング
Windows 、 PuTTY の入手
• セキュリティ上問題が出ることも多いので、なるべく最 新版をお使いください。
• 以下をアクセスする
http://hp.vector.co.jp/authors/VA024651/PuTTYkj.
html
• putty-0.71-jp20190410.zip をダウンロードして、
zip ファイルを展開する。
鍵の設定
•
PuTTY の配布ファイルを展開すると、 puttygen.exe という実行ファイルがあるので、それをクリックする
•
右側にある、“ Generate ”ボタンをクリックする
•
バーが出る。バーが右端に行くまで待つ。
•
この間、空白エリアにマウスを移動させる。そうしないと、
いつまでたっても、鍵が生成されない。
•
“Key passphrase” に、ログインするとき(この鍵を使うとき)に 使うパスワードを入れる。
•
注意:センターから配られたパスワードではない。
センターから配られたパスワードを入れないこと。
•
“Save private key” をクリックし、適切な場所に鍵を
保存する。
現在の状況(以下の画面は消さないこと)
これが「公開鍵」。
OFPに登録する
これが、ログインする ときに使うパスワー ド。
センターから配られた パスワードを入れない こと!
これでセーブされるの が「秘密鍵」。
他人に見せては いけない。
Oakforest-PACS へのログイン
•
“セッション一覧”に、適当な名前( ofp )を入れ、
“保存”をクリック
•
下の、“開く”をクリック
•
“ login as: ”が出るので、センターの利用者番号 を入力
•
Authenticating with public key ”rsa-key-20080820“
Passphrase for key ”rsa-key-20080820“ のような
メッセージが出るので、自分で設定した鍵を利用するための パスワードを入力
(注:センターが配布したパスワードではない)
•
以上が正しければ、ログインができる
現在の手順
手順1
手順2 手順5
手順6:
ログインへ
ofp.jcahpc.jp
ofp
現在の手順
手順3
手順4
Oakforest-PACS へのログイン(以降)
• 以降、“セッション読込”にある、設定ファイル
(先ほどの例では、“ ofp ”)を指定して、
“読込”ボタンをクリックすると、
先ほどの設定が復元できる
• 同様に、“開く”をクリックすると、ログインできる
• 画面が小さいという人は、、、
•
“ウインドウ”ー“外観”をクリックし、
フォントの設定にある“変更”をクリックする
•
サイズから、適切なフォントサイズを指定する
•
設定ファイルに、この設定を保存する。
(保存を忘れると、次回にこの環境が復元できない。)
WinSCP のインストール
•
以下のサイトへ行く
http://winscp.net/eng/docs/lang:jp
•
適当なバージョンをダウンロード
•
インストーラで日本語を設定すると、日本語版が ダウンロードできる
•
アイコンをクリックする
•
ホスト名に、
ofp.jcahpc.jp•
ユーザ名に、センター発行の利用者番号
•
秘密鍵に、生成した秘密鍵ファイルを指定する
•
プロトコルを、“
SCP”にする
•
“ログイン”を押すと、ファイル転送モードになる
(必要な人のみ)
•
以下のアドレスから、 UTF-8 TeraTerm Pro with TTSSH2 を インストールしてください:
http://ttssh2.osdn.jp
1.
「ダウンロード」をクリック
2.
「 4.104 」の「 teraterm-4.104.exe 」をクリック
3.
ブラウザに「セキュリティ保護のため … 」が出る場合、
クリックしてブロックを解除
4.
「このファイルを実行または保存しますか?」
が出るので、「実行」をクリック
5.