第138回お試しアカウント付き講習会「スーパーコンピューター超入門」
2020年9月18日

利用実習編
本資料はWindowsマシン上で
PuTTYを使われる方向けのものです

2020/9/23 v2.0 (修正版)

第138回講習会スーパーコンピューター超入門：実習編

2

実習内容
1. スーパーコンピューターへのログイン
初めてスパコンに入る
2. 簡単なプログラムの作成、ジョブの実行
初めてスパコンでファイルを操作、初めてスパコンでプログラムをコンパイル、そして計算
3. サンプル並列プログラムの実行（積分計算）
初めて並列化による計算の高速化を実感
4. 計算した結果を自分のコンピューターに転送（時間あれば）

第138回講習会スーパーコンピューター超入門：実習編

3

スーパーコンピューター (スパコン) 利用のイメージ
通常、スパコンでは
ログインノードと呼ばれる玄関口から実行命令を出します1. ログイン[tut138@obcx02~]$ ls -l
drwxr-x--- 2 shiba group 10 1
Apr 13:00 test.out[tut138@obcx02~]$ ./test.out
Hello world[tut138@obcx02~]$ qsub a.sh

3. プログラム動作

2. ジョブ投入

SSH

端末

SSH で接続するには鍵の準備が必要！

ログインノード

計算ノード
= 本体

第138回講習会スーパーコンピューター超入門：実習編

4

鍵の作成 (PuTTYの方)PuTTYgen を用いて公開鍵、秘密鍵を作成します(1) PuTTYgen を起動
アイコンがなければ左下のメニューから検索(2) Generate a public/private
Key をクリック

第138回講習会スーパーコンピューター超入門：実習編

5

鍵の作成 (PuTTYの方)PuTTYgen を用いて公開鍵、秘密鍵を作成します(3) 緑色のバーの近くでマウスを動かす(4) 秘密鍵のパスフレーズを決める**********************

公開鍵、秘密鍵が作成されました第138回講習会スーパーコンピューター超入門：実習編

6

鍵の作成 (PuTTYの方)PuTTYgen を用いて公開鍵、秘密鍵を作成します(5) 公開鍵と秘密鍵を保存 + 公開鍵をクリップボードにコピー**********************

保存先ディレクトリ情報を忘れずにメモ。あとで使います。

第138回講習会スーパーコンピューター超入門：実習編

7

SSH Public Key Authentication
SSH公開鍵認証
SSH= Secure Shell• id_rsa• Private Key（秘密鍵） ：PC上
• 文字通り「秘密」にしておくこと• 他の人に送ってはいけない• 基本的には作成した場所からコピーしたり移動することもしないこと• id_rsa.pub• Public Key（公開鍵）：スパコン上• コピー可能，他の人にe-mailで送ることも可能• もし複数のPCからスパコンにログインする場合は，各PCごとに「公開鍵・秘密鍵」のペアをssh-keygenによって作成• 各スパコンに複数の公開鍵を登録することは可能• スパコン上の公開鍵のうちの一つがPC上の「秘密鍵＋Passphrase」とマッチすると確認されるとログインできる

第138回講習会スーパーコンピューター超入門：実習編

8①スパコンポータルサイトにログイン
https://obcx-www.cc.u-tokyo.ac.jp/cgi-bin/hpcportal.ja/index.cgi

情報基盤センターから送付された利用者
ID（tUVXYZ）

情報基盤センターから送付された初期パスワード

第138回講習会スーパーコンピューター超入門：実習編

9②初期パスワードの変更

情報基盤センターから送付された初期パスワード

パスワード規約• 8文字以上，現在と3文字以上異なる• 2世代前までと異なる• 英字（小文字，大文字），数字，特殊文
字各1字以上• Linux辞書に登録されている語は不可• 全角文字不可

変更後のパスワード
を入力（2回）

第138回講習会スーパーコンピューター超入門：実習編

10③公開鍵登録（id_rsa.pub）

1. 「SSH公開鍵登録」を選択
2. 先ほどCopyした公開鍵 （ id_rsa.pub ) を貼り付ける
3. 「登録」をクリック
よくトラブルが起きますので、先に進めなければ質問してください第138回講習会スーパーコンピューター超入門：実習編

11

スパコンには複数の公開鍵を登録できる

第138回講習会スーパーコンピューター超入門：実習編

12

ポータルサイトでのマニュアル等閲覧（1/2）

第138回講習会スーパーコンピューター超入門：実習編

13

ポータルサイトでのマニュアル等閲覧（2/2）

第138回講習会スーパーコンピューター超入門：実習編

14

スパコンにログイン(1) PuTTYを起動(2) 接続先 (Host Name) を設定

アイコンがなければ左下のメニューから検索

obcx.cc.u-tokyo.ac.jp

第138回講習会スーパーコンピューター超入門：実習編

スパコンにログイン(3) 秘密鍵を指定する

Connection → SSH → Authと移動

先ほど保存した秘密鍵を指定“id_rsa”

15

第138回講習会スーパーコンピューター超入門：実習編

16

スパコンにログイン(4) 設定を保存
左上 “Session” へ移動→ “Default Setting” を選択, Save

次回以降すぐLoadで開始できます(5) 実際にログイン
先ほど作成保存した秘密鍵を指定“id_rsa”

第138回講習会スーパーコンピューター超入門：実習編

スパコンにログイン(5) 実際にログイン〔続〕ユーザー名 ( tUVXYZ ) を入力

スパコンのログインノード上で操作ができるようになりました。

tUVXYZtUVXYZ

17

第138回講習会スーパーコンピューター超入門：実習編

ログインしたら
ログインノード上のLinux の操作画面になります→ 命令文を打ちます[tUVXYZ@obcx01 ~]$ pwd

Return/home/tUVXYZ

pwd ー 現在のディレクトリ（フォルダ）
を位置を返すコマンド18

第138回講習会スーパーコンピューター超入門：実習編

19

OBCXのディレクトリ構成/home/home/tUVXYZ/home/kUVXYZ/home/mUVXYZ/
ルート
ディレクトリ/work/work/gt00/work/gt00/tUVXYZ/work/po****/work/jh******

LUSTRE ファイルシステム
/usr
/etc

高速なファイルの読み書きができる
OBCXスパコンの計算は、全部ここから実施
トラブルもたまにあるので /homeから隔離されています第138回講習会スーパーコンピューター超入門：実習編

Linux のコマンド集（簡単なもの）
コマンド

cd

現在のディレクトリの変更

ls

ファイル・ディレクトリの表示

pwd

現在のディレクトリの表示

mv

ファイル・ディレクトリの移動

cp

ファイル・ディレクトリのコピー

rm

ファイル・ディレクトリの消去（注意して使う）

mkdir

新たな空きディレクトリの作成

cat

ファイル内容の表示（全体）less

ファイル内容の表示（一画面ごと）

head

ファイル内容の表示（先頭部分）

tail

ファイル内容の表示（末尾部分）

grep

ファイルに含まれる文字列を検索

echo

変数や文字列の値を出力

exit

セッションを終了する

20

第138回講習会スーパーコンピューター超入門：実習編

21

ログインしたら$ pwd

Return/home/tUVXYZ$ cd /work/gt00/tUVXYZ$ pwd Return/work/gt00/tUVXYZ
$ cd
$ pwd

ReturnReturn/home/t00XYZ

Return1. ログインしたら「/home/tUVXYZ」に入る
2. /homeは容量が少ないので「/work/gt00/tUVXYZ」に移動すること
3. 「cd」でホームに戻れます第138回講習会スーパーコンピューター超入門：実習編

22

プログラム例題：フィボナッチ数列
漸化式で定義F0 = 1F1 = 1
Fn = Fn 1 + Fn 2
<latexit sha1_base64="aGpfKio9rBd4elCeerhjKtm4B6M=">AAADTHichVJLa9RQGD1Ntdbx0aluBDfB6ZSKtNzMxiIIVaG47MNpC80wJOntGJrcxCQzWsP8Af+AC1cKRcSf4caN7lT6E8RlC4IP8OROxEcZvSHJ+c73ne+e+3DjwE8zIfZHjNFjx8dOjJ+snDp95uxEdfLcWhp1E082vSiIkg3XSWXgK9nM/CyQG3EindAN5Lq7c6vIr/dkkvqRupPtxrIVOh3lb/uek5FqV29Mm4ttYV43LdO2K0Vg/R4oBovtXM1affPKADX69r2us2XOKLsjzcbldrUm5oQe5lFglaCGcixF1S+wsYUIHroIIaGQEQdwkPLZhAWBmFwLObmEyNd5iT4q1HZZJVnhkN3ht8Nos2QV46JnqtUeZwn4JlSaqIt34oU4EK/FS/FRfBvaK9c9Ci+7/LsDrYzbE48urH7+ryrkP8PdX6p/es6wjXnt1af3WDPFKryBvvfw8cHqtZV6Pi2eiU/0/1Tsi1dcgeodenvLcuUJu9eHOnLpZvie5ZzrAeeP9AmkZaVi5r7euVCvRfGscvIueswUvooTammu2J2IPXLsaRSw9uf6TUyhxsopKtiZ18T6+1IcBWuNOYt4uVFbuFlemHFcxCXMsNNVLOA2ltCki+d4g/f4YLw1Do2vxvdBqTFSas7jjzE69gNCK76f</latexit>
sha1_base64="j41D7YQITxu9gm7MzpYA7IjDnag=">AAAC+3ichVI9T9tQFD0YaCHQJmxILBEhqBO66QJiqtSFEQgBJBoh2zyohb9kO2mpxR/IysDA1EoZEEu3irlL/wADP6HqCFIlxMDxixGiKPRZ9rs+9557z33vWqHrxInI5YAxODT84uXIaGFsvPDqdbE0vh4HrchWDTtwg2jTMmPlOr5qJE7iqs0wUqZnuWrD2n+f+TfaKoqdwF9LDkLV9Mw939l1bDMhtLxdqsic6FV+atRyo4J8BaUbfMAOAthowYOCj4S2CxMxny3UIAiJNZESi2g52q9wiAK5LUYpRphE9/nd499Wjvr8z3LGmm2ziss3IrOMqlzIqVzJLzmT33LbN1eqc2RaDrhbPa4Kt4udyfrf/7I87gk+PrCe1ZxgFwtaq0PtoUayLuwev/3l+Kq+uFpNZ+Wb/KH+r3IpP9mB3762uytq9YTZq30VWVTT/8xS1vrM+oG+gTiP9On5pE/O0734vKuUuIU2PZmu7IaaGstOJ2COFF1tuYy977+MGVQYOUMGM3NKav/OxFNj/e1cjfaKYARTmMYbJpjHOyxhGQ0W30EHR0bH+G786E2TMZCP1QQeLeP8DrWFqbU=</latexit>
sha1_base64="/Be7ntYvb07kiOZmbXjDM/1v+Og=">AAADQXichVJLa9RQGD2NrzpWO7oS3ASnUypiuZlNiyAoQnHZh9MWmiEk6e00NLmJSWa0hvkD/gEXrhSKiD/DjRvdqfQniMsWBB/gyZ2IjzJ6Q5Lzne873+Pe6yVhkOVC7I8Zx46fOHlq/HTtzMTZc5P18xOrWdxLfdn24zBO1z03k2GgZDsP8lCuJ6l0Iy+Ua97O7dK/1pdpFsTqbr6byE7kdlWwFfhuTsqp35o2Fxxh3jAt07ZrpWH9bigaC06hrlkD8+oQtQb2vZ67ac4ouyvN1hWn3hCzQi/zKLAq0EC1FuP6F9jYRAwfPUSQUMiJQ7jI+GzAgkBCroOCXEoUaL/EADVqe4ySjHDJ7vDbpbVRsYp2mTPTap9VQr4plSaa4p14IQ7Ea/FSfBTfRuYqdI6yl13+vaFWJs7ko4srn/+rivjPsf1L9c+ec2xhXvcasPdEM+UU/lDff/j4YOX6crOYFs/EJ/b/VOyLV5xA9Q/9vSW5/ITZmyM78tjN6D0rWOsB68f6BLIqUtFzX+9cpGdRPKuCvIc+PWVf5Ql1NFfuTswcBfY0Chn7c34TU2gwcooKZuY1sf6+FEfBamvWIl4SGMclXMYME8zhJu5gEW0Wf443eI8Pxlvj0Pg6vFDGWHWzLuCPZXz/AQk4veg=</latexit>
sha1_base64="GfKpEPNEnlEk/e0vHUBFZo7JDCk=">AAADTHichVJLa9RQFD5Ntdbx0WndCG4uTqdUpOVkNpaCUBWKyz6cttAMIUlvx9DkJiaZ0RrmD/gHXLhSKCL+DDdudKfSnyBdtlDwAX65E/FRRm9I8p3vnO/c7z7cOPDTjHl/yBg+dXrkzOjZyrnzFy6OVccn1tKok3iy6UVBlGy4TioDX8lm5meB3IgT6YRuINfdnTtFfr0rk9SP1L1sN5at0Gkrf9v3nAyUXb01JRZtFjeFKSyrUgTm74FCsGjnasbsiet91OhZDzrOlphWVluKxjW7WuNZ1kOcBGYJalSOpaj6hSzaoog86lBIkhRlwAE5lOLZJJOYYnAtysElQL7OS+pRBdoOqiQqHLA7+LYRbZasQlz0TLXawywB3gRKQXX+wK/4kN/ya/7M3wb2ynWPwssu/m5fK2N77Mnl1eP/qkL8M7r/S/VPzxlt05z26sN7rJliFV5f33389HB1fqWeT/ELPoD/57zPb7AC1T3y9pblyjN0rw905MLN4D3LMdcjzB/pE0jLSoXMQ71zoV6Lwlnl4F3qIlP4Kk6opblidyL0yGlPowC1P9cvaJJqqJyEAp1xTcy/L8VJsNaYNYGXubZwu7wwo3SFrtI0Ot2gBbpLS9SEi5f0jj7SJ+O9cWR8Nb73S42hUnOJ/hjDIz8AQYu+nQ==</latexit>
sha1_base64="8EKbeTwsttEMzvq93/DNDJ5xU4g=">AAADTHichVJLa9RQGD1Ntdbx0VE3gpvgdEpFLDeDoAhCVSgu+5q20AxDkt6OoclNTDKjNcwf8A+4cKVQRPwZbtzoTqU/QbpsQfABntyJ+CijNyQ53/m+891zH24c+GkmxO6IMXrk6Nix8eOVEydPnZ6onjm7kkbdxJNNLwqiZM11Uhn4SjYzPwvkWpxIJ3QDuepu3Snyqz2ZpH6klrPtWLZCp6P8Td9zMlLt6q0pc64tzJumZdp2pQis3wPFYK6dqytW37w8QI2+fb/rbJjTyu5Is3GpXa2JGaGHeRhYJaihHPNR9QtsbCCChy5CSChkxAEcpHzWYUEgJtdCTi4h8nVeoo8KtV1WSVY4ZLf47TBaL1nFuOiZarXHWQK+CZUm6uK9eCn2xRvxSnwS34b2ynWPwss2/+5AK+P2xOPzS5//qwr5z3Dvl+qfnjNs4rr26tN7rJliFd5A33v0ZH/pxmI9nxLPxR79PxO74jVXoHoH3s6CXHzK7vWhjly6Gb5nOed6yPkjfQJpWamYeaB3LtRrUTyrnLyLHjOFr+KEWpordidijxw7GgWs/bl+E5OosXKSCnbmNbH+vhSHwUpjxiJeuFqbvV1emHFcwEVMs9M1zOIu5tGkixd4iw/4aLwzDoyvxvdBqTFSas7hjzE69gNCy76h</latexit>(n2)

繰り返し計算で数列が得られる
1, 1, 2, 3, 5, 8, 13, 21 ….
繰り返し計算はスーパーコン
ピューター利用の出発点

From Wikipedia
https://ja.wikipedia.org/wiki/フィボナッチ数

第138回講習会スーパーコンピューター超入門：実習編

23

プログラム例題：フィボナッチ数列 92個
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368

75025
121393
1964183178115142298320401346269217830935245785702887922746514930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
2971215073
4807526976

7778742049
12586269025
20365011074
32951280099
53316291173
86267571272
139583862445
225851433717
365435296162
591286729879
956722026041
1548008755920
2504730781961
4052739537881
6557470319842
10610209857723
17167680177565
27777890035288
44945570212853
72723460248141
117669030460994
190392490709135
308061521170129
498454011879264

806515533049393
1304969544928657
2111485077978050
3416454622906707
5527939700884757
8944394323791464
14472334024676221
23416728348467685
37889062373143906
61305790721611591
99194853094755497
160500643816367088
259695496911122585
420196140727489673
679891637638612258
1100087778366101931
1779979416004714189
2880067194370816120
4660046610375530309
7540113804746346429

パソコンでも計算は一瞬

第138回講習会スーパーコンピューター超入門：実習編

24

エディタでプログラムを作成する
さて、実際に作業してみましょう。
プログラムを編集するディレクトリを作成します。
Return[tUVXYZ@obcx01 ~]$ cd[tUVXYZ@obcx01 ~]$ mkdir fibonacci Return[tUVXYZ@obcx01 ~]$ cd fibonacci Return

ログインノード上では、Emacs, vim, または nano のエディタを利用してください。
例1： Emacs を使用, Fortranプログラムを作成[tUVXYZ@obcx01 fibonacci]$ emacs fibonacci.f90

Return例2： vim を使用, Python プログラムを作成[tUVXYZ@obcx01 fibonacci]$ vim fibonacci.py

Return

例3： nano を使用, C プログラムを作成[tUVXYZ@obcx01 fibonacci]$ nano fibonacci.c

Returnスーパーコンピューター超入門：講義編

25

Emacs
Emacsの基本的な操作方法について$emacs で起動

編集画面

n C→Ctrlキー、M→Metaキー（ESC)、- → 同時押し
n Ctrl-zを押さないように注意

コマンド確認画面

操作

コマンド

ファイルを開く

C-x, C-f ファイル名 Ret

別名保存

C-x, C-w ファイル名 Ret

上書き保存

C-x, C-s

Mark Set

C-space

コピーMark Set, 範囲選択, M, w

切り取りMark Set, 範囲選択, C-w

貼り付け

C-y

検索

C-s

Undo

C-x, u

キャンセル

C-g

終了

C-x, C-c

26

スーパーコンピューター超入門：講義編

Vim
編集画面

Vimの基本的な操作方法について$vim で起動
Vimではノーマルモード、入力モードとコマンドラインモードを切り替えて使う
現在のモード
ノーマル
ノーマル
入力

モードおよびコマンド確認画面
n ブランク → ノーマルモード
n : → コマンドモード
l :w Ret 上書き保存
n --挿入-- → 入力モード

移行先モード入力
コマンドラインノーマル

キー
i, a, Ins:
esc, ctrl-c

操作

コマンド

ファイルを開く

e Ret

別名保存

w ファイル名 Ret

上書き保存

w Ret

1行コピー

yy

1行切り取り

dd

貼り付け

p

検索

/検索対象 Ret

終了

q

スーパーコンピューター超入門：講義編

27

Nano
編集画面

Nanoの基本的な操作方法について$nano で起動
n ^G → CtrlとGキーを同時押し
n M-U → Escキー、Uキーを順番に押す

コマンド確認画面
n ^ → Ctrl
n M → Escn - → 順次押す

操作

コマンド

ファイルを開く^R

別名保存^O ファイル名 Ret

上書き保存

^O

マーク

M-A

マークキャンセル

M-A

コピー

M-6

切り取り

^K

貼り付け

^U

検索

^W

終了

^X

第138回講習会スーパーコンピューター超入門：実習編

28

プログラム例題：フィボナッチ数列
C言語
プログラム作成 [tUVXYZ@obcx01 fibonacci]$ emacs fibonacci.c#include <stdio.h>
int main(void) {int i;
long a, b, tmp;
a=1;
b=1;
printf("%ld\n", a);for (i=2; i<=92; i++) {tmp = b;b = a + b;
a = tmp;
printf("%ld\n", a);}}注） ¥ マークはバックスラッシュ と同じと思って（今は）結構です。

Return

第138回講習会スーパーコンピューター超入門：実習編

29

プログラム例題：フィボナッチ数列
Fortran言語
プログラム作成 [tUVXYZ@obcx01 fibonacci]$ emacs fibonacci.f90
program main
implicit none
integer(kind=4) i
integer(kind=8) a,b,tmp
a=1
b=1
do i=2, 92
tmp = bb= a + b
a = tmp
print *, aend doend program main

Return

第138回講習会スーパーコンピューター超入門：実習編

30

プログラム例題：フィボナッチ数列
Pythonプログラム作成[tUVXYZ@obcx01 fibonacci]$ emacs fibonacci.py

a, b = 1, 1
print(a)for i in range(1,92):a, b = b, a+b
print(a)注） python では
ー 64ビット整数など変数型の選択を自動的にやってくれますー 多変数を同時に代入計算できます。
ー コンパイルはする必要ありません。

Return

第138回講習会スーパーコンピューター超入門：実習編

モジュールの利用 (1)
コンパイラ等の選択
gnu コンパイラ, インテル製コンパイラ, python インタープリター, …

ライブラリを利用した計算の高速化
離散フーリエ変換, 線形代数・連立１次方程式, …

使用中モジュールの表示
Return[tUVXYZ@obcx01 ~]$ module list
Currently Loaded Modulefiles:
1) impi/2019.5.281
2) intel/2019.5.281

Intel MPI ライブラリ

Intel コンパイラ

コンパイラ, MPI ライブラリを切り替えるために一度 消去します[tUVXYZ@obcx01 ~]$ module purge[tUVXYZ@obcx01 ~]$ module list
No Modulefiles Currently Loaded.

ReturnReturn31

第138回講習会スーパーコンピューター超入門：実習編

利用可能なモジュールの一覧を表示できます[tUVXYZ@obcx01 ~]$ module avail------ /home/opt/local/modulefiles/L/mpi/intel/2019.5.281/impi/2019.5.281 -----alps/2.3.0(default)
phdf5/1.10.5(default)
feram/0.26.04(default)
pnetcdf/1.11.2(default)
frontflow_blue/8.1(default)
ppohBEM/0.5.0(default)
frontistr/4.5(default)
ppohDEM_util/1.0.0(default)
modylas/1.0.4(default)
ppohFDM/0.3.1(default)
mpi-fftw/3.3.8(default)
ppohFEM/1.0.1(default)
netcdf-fortran-parallel/4.4.5(default) ppohFVM/0.3.0(default)
netcdf-parallel/4.7.0(default)
pt-scotch/6.0.6(default)
openmx/3.8(default)
revocap_coupler/2.1(default)parmetis/4.0.3(default)
superlu_dist/6.1.1(default)
petsc/3.11.2(default)
xtapp/rc-150401(default)
phase/2019.01(default)----------- /home/opt/local/modulefiles/L/compiler/intel/2019.5.281 -----------R/3.6.0(default)
metis/5.1.0(default)akaikkr/cpa2002v010(default)
mt-metis/0.6.0(default)
bioconductor/3.10(default)
netcdf/4.7.0(default)
blast/2.9.0(default)
netcdf-cxx/4.3.0(default)
bwa/0.7.17(default)
netcdf-fortran/4.4.5(default)
fftw/3.3.8(default)
paraview/5.6.1(default)
gsl/2.5(default)
povray/3.7.0.8(default)
hdf5/1.10.5(default)
ppohAT/1.0.0(default)
hdf5/1.8.21
revocap_refiner/1.1.04(default)
impi/2019.5.281(default)
samtools/1.9(default)
intelpython/2.7
scotch/6.0.7(default)
intelpython/3.6(default)
superlu/5.2.1(default)
mesa/19.0.6(default)
superlu_mt/3.1(default)
metis/4.0.3
xabclib/1.03(default)---------------------- /home/opt/local/modulefiles/L/core ---------------------acusolve/2019.1.0(default)
intel/2018.3.222
advisor/2019.3.0.591490
intel/2019.3.199
advisor/2019.4.0.597843
intel/2019.4.243
advisor/2019.5.0.602216(default)
intel/2019.5.281(default)
anaconda/2-2019.03
intel/2020.1.217
anaconda/3-2019.03(default)
itac/2019.4.036
bioperl/1.007002(default)
itac/2019.5.041(default)
bioruby/1.5.2(default)
julia/1.4.0(default)
cmake/3.0.2
llvm/7.1.0(default)
cmake/3.14.5(default)
massivethreads/0.97

Return32

第138回講習会スーパーコンピューター超入門：実習編

33

モジュールの利用 (2)Intel コンパイラの 最新のものを load してみます[tUVXYZ@obcx01 ~]$ module load intel/2020.1.217[tUVXYZ@obcx04 ~]$ module list Return
Currently Loaded Modulefiles:
1) impi/2019.7.217
2) intel/2020.1.217

ReturnIntel MPI ライブラリも、一緒に自動でload されました

Python も比較的最近の バージョン3.7.3 を使えるようにしましょう。
[tUVXYZ@obcx01 ~]$ module load python/3.7.3
Return[tUVXYZ@obcx01 ~]$ module list
Currently Loaded Modulefiles:
1) impi/2019.7.217
2) intel/2020.1.217

Return3) python/3.7.3

第138回講習会スーパーコンピューター超入門：実習編

34

スーパーコンピューター (スパコン) 利用のイメージ
通常、スパコンでは
ログインノードと呼ばれる玄関口から実行命令を出します1. ログイン[tut138@obcx02~]$ ls -l
drwxr-x--- 2 shiba group 10 1
Apr 13:00 test.out[tut138@obcx02~]$ ./test.out
Hello world[tut138@obcx02~]$ qsub a.sh

3. プログラム動作

2. ジョブ投入

SSH

端末

SSH で接続するには鍵の準備が必要！

ログインノード

計算ノード
= 本体

第138回講習会スーパーコンピューター超入門：実習編

35

ジョブスクリプト = スパコンへの指示書
プログラムをコンパイルしたあとにログインノード上で直接 プログラム実行することはしないでください！
ー 負荷がかかると、他のユーザーの同時作業の妨げとなります
かわりに計算ノードに計算をしてもらうための「指示書」が必要となります。

C, Fortran 向け (fibonacci.sh)

Python 向け (fibonacci.sh)#!/bin/bash#PJM -L rscgrp=tutorial ［リソースグループ］#PJM -L node=1［使用するノードの数］#PJM -L elapse=0:01:00 ［実行時間上限（1分）］#PJM -g gt00
［バジェットグループ名］#PJM -N fibonacci［今回のジョブの名前］#PJM -o stdout.txt［標準出力先ファイル名］#PJM -j［エラー出力を標準出力にマージ］
module purge
module load intel/2020.1.217./fibonacci.out

module load python/3.7.3
python ./fibonacci.py

第138回講習会スーパーコンピューター超入門：実習編

36

ジョブスクリプトを用意しました。
ご自身で入力いただくと時間を要しますので、用意されたものをコピーしてください。
Return[tUVXYZ@obcx01 ~]$ cd[tUVXYZ@obcx01 ~]$ cd fibonacci

ReturnC, Fortran を使われる方[tUVXYZ@obcx01 fibonacci]$ cp /work/gt00/share/z30122/fibo_c/fibonacci.sh .
ReturnPython を使われる方[tUVXYZ@obcx01 fibonacci]$ cp /work/gt00/share/z30122/fibo_python/ fibonacci.sh .
Return

第138回講習会スーパーコンピューター超入門：実習編

37

エディターでの編集が間に合わなかった方はサンプルとなるプログラムも用意してありますので、ご自身でコピーしてください。
C を使われる方[tUVXYZ@obcx01 fibonacci]$ cp /work/gt00/share/z30122/fibo_c/fibonacci.c .

Fortran を使われる方

Return[tUVXYZ@obcx01 fibonacci]$ cp /work/gt00/share/z30122/fibo_fortran/fibonacci.f90 .

Python を使われる方

Return[tUVXYZ@obcx01 fibonacci]$ cp /work/gt00/share/z30122/fibo_python/fibonacci.py .
Return

第138回講習会スーパーコンピューター超入門：実習編

38

プログラムのコンパイル
C または Fortran を使用される方→ プログラムをコンパイルして、実行ファイル（バイナリ）を生成します。
C を使われる方[tUVXYZ@obcx01 fibonacci]$ icc fibonacci.c -o fibonacci.out
プログラム名Return

実行ファイル名

Fortran を使われる方[tUVXYZ@obcx01 fibonacci]$ ifort fibonacci.f90 -o fibonacci.out
Return

第138回講習会スーパーコンピューター超入門：実習編

スパコンでのジョブの実行
OBCX スパコンでは、 /home からプログラム実行できません→ /work ディレクトリ領域内にプログラム等一式をコピー[tUVXYZ@obcx01 ~]$ cd Return[tUVXYZ@obcx01 ~]$ ls Returnfibonacci[tUVXYZ@obcx01 ~]$ cp –r fibonacci[tUVXYZ@obcx01 ~]$ cd/work/gt00/tUVXYZ//work/gt00/tUVXYZ/fibonacci

Return

作成したジョブスクリプトを投入、計算ノードで実行してもらいます。
[tUVXYZ@obcx01 fibonacci]$ pjsub fibonacci.sh

ReturnReturn39

第138回講習会スーパーコンピューター超入門：実習編

ジョブの確認、結果の表示
実行されているジョブを確認します。
（一瞬で計算が終わるので、ジョブ一覧に出ないかも）[tUVXYZ@obcx01 fibonacci]$ pjstat

得られた結果を表示します。
[tUVXYZ@obcx01 fibonacci]$ more result_fibo.txt［

Returnで下の方に進めていくことができます］

結果から 747031 という文字列を探します[tUVXYZ@obcx01 fibonacci]$ grep 747031 result_fibo.txt

40

第138回講習会スーパーコンピューター超入門：実習編

お試しアカウントについての注意
今回発行されたアカウント→ 講習会終了後も約１ヶ月間、OBCXスパコンを使用可能
講習会終了後は リソースグループ lecture を使用してください。
リソースグループ tutorial は本日 13:00-17:00 のみです。

ジョブスクリプト
fibonacci.sh#!/bin/bash#PJM -L rscgrp=lecture#PJM -L node=1#PJM -L elapse=0:01:00#PJM -g gt00
#PJM -N fibonacci#PJM -o stdout.txt#PJM -jmodule purge
module load intel/2020.1.217./fibonacci.out［リソースグループ］

41

第138回講習会スーパーコンピューター超入門：実習編

42

並列計算の例題：区分求積で円周率計算
I=<latexit sha1_base64="YIu/MegrnHwiO6kVQlrJjYvJwyI=">AAADJXichVJNaxRBEH2Z+BHjRzbmIgRkcBMRhKUmBAyCEOLF3PK1SSC7WWZme5MmMz3DTO9m47A3T/4BD54UgqhH/QdevOSmQk6exWMEPXiwpndQNCT2MN3Vr+pVv6puLw5kqokOB6zBM2fPnR+6MHzx0uUrI6XRq6tp1E58UfWjIErWPTcVgVSiqqUOxHqcCDf0ArHm7dzP/WsdkaQyUit6Lxb10N1SsiV9VzPUKF2ft+/ZNal0gzYdu9ZKXD+b7mXO7e7mVK/ZbZTKVCEz7OOGUxhlFGMhKv1ADU1E8NFGCAEFzXYAFyl/G3BAiBmrI2MsYUsav0APw8xtc5TgCJfRHZ63eLdRoIr3ec7UsH0+JeA/YaaNSfpIL+mI3tNr+kI/T8yVmRy5lj1evT5XxI2Rx9eWv/+XFfKqsf2HdapmjRZmjFbJ2mOD5FX4fX7n4ZOj5btLk9lNek5fWf8zOqR3XIHqfPP3F8XS01P0eKzl5I5lfFKXT49M/9MiUrFn1/QtNJUovqkM+5yrw55cVX4/dYPlvYk4R9+fd7r5u3obEyhz5AQzevxEnH8fxHFjdariUMVZnC7PzhWPZQjjuIFbnOcOZvEAC6iyhkd4hTd4a72wDqwP1qd+qDVQcMbw17A+/wKS17fL</latexit>

Z 1
0

=⇡

4
dx
2
1+x

4

和の短冊
↓
1億倍以上
細かくする

3
2
1
0
0

0.2

0.4

0.6

0.8

1

x

数値積分を並列化 → 性能が向上する。
C, Fortran, Python, 3通りのサンプルプログラムを用意しました。
実習： プログラムの並列度を変えながら実行
実行時間から高速化の度合いを見る

第138回講習会スーパーコンピューター超入門：実習編

43

並列計算の例題：区分求積で円周率計算

I=<latexit sha1_base64="YIu/MegrnHwiO6kVQlrJjYvJwyI=">AAADJXichVJNaxRBEH2Z+BHjRzbmIgRkcBMRhKUmBAyCEOLF3PK1SSC7WWZme5MmMz3DTO9m47A3T/4BD54UgqhH/QdevOSmQk6exWMEPXiwpndQNCT2MN3Vr+pVv6puLw5kqokOB6zBM2fPnR+6MHzx0uUrI6XRq6tp1E58UfWjIErWPTcVgVSiqqUOxHqcCDf0ArHm7dzP/WsdkaQyUit6Lxb10N1SsiV9VzPUKF2ft+/ZNal0gzYdu9ZKXD+b7mXO7e7mVK/ZbZTKVCEz7OOGUxhlFGMhKv1ADU1E8NFGCAEFzXYAFyl/G3BAiBmrI2MsYUsav0APw8xtc5TgCJfRHZ63eLdRoIr3ec7UsH0+JeA/YaaNSfpIL+mI3tNr+kI/T8yVmRy5lj1evT5XxI2Rx9eWv/+XFfKqsf2HdapmjRZmjFbJ2mOD5FX4fX7n4ZOj5btLk9lNek5fWf8zOqR3XIHqfPP3F8XS01P0eKzl5I5lfFKXT49M/9MiUrFn1/QtNJUovqkM+5yrw55cVX4/dYPlvYk4R9+fd7r5u3obEyhz5AQzevxEnH8fxHFjdariUMVZnC7PzhWPZQjjuIFbnOcOZvEAC6iyhkd4hTd4a72wDqwP1qd+qDVQcMbw17A+/wKS17fL</latexit>

Z 1
0

4
dx
2
1+x
<latexit sha1_base64="j+KUowALq9uGW98P/74s4ozsML4=">AAADFnichVJNS9xQFD2mH07tx0zbTaGb0FFxNdxIoVIoDO3GpR8dFZxhSOJTwyQvIXkz1Qb/gH9AwZXiLKT/wY2UdtlNF/4EcWlBFy68eRMUFe0Lybs59577zr3vOpHvJYrosM948PDR4/7Ck4Gnz56/KJZevppJwnbsipob+mE859iJ8D0paspTvpiLYmEHji9mndaXzD/bEXHihfKrWo1EI7CXpLfoubZiqFkqrpifzLqyZV0tC2WbzVKZKqSXeduwcqOMfE2EpTPUsYAQLtoIICCh2PZhI+FnHhYIEWMNpIzFbHnaL7CGAea2OUpwhM1oi79L/Defo5L/s5yJZrt8is9vzEwTQ/SX9uiEftMPOqLzO3OlOkemZZV3p8cVUbO4/mb69L+sgHeF5SvWvZoVFjGmtXqsPdJIVoXb43e+b5xMf5waSodph45Z/zYd0gFXIDv/3O6kmNq6R4/DWu7uWMonrfDpoe5/kkdK9nzTfQt0JZJvKkWXc3XYk6nK7qehsaw3Iefo+bNOL1xWb2IQZY4cZMYaj4h1cyBuGzOjFYsq1uT7cvVzPiwFvMU7jHCeD6hiHBOo6anZwi66xqaxb/w0fvVCjb6c8xrXlvHnAhZqslQ=</latexit><latexit sha1_base64="1CQkwTm/mHpOpeb5J8fJGoRvdw0=">AAADTXichVJNT9RQFD0UFMQPBtmQuJlYMKwmr8REQ0JCZMOSDwdImJG0nQc2tH1N2xnAhj/gH3DhChIWRv+FG3cmJiyI/gHjEo0uiPG8Nw0JEPA1fR/n3nvuufc9LwmDLBfiuMfq7btxs3/g1uDtO3fvDVWG7y9nqp36su6rUKWrnpvJMIhlPQ/yUK4mqXQjL5Qr3tastq90ZJoFKn6e7yayGbmbcbAR+G5OSFVstLCDKqb5N7CBFC58FEQbyPESkrOLPSIN4goZXmCSvofnrNX1ii1qwozq5Y1TbmyUY15V/pCwRUIfbUQkiknlIyRdxm8NDgQSYk2mdikrR2DskukGGduml6SHlrvFeZOntRKNedacmYnWskP+qRaKcXEk3okT8Um8F9/F6ZVcheHQWna5et1YmawPvR5d+v3fqIirbtBZ1LWaczb+qdEaUHtiEF2F343vvHpzsjS1OF48EgfiB/Xvi2PxkRXEnZ/+4YJcfHuNHo9aru5YwUw7zK5M/7PSM6Zl2/QtMpXEvKmCV+6hQ4tWpe+naTDdG0WOrl13unVWfRVjsOk5xog9PhHn4oO4vFmerDmi5iw8tmeelY9lAA/wEBPkeYIZzGEedWr4gC/4im/WZ+uXdWr97bpaPWXMCM6N3v5/FRS7hQ==</latexit><latexit sha1_base64="lbw0MT3NDTLgRBT7H7GXnzTI0Ys=">AAADf3ichVJBT9RAFH6lqIgCK1xMvExcEBOTZUo2UUhIiF70BosLJHTZTLuzuxPamaadXcBm/4B/wIMnTTgYf4YX/4AHLt6NR0z04ME3s1URAk7T9s177/ve995MkEQi05QeOyPu6JWr18auj9+4OTE5Vbo1vZmpXhryeqgilW4HLOORkLyuhY74dpJyFgcR3wr2npj4Vp+nmVDyuT5MeCNmHSnaImQaXc3SgV8Tna5maar2yTOyQnwhdZPu5n4iyEJ1QPx2ysK8Osi9B75mcneR+LrLNfsdaRXb3A9Vdiq6QqqnuQxVkWqKJKJZKtMKtYucN7zCKEOx1lTpB/jQAgUh9CAGDhI02hEwyPDZAQ8oJOhrQI6+FC1h4xwGMI7YHmZxzGDo3cNvB3c7hVfi3nBmFh1ilQjfFJEE5ugn+o6e0I/0Pf1Cf17IlVsOo+UQ/8EQy5Pm1MvbG9//i4rxr6H7F3WpZg1teGS1CtSeWI/pIhzi+y9enWws1+bye/Qt/Yr639Bj+gE7kP1v4dE6r72+RE+AWi6eWI6VDrC6svPPikyJkX07t9h2IvGkcjhCrj5GjCpzPg3rM7NRyDGMm0m3/nRPYBbKmDmLiAFeEe/shThvbC5WPFrx1qvl1cfFZRmDO3AX7iPPQ1iFp7AGddTw2Rl1JpxJ13Hn3YpLh6kjToGZgX+Wu/QLZJ7Tlg==</latexit>

3
2

変数変換

)I=

4

x = tan ✓

1

d✓
dx =
cos2 ✓

0

Z ⇡/4
0

0

0.2

4
d✓
=4
2
2
1 + tan ✓ cos ✓

0.4

0.6

x

Z ⇡/4
0

d✓ = ⇡

0.8

1

第138回講習会スーパーコンピューター超入門：実習編

44

コンピュータにおける演算の仕組み(ノイマン型) コンピューター上では、全ての数がビット [0,1] の集まりで表現される

単精度浮動小数点 = 32ビットで1つの実数を表現
符号部 (sign) 1 bit

仮数部（fraction), “b” 23 bit

log10 (223 ) ⇠ 7 桁程度 (10進) が表現可
<latexit sha1_base64="4Sitmq0W9IGkUSl/kynf02Ta5ls=">AAADIHichVK7btRQED0xrxAeWaAB0VhsgkKzGi9IQVQRNJR5sEmk7LKynZvlKn7J9i4Ea0XPD1BQESkFQoKPoEmHKCjCHyDKIEFBwfFdCwRRwrXsOz4zZ+bM3Oslgc5ykb0x69jxEydPjZ+eOHP23PnJ2oWLy1ncT33V8uMgTlc9N1OBjlQr13mgVpNUuaEXqBVv817pXxmoNNNx9CDfSlQndHuR3tC+mxPq1q60g7jXLRwZ2jPNh0Xz5vCG3c50aM92a3VpiFn2QcOpjDqqNR/XfqCNdcTw0UcIhQg57QAuMj5rcCBIiHVQEEtpaeNXGGKC3D6jFCNcopv89vi3VqER/8ucmWH7rBLwTcm0MS2f5LXsy668kS/y89BchclRatni7o24KulOPr+89P2/rJB7jkd/WEdqzrGB20arpvbEIGUX/og/ePpif+nO4nRxXbblK/W/kj15zw6iwTd/Z0EtvjxCj0cth0+sYKUnrB6b+WdVZETPYzO30HQS8aQK7DDXgJ5SVXk+HYOVs4mZY+QvJ73+u3sbU6gzcoqMIa+I8++FOGgsNxuONJyFW/W5u9VlGcdVXMMM88xiDvcxjxY1PGO9t3hnbVu71gfr4yjUGqs4l/DXsj7/Atl6tWI=</latexit>

変数型

指数部（exponent), “e” 8 bit( 1)sign (1.b1 b2 . . . b23 )2 ⇥ 2e 127

FORTRAN: real(kind=4)
C, C++: float
Python: 基本はなし<latexit sha1_base64="XynGJF0BBRQlgkEFTXlwKanA/AE=">AAADQ3ichVLLahRBFD1pX3lpRt0E3DROIpNFhupWiIiLoBuXeThJIDNpunsqkyL9oqtmNDbzA/6AC1cGshA/Q4RsFVzkEyS7JKALhdyqaRQNidV01a1z77l17q0KskhIxdjBkHXp8pWr14ZHRsfGr9+YqNy8tSLTbh7yRphGab4W+JJHIuENJVTE17Kc+3EQ8dVg+6n2r/Z4LkWaPFc7GW/FficRmyL0FUFe5XFt1pnZKJp5bEvRSfp2zakHnmMHnms3o3aqJJmFe78/owElYi5td6Pgs4471/cqVVZnZthnDac0qijHQlr5gSbaSBGiixgcCRTZEXxI+tbhgCEjrIWCsJwsYfwcfYwSt0tRnCJ8Qrdp7tBuvUQT2uuc0rBDOiWiPyemjWn2lb1nx2yffWDf2M9zcxUmh9ayQ2sw4PLMm3g9ufz9v6yYVoWtP6wLNSts4qHRKkh7ZhBdRTjg9169OV5+tDRd3GO77JD0v2MH7CNVkPROwr1FvvT2Aj0BaTm/YwWd9JJOT03/ZRmZkOeF6VtsKknopgrsUa4eebQqfT8tg+nepJRj4Nedbv+u3sYUqhQ5RQz9RJx/H8RZY8WtO6zuLD6ozj8pH8sw7uAuapRnDvN4hgU0SMMu9vEZX6xP1qF1ZJ0MQq2hknMbfw3r1ynBgMG5</latexit>

倍精度浮動小数点 = 64ビットで1つの実数を表現
符号部 (sign) 1 bit

仮数部（fraction), “b” 52 bit

指数部（exponent), “e” 11 bit( 1)sign (1.b1 b2 . . . b52 )2 ⇥ 2e 1023
<latexit sha1_base64="gLMuFjUK2FLK/pvS4/ABimbQTbI=">AAADRHichVLNahRBEK6MfzH+ZBMvgpfBTWRzyFIzGhIEIejFY37cJJDdDDOznbXJTPcw3bsmDvsCvoAHTyo5iI8hiF4VD3kE0dsqehCxundQNCT2MN3VX9VX/VV1R1nClUY8GHFOnDx1+szo2bFz5y9cHK9MTK4p2c1j1ohlIvONKFQs4YI1NNcJ28hyFqZRwtajnTvGv95jueJS3NN7GWulYUfwbR6HmqCgcqs2681sFc08dRXviL5b8+pR4LlR4LvNpC21IrOY8/szBtA8Zcr1two266F/vR9UqlhHO9zDhlcaVSjHkqx8hya0QUIMXUiBgQBNdgIhKPo2wQOEjLAWFITlZHHrZ9CHMeJ2KYpRREjoDs0d2m2WqKC9yaksO6ZTEvpzYrowjR/wBQ7wDb7Ej/jjyFyFzWG07NEaDbksC8YfXV799l9WSquG+39Yx2rWsA0LVisn7ZlFTBXxkN97+HiwenNluriGz/AT6X+KB/iKKhC9L/H+Mlt5coyeiLQc3bGCTtql06XtvyojBXke2L6lthJBN1XAPuXqkceoMvfTspjpjaQcQ7/pdPt39S5MQZUip4hhnoj374M4bKz5dQ/r3vKN6uLt8rGMwhW4CjXKMw+LcBeWoEEansNbeAfvndfOZ2fgfB2GOiMl5xL8NZyfvwBz4MHx</latexit><latexit sha1_base64="zZQLlMDSE8IlaEvlCCcLNAbZMKo=">AAADIXichVLPT9RAFP4oiogKC16MXhoWDF42rxsJhBPRi0d+LZCw66YtwzKh7TRtdwGbTTz7D3jwpAYTwgH+By9yIyQciH+B8YiJHjz4OttogIDTdObN99735ntvxgk9GSdEp11G942bPbd6b/fduXuvf6AwOLQYq2bkioqrPBUtO3YsPBmISiITTyyHkbB9xxNLzsbzzL/UElEsVbCQbIei5tuNQK5J104YqhceVj3VqKcWtc2x8st0vNx+YlZj6ZvWeL1QpBLpYV42rNwoIh8zqvALVaxCwUUTPgQCJGx7sBHztwILhJCxGlLGIrak9gu00cfcJkcJjrAZ3eC5wbuVHA14n+WMNdvlUzz+I2aaGKUT2qUz+kJ79I1+X5kr1TkyLdu8Oh2uCOsDbx7M//wvy+c1wfo/1rWaE6xhUmuVrD3USFaF2+G3Xr09m5+aG00f0wf6zvrf0yl95gqC1g93Z1bMvbtGj8Naru5Yyidt8elK9z/OIwP2bOq++bqSgG8qxQ7narEnU5XdT01jWW8U5+j4s06v/q3exAiKHDnCjDY/Eevig7hsLJZLFpWs2afF6Wf5Y+nFIwxjjPNMYBovMIMKa3iNT9jHgfHRODSOjONOqNGVc+7j3DC+/gGIvbWd</latexit>

log10 (252 ) ⇠ 15 桁程度 (10進) が表現可
変数型

FORTRAN: real(kind=8)
C, C++: double
Python: 無指定で倍精度

第138回講習会スーパーコンピューター超入門：実習編

46

プログラムの解説 C
pi.c [非並列版]

pi_mpi.c [並列版]#include <stdlib.h>#include <stdio.h>#include <stdlib.h>#include <stdio.h>#include <mpi.h>

int main(void) {int i;
int ndiv = 10000000;

double width = 1.0 / (double)ndiv;
printf("width = %.15f\n", width);
double sum = 0.0;
double x = 0.0;

for (i=0; i<ndiv; i++) {x = (i+0.5)*width;
sum += width * 4.0 / (1.0 + x*x);}

for (i = myrank*ndiv_local;i < (myrank+1)*ndiv_local; i++) {x = (i + 0.5) * width;
sum = sum + width * 4.0 / (1.0 + x*x);}

int main(int argc, char* argv[]) {int ndiv = 5600000000;
int ierr, myrank, nprocs;
int ndiv_local, i;
double x, width, sum, total_sum;
double t1, t2;

MPI_Reduce(&sum, &total_sum, 1, MPI_DOUBLE,
MPI_SUM, 0, MPI_COMM_WORLD);
t2 = MPI_Wtime();width = 1.0 / (double)ndiv;
if (myrank == 0) {printf("PI(MPI) = %.18f\n", total_sum);printf("Number of cores utilized = %d\n", nprocs);
printf("Execution time = %.8f (sec.)\n", t2 - t1);}

ierr = MPI_Init(&argc, &argv);
ierr = MPI_Comm_rank(MPI_COMM_WORLD,&myrank);ierr = MPI_Comm_size(MPI_COMM_WORLD,&nprocs);

ierr = MPI_Finalize();t1 = MPI_Wtime();printf("PI = %.15f\n", sum);
return 0;}

return 0;
sum = 0.0;
ndiv_local = ndiv / nprocs;

}

コンパイル
[tUVXYZ@obcx01 calc_pi_mpi]$ mpiicc pi_mpi.c –o pi_mpi.out

第138回講習会スーパーコンピューター超入門：実習編

47

プログラムの解説 Fortranpi.f90 [非並列版]

pi_mpi.f90 [並列版]program main

program main

implicit none

Use mpi
implicit none

integer i, ndiv
real(kind=8) unit, width, sum, x

do i=myrank*ndiv_local+1, (myrank+1)*ndiv_local
x = ( dble(i-1) + 0.5)*width
sum = sum + width * 4.0 / (1.0 + x*x)
end docall MPI_REDUCE(sum, total_sum, 1, MPI_REAL8,MPI_SUM, 0, MPI_COMM_WORLD, ierr)ndiv = 560000000
width = 1.0 / dble(ndiv)

integer ndiv, ierr, myrank, nprocs
integer ndiv_local, i;real(kind=8) unit, width, sum, x, total_sum
real(kind=8) t1, t2

print *, "width"
print '(F18.14)', widthndiv = 5600000000
width = 1.0 / dble(ndiv)

sum = 0.0d0
x = 0.0d0

call MPI_INIT(ierr)call MPI_COMM_RANK(MPI_COMM_WORLD,
myrank, ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD,
nprocs, ierr)

if (myrank .eq. 0) thenprint "('PI(MPI) = ', F18.16)", total_sum
print "('Number of cores utilized = ', i0)", nprocs
print "('Execution time = ', F12.8)", t2 - t1
endif

do i = 1, ndiv
x = ( dble(i-1) + 0.5) * width
sum += width * 4.0 / (1.0 + x*x)
end doprint *, "sum"print '(F18.14)', sum

t2 = MPI_Wtime()call MPI_FINALIZE(ierr)end program main

sum = 0.0d0
ndiv_local = ndiv / nprocs
t1 = MPI_Wtime()

end program main

コンパイル
[tUVXYZ@obcx01 calc_pi_fortran]$ mpiifort pi_mpi.f90 –o pi_mpi.out

第138回講習会スーパーコンピューター超入門：実習編

プログラムの解説 Python
pi.py [非並列版]

pi_mpi.py [並列版]program main
implicit none

from mpi4py import MPI
import numpy

integer i, ndiv
real(kind=8) unit, width, sum, xcomm = MPI.COMM_WORLD
myrank = comm.Get_rank();
nprocs = comm.Get_size();ndiv = 560000000
width = 1.0 / dble(ndiv)
print *, "width"
print '(F18.14)', width
sum = 0.0
x = 0.0
do i = 1, ndiv
x = ( dble(i-1) + 0.5) * width
sum = sum + width * 4.0 / (1.0 + x*x)
end doprint *, "sum"print '(F18.14)', sum

ndiv = 560000000
width = 1.0/ndiv
t1 = MPI.Wtime()
sum = numpy.zeros(1)total_sum = numpy.zeros(1)ndiv_local = ndiv // nprocs
for i in range (myrank*ndiv_local, (myrank+1)*ndiv_local):x = width * (i+0.5)
sum[0] = sum[0] + width * 4.0 / (1.0 + x*x)comm.Reduce([sum, MPI.DOUBLE], total_sum, op=MPI.SUM, root=0)
t2 = MPI.Wtime()

end program main
if comm.rank == 0:
print("PI(MPI) = ", total_sum[0])print("Number of cores utilized = ", nprocs)
print("Exectution time = ", t2 - t1, " (sec.)"48

第138回講習会スーパーコンピューター超入門：実習編

49

プログラムなど一式を自分の /work へコピー
[tUVXYZ@obcx01 ~]$ cd /work/gt00/tUVXYZ[tUVXYZ@obcx01 tUVXYZ]$ mkdir calc_pi_mpi[tUVXYZ@obcx01 tUVXYZ]$ cd calc_pi_mpi[tUVXYZ@obcx01 calc_pi_mpi]$ pwd/work/gt00/tUVXYZ/calc_pi

Fortran の方$ cp /work/gt00/share/z30122/pi_fortran_mpi/* .

C の方

アスタリスク = ワイルドカード「ここはなんでも良い」$ cp /work/gt00/share/z30122/pi_c_mpi/* .

Python の方$ cp /work/gt00/share/z30122/pi_python_mpi/* .

第138回講習会スーパーコンピューター超入門：実習編

50

並列プログラムのコンパイル
C および Fortran では プログラムをコンパイルします。
C の方[tUVXYZ@obcx01 calc_pi_mpi]$ mpiicc pi_mpi.c –o pi_mpi.out

Fortran の方[tUVXYZ@obcx01 calc_pi_mpi]$ mpiifort pi_mpi.f90 –o pi_mpi.out

第138回講習会スーパーコンピューター超入門：実習編

51

Python の方
事前に次の作業が必要です。
[tUVXYZ@obcx01 ~]$ cd /work/gt00/tUVXYZ/calc_pi_mpi[tUVXYZ@obcx01 calc_pi_mpi]$ emacs setenv.sh(or vim setenv.sh)
次のところを変更してください

export PYTHONUSERBASE=/work/gt00/tUVXYZ/.local⇩
自分のユーザー名に次にsetup.sh スクリプトを実行 （numpy, mpi4py をインストールします）[tUVXYZ@obcx01 ~]$ ./setup.sh

第138回講習会スーパーコンピューター超入門：実習編

52

並列プログラムのジョブスクリプト
性能が向上することを見ます。
様々な並列度のジョブスクリプトを用意しました。
[tUVXYZ@obcx01 calc_pi_mpi]$ pjsub run_n1c0001.sh- 1ノード, 1コア[tUVXYZ@obcx01 calc_pi_mpi]$ pjsub run_n1c0004.sh- 1ノード, 4コア[tUVXYZ@obcx01 calc_pi_mpi]$ pjsub run_n1c0028.sh- 1ノード, 28コア

[tUVXYZ@obcx01 calc_pi_mpi]$ pjsub run_n1c0056.sh- 1ノード, 56コア

[tUVXYZ@obcx01 calc_pi_mpi]$ pjsub run_n2c0112.sh- 2ノード, 112コア[tUVXYZ@obcx01 calc_pi_mpi]$ pjsub run_n4c0224.sh- 4ノード, 224コア[tUVXYZ@obcx01 calc_pi_mpi]$ pjsub run_n8c0448.sh- 8ノード, 448コア

第138回講習会スーパーコンピューター超入門：実習編

ジョブの実行状況の確認
自分の全てのジョブが終わるまで、待機します。
[tUVXYZ@obcx01 calc_pi_mpi]$ pjstat

ジョブが終了すると、出力ファイルが出ているはずです。
[tUVXYZ@obcx01 calc_pi_mpi]$ ls
pi_mpi.c
pi_mpi.out
result_n1c0001.txt
result_n1c0004.txt
result_n1c0028.txt
result_n1c0056.txt

result_n2c0112.txt
result_n4c0224.txt
result_n4c0448.txt
run_n1c0001.sh
run_n1c0004.sh
run_n1c0028.sh

run_n1c0056.sh
run_n2c0112.sh
run_n4c0224.sh
run_n8c0448.sh“result_n*c****.txt” が、結果を記載した出力ファイルです。

53

第138回講習会スーパーコンピューター超入門：実習編

54

結果を確認、実行時間を比較してみましょう
出力ファイルには実行時間の記載があります。
出力ファイルの冒頭部分を一斉に見てみましょう。
[tUVXYZ@obcx01 calc_pi_mpi]$ head result*.txt

並列化で実行時間が短縮されています。
=> result_n1c0001.txt <==PI(MPI) = 3.141592653590673301
Number of cores utilized = 1
Execution time = **.******** (sec.)==> result_n1c0056.txt <==PI(MPI) = 3.141592653589800221
Number of cores utilized = 56
Execution time = **.******** (sec.)==> result_n1c0004.txt <==PI(MPI) = 3.141592653589913464
Number of cores utilized = 4
Execution time = **.******** (sec.)==> result_n2c0112.txt <==PI(MPI) = 3.141592653589794892
Number of cores utilized = 112
Execution time = **.******** (sec.)==> result_n1c0028.txt <==PI(MPI) = 3.141592653589770912
Number of cores utilized = 28
Execution time = **.******** (sec.)==> result_n4c0224.txt <==PI(MPI) = 3.141592653589791340
Number of cores utilized = 224
Execution time = **.******** (sec.)

第138回講習会スーパーコンピューター超入門：実習編

55

最後に：計算結果のファイルを手元に転送する
WinSCP を起動してください第138回講習会スーパーコンピューター超入門：実習編

56

最後に：計算結果のファイルを手元に転送する接続サーバー情報を、ユーザー名 (tUVXYZ) とともに入力します
OBCXでは鍵認証ですので、パスワードは空欄のまま

tUVXYZ第138回講習会スーパーコンピューター超入門：実習編

57

最後に：計算結果のファイルを手元に転送する
SSH > 認証 秘密鍵を指定し、チェックボックスを確認

第138回講習会スーパーコンピューター超入門：実習編

58

最後に：計算結果のファイルを手元に転送する
目的のディレクトリに行くために、まず 「 / <ルート>」から出発

tUVXYZ第138回講習会スーパーコンピューター超入門：実習編

59

最後に：計算結果のファイルを手元に転送する
こんな画面になります

tUVXYZtUVXYZ