内容に関するご質問はida＠cc.u-tokyo.ac.jp
まで、お願いします。

[Oakforest-PACS(OFP)編]
第95回 お試しアカウント付き
並列プログラミング講習会「ライブラリ利用：科学技術計算の効率化入門」

スパコンへのログイン・テストプログラム起動
東京大学情報基盤センター 特任准教授 伊田 明弘

1

講習会：ライブラリ利用 [OFP]スパコンへのログイン・
ファイル転送・基本コマンド

2

講習会：ライブラリ利用 [OFP]Oakforest-PACSへログイン ターミナルから、以下を入力する$ ssh ofp.jcahpc.jp -l txxxxx「-l」はハイフンと小文字のＬ、「txxxxx」は利用者番号
 接続するかと尋ねられるので、 yes を入力する
 鍵の設定時に入れた自分が決めたパスワード（パスフレーズ）を入力する
 成功すると、ログインができる

3

Oakforest-PACS利用の手引き

Oakforest-PACSのデータをPCに取り込む
 ターミナルでscpコマンドを使う$ scp txxxxx@ofp.jcahpc.jp:~/a.f90 ./

「txxxxx」は利用者番号
OFP上のホームディレクトリにある a.f90 をPCのカレントディレクトリに取ってくる ディレクトリごと取ってくる場合は -r を指定する
$ scp -r txxxxx@ofp.jcahpc.jp:~/SAMP ./





4

OFP上のホームディレクトリにあるSAMPフォルダを、その中身ごと、PCのカレントディレクトリに取ってくる

Oakforest-PACS利用の手引き

PCのファイルをOakforest-PACSに置く
 同様にターミナルでscpコマンドを使う$ scp ./a.f90 txxxxx@ofp.jcahpc.jp:



「txxxxx」は利用者番号
PCのカレントディレクトリにある a.f90 を、OFP上のホームディレクトリに置く
 ディレクトリごと置くには、 -r を指定する
$ scp -r ./SAMP txxxxx@ofp.jcahpc.jp:

5

PCのカレントディレクトリにあるSAMPフォルダを、その中身ごと、OFP上のホームディレクトリに置く

Oakforest-PACS利用の手引き

Oakforest-PACSにおける注意 /home ファイルシステムは容量が小さく、ログインに必要なファイルだけを置くための場所です。
/home に置いたファイルは計算ノードから参照できません。
ジョブの実行もできません。

 転送が終わったら、/workに移動(mv)してください。
 または、直接 /workを指定して転送してください。
 ホームディレクトリ: /home/gt00/txxxxx


cd コマンドで移動できます。

 Workディレクトリ: /work/gt00/txxxxx

6

Oakforest-PACS利用の手引き

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

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

7

講習会：ライブラリ利用 [OFP]ＵＮＩＸ備忘録
 rm ファイル名： ファイル名のファイルを消す。
 rm *~ : test.c~ などの、~がついたバックアップファイルを消す。使う時は慎重に。*~ の間に空白が入ってしまうと、全てが消えます。
 ls :

現在いるフォルダの中身を見る。
 cd フォルダ名： フォルダに移動する。
cd .. : 一つ上のフォルダに移動。
 cd ~ ：ホームディレクトリに行く。訳がわからなくなったとき。
 catファイル名： ファイル名の中身を見る make : 実行ファイルを作る（Makefile があるところでしか実行できない）
8make clean : 実行ファイルを消す。
（clean がMakefileで定義されていないと実行できない）

講習会：ライブラリ利用 [OFP]ＵＮＩＸ備忘録
 less

ファイル名： ファイル名の中身を見る(catでは画面がいっぱいになってしまうとき）
スペースキー : 1画面スクロール / : 文字列の箇所まで移動する。
 q ： 終了 （訳がわからなくなったとき） cp ファイル名

フォルダ名: ファイルをコピーする
 mvファイル名 フォルダ名:ファイルを移動させる

9

講習会：ライブラリ利用 [OFP]テストプログラムのコンパイルと実行[Oakleaf-FX編]

10

講習会：ライブラリ利用 [OFP]サンプルプログラムのコンパイル

11

講習会：ライブラリ利用 [OFP]サンプルプログラム名
 Ｃ言語版・Ｆｏｒｔｒａｎ90版共通ファイル：

Samples-OFP.tar
 tarで展開後、Ｃ言語とＦｏｒｔｒａｎ90言語のディレクトリが作られる
 C/: C言語用
 F/ : Fortran90言語用
 上記のファイルが置いてある場所/work/gt00/z30107 (/homeでないので注意）

12

講習会：ライブラリ利用 [OFP]並列版Helloプログラムをコンパイルしよう
(1/2)
1.
2.

3.
4.
5.
6.

13

Workディレクトリ(/work/gt00/txxxxx)に移動する/work/gt00/z30107 にある Samples-OFP.tar を自分のディレクトリにコピーする$ cp /work/gt00/z30107/Samples-OFP.tar ./Samples-fx.tar を展開する$ tar xvf Samples-OFP.tar
Samples フォルダに入る$ cd Samples
C言語： $ cd C
Fortran90言語 ： $ cd F
Hello フォルダに入る$ cd Hello並列版Helloプログラムをコンパイルしよう(2/2)

make する$ make7. 実行ファイル(hello)ができていることを確認
する
$ ls
6.

14

サンプルプログラムの実行

15

Oakforest-PACSスーパーコンピュータシステ
ムでのジョブ実行形態
 以下の２通りがあります インタラクティブジョブ実行

ＰＣでの実行のように、コマンドを入力して実行する方法
 スパコン環境では、あまり一般的でない デバック用、大規模実行はできない※講習会アカウントでは
 OFPでは、以下に限定

１ノード（68コア）：2時間まで
 16ノード（1,088コア）：10分まで

バッチジョブ実行のみ、最大16ノード15分まで

 バッチジョブ実行

バッチジョブシステムに処理を依頼して実行する方法
 実行させたい処理をファイル（ジョブスクリプト）で指示する
 スパコン環境で一般的
 大規模実行用
 OFPでは、最大2048ノード（139,264コア）(24時間)
16

講習会：ライブラリ利用 [OFP]Oakforest-PACSスーパーコンピュータシステ
ムでのジョブ実行形態(2) 2つの異なるメモリモードを用意 Flatモード
 MCDRAMとDDR4メモリを個別にアクセス可能 Cacheモード
 MCDRAMはDDR4メモリのキャッシュとして働く

 各ジョブキューには、-flat, -cache をそれぞれ用意

17

講習会アカウントでは、Flatモードだけが使えます。

Oakforest-PACS利用の手引き

インタラクティブ実行のやり方
 コマンドラインで以下を入力

1ノード実行用 $ pjsub --interact –g gt00 –L rg=interactive{flat,cache},elapse=01:00
※コマンドは改行せず1行で入力すること
16ノード実行用
 $ pjsub --interact –g gt00 –L rg=interactive{flat,cache},node=16,elapse=01:00
※インタラクティブ用のノードがすべて使われている場合、資源が空くまで、ログインできません。
※講習会アカウントでは使えません。
18

Oakforest-PACS利用の手引き

コンパイラの種類とインタラクティブ実行およびバッチ実行
 OFPでは、コンパイラはバッチ実行、インタラクティブ実行で共通に使えます。
 例） Intelコンパイラ
Cコンパイラ: icc, mpiicc (Intel MPIを使う場合）
 Fortran90コンパイラ: ifort, mpiifort (Intel MPIを使う場合）
 KNL向け最適化： -xMIC-AVX512
 ログインノードやプレポスト用ノードで実行する可能性もある場合:-axMIC-AVX512

19

Oakforest-PACS利用の手引き

バッチ処理とは スパコン環境では、通常は、インタラクティブ実行（コマンドラインで実行すること）はできません。
 ジョブはバッチ処理で実行します。
バッチキュージョブの依頼

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

実行
ユーザ
20

Oakforest-PACS利用の手引き

スパコンバッチキューの設定のしかた
 OFPでのバッチ処理は、富士通のバッチシステムで管理されています。
 以下、主要コマンドを説明します。
ジョブの投入：pjsub <ジョブスクリプトファイル名> 自分が投入したジョブの状況確認：pjstat
 投入ジョブの削除：pjdel <ジョブID>
 バッチキューの状態を見る：pjstat --rsc バッチキューの詳細構成を見る：pjstat --rsc -x
 投げられているジョブ数を見る：pjstat -b
 過去の投入履歴を見る：pjstat -H
 同時に投入できる数／実行できる数を見る：pjstat --limit

21

Oakforest-PACS利用の手引き

ジョブスクリプトの例※実行させたい処理によって各項目の内容は異なります#!/bin/bash#PJM -L rscgrp=lecture-flat#PJM -L node=2#PJM --mpi proc=4#PJM --omp thread=16#PJM -L elapse=0:01:00#PJM -g gt00

リソースグループ名：lecture-flat
利用ノード数
MPIプロセス数
プロセスあたりのスレッド数
実行時間制限：１分

mpirun ./a.out
22プログラムを実行
Oakforest-PACS利用の手引き

利用グループ名：gt00

本お試し講習会でのキュー・グループ名
 本演習中のキュー名：tutorial-flat 最大10分まで
 最大ノード数は16ノード(1088コア) まで
 本演習時間以外（24時間）のキュー名：

lecture-flat 利用条件は演習中のキュー名と同様 グループ名：gt00

23

Oakforest-PACS利用の手引き

pjstat --rsc の実行画面例

使えるキュー名(リソースグループ)24$ pjstat --rsc
RSCGRPSTATUS
regular-cache|---- small-cache[ENABLE,START]`---- medium-cache[ENABLE,START]
regular-flat|---- small-flat[ENABLE,START]`---- medium-flat[ENABLE,START]interactive-cache|---- interactive_n1-cache [ENABLE,START]`---- interactive_n16-cache [ENABLE,START]interactive-flat|---- interactive_n1-flat[ENABLE,START]`---- interactive_n16-flat [ENABLE,START]
debug-cache[ENABLE,START]
debug-flat[ENABLE,START]
prepost[ENABLE,START]

現在使えるかNODE
3846
3846
3846
3846
100
100100
100
234
234
12

ノードの利用可能数

Oakforest-PACS利用の手引き

pjstat --rsc -x の実行画面例$ pjstat --rsc -x
RSCGRPSTATUS
regular-cache|---- small-cache[ENABLE,START]`---- medium-cache[ENABLE,START]
regular-flat|---- small-flat[ENABLE,START]`---- medium-flat[ENABLE,START]interactive-cache|---- interactive_n1-cache [ENABLE,START]`---- interactive_n16-cache [ENABLE,START]interactive-flat|---- interactive_n1-flat [ENABLE,START]`---- interactive_n16-flat [ENABLE,START]
debug-cache[ENABLE,START]
debug-flat[ENABLE,START]
prepost[ENABLE,START]

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

現在
使えるか

MIN_NODE MAX_NODE MAX_ELAPSE REMAIN_ELAPSE MEM(GB) PROJECT
1
129

128
512

48:00:00
48:00:00

48:00:00
48:00:00

82 pz0105
82 pz0105

1
129

128
512

48:00:00
48:00:00

48:00:00
48:00:00

96 pz0105
96 pz0105

12

1
16

02:00:00
00:10:00

02:00:00
00:10:00

82 pz0105
82 pz0105

121
1
1

1
16
128
128
1

02:00:00
00:10:00
00:30:00
00:30:00
06:00:00

02:00:00
00:10:00
00:30:00
00:30:00
06:00:00

96 pz0105
96 pz0105
82 pz0105
96 pz0105
222 pz0105

ノードの実行情報
Oakforest-PACS利用の手引き

課金情報（財布）
実習では１つのみpjstat --rsc -b の実行画面例$ pjstat --rsc –b
RSCGRPSTATUS
regular-cache|---- small-cache[ENABLE,START]`---- medium-cache[ENABLE,START]
regular-flat|---- small-flat[ENABLE,START]`---- medium-flat[ENABLE,START]interactive-cache|---- interactive_n1-cache [ENABLE,START]`---- interactive_n16-cache [ENABLE,START]interactive-flat|---- interactive_n1-flat [ENABLE,START]`---- interactive_n16-flat [ENABLE,START]
debug-cache[ENABLE,START]
debug-flat[ENABLE,START]
prepost[ENABLE,START]

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

現在
使えるか

TOTAL RUNNING QUEUED HOLD OTHER

NODE

45
140
1

5000003846
3846

150
7120
330
400003846
3846

0000000000100
100

1070010400003000000000000100100234234
12

待たされてジョブ 実行しての総数 いるジョブ いるジョブの数
Oakforest-PACS利用の手引きの数

ノードの利用可能数

並列版Helloプログラムを実行しよう このサンプルのＪＯＢスクリプトは

hello-pure.bashです。
 配布のサンプルでは、キューが”lecture”になっています $ emacs hello-pure.bash
で、“lecture” → “tutorial”に変更してください
27

講習会：ライブラリ利用 [OFP]並列版Helloプログラムを実行しよう
1.
2.
3.

4.
5.

28

Helloフォルダ中で以下を実行する$ pjsub hello-pure.bash
自分の導入されたジョブを確認する$ pjstat
実行が終了すると、以下のファイルが生成される
hello-pure.bash.eＸＸＸＸＸＸ
hello-pure.bash.oＸＸＸＸＸＸ （XXXXXXは数字）
上記の標準出力ファイルの中身を見てみる$ cat hello-pure.bash.oＸＸＸＸＸＸ“Hello parallel world!”が、64プロセス*4ノード=256表示されていたら成功。
講習会：ライブラリ利用 [OFP]バッチジョブ実行による標準出力、標準エラー出力
 バッチジョブの実行が終了すると、標準出力ファイルと標準エラー出力ファイルが、ジョブ投入時のディレクトリに作成されます。
 標準出力ファイルにはジョブ実行中の標準出力、標準エラー出力ファイルにはジョブ実行中のエラーメッセージが出力されます。

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

29

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

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

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

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);}30

MPIの終了全体のプロセッサ台数を取得：各コアで値は同じ（演習環境では192）

講習会：ライブラリ利用 [FX10]

並列版Helloプログラムの説明（Fortran言語）
program main

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

common /mpienv/myid,numprocs

MPIの初期化
integer myid, numprocs
integer ierr

自分の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)stopend31

MPIの終了全体のプロセッサ台数を取得：各コアで値は同じ（演習環境では192）

時間計測方法（C言語）
double t0, t1, t2, t_w;..
ierr = MPI_Barrier(MPI_COMM_WORLD);
t1 = MPI_Wtime();

バリア同期後時間を習得し保存＜ここに測定したいプログラムを書く＞
ierr = MPI_Barrier(MPI_COMM_WORLD);
t2 = MPI_Wtime();t0 = t2 - t1;
ierr = MPI_Reduce(&t0, &t_w, 1,MPI_DOUBLE,MPI_MAX, 0,
MPI_COMM_WORLD);

32

各プロセッサーで、ｔ0の値は異なる。
この場合は、最も遅いものの値をプロセッサ０番が受け取る

時間計測方法（Fortran言語）
double precision t0, t1, t2, t_w
double precision MPI_WTIME..
call MPI_BARRIER(MPI_COMM_WORLD, ierr)
t1 = MPI_WTIME(ierr)

バリア同期後時間を習得し保存＜ここに測定したいプログラムを書く＞
call MPI_BARRIER(MPI_COMM_WORLD, 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)33

各プロセッサーで、ｔ0の値は異なる。
この場合は、最も遅いものの値をプロセッサ０番が受け取る

おわり
お疲れさまでした34

講習会：ライブラリ利用 [OFP]