2012年7月3日
鴨志田 良和 (東京大学情報基盤センター)
kamo@cc.u-tokyo.ac.jp

第22回お試しアカウント付き並列プログラミング講習会

1} 使用可能なファイルシステム} バッチジョブの操作(上級編)} makeを使った分割コンパイル} makeを使った並列処理

第22回お試しアカウント付き並列プログラミング講習会

2} Oakleaf-FXにログインして効率的に作業を行えるようになることを目指し、◦ ファイルシステムやジョブの操作について学ぶ} 大規模なプログラムを作成する際に必須となる、

分割コンパイルの方法について学ぶ} makeを使用した並列処理の方法について学ぶ

第22回お試しアカウント付き並列プログラミング講習会

3第22回お試しアカウント付き並列プログラミング講習会

4} Oakleaf-FXで利用可能なファイルシステムは以下のとおりである
PATH

種類

共有/非共有/home/ログイン名

FEFS

共有

/group[1-3]/グループ名/
ログイン名(*)

FEFS

共有/mppx[bc]/ログイン名(*)

Lustre共有/work/ログイン名

FEFS

非共有

/tmp

NFS

非共有

(*) 負荷分散のため、ユーザ毎に/group[1-3], /mppx[bc] のいずれかを使用
第22回お試しアカウント付き並列プログラミング講習会

5} 他のノードから直接アクセスできない記憶域◦ Oakleaf-FXでは、計算ノードとインタラクティブノー
ドにはローカルディスクはない

ディスクと直接接続

第22回お試しアカウント付き並列プログラミング講習会

6} ネットワーク経由で複数クライアントからアクセス可能} 動的な負荷分散機能がない(サーバは1台)} Oakleaf-FXにおける設定◦ OS起動等のために、1ラック(96ノード)ごとに1台使用◦ /tmp (NFS領域) には書き込みを行わないことを推奨

ネットワーク経由で接続

第22回お試しアカウント付き並列プログラミング講習会

NFSサー
バ

7

} 複数のファイルサーバにデータおよびメタデータを分散配置} 1ファイルのデータを複数台のサーバに分散可能} フェイルオーバーにより、サーバ故障に対応可能
メタデータ
サーバ

オブジェクト
格納サーバ

オブジェクト格納サーバ
第22回お試しアカウント付き並列プログラミング講習会

8} 複数のファイルサーバにデータを分散可能◦ 多くのクライアントからアクセスする場合に効率がよい} 構成がNFSより複雑◦ NFSに比べると1クライアントからのアクセス性能は低い場合がある◦ ただし、1ファイルのデータを複数のサーバに分散させれば、1クライアントからのアクセス性能を上げることができる(lfs setstripeなど)

第22回お試しアカウント付き並列プログラミング講習会

9} Lustre◦ 大規模ファイル入出力、メタデータ操作の両方で高性能なファイルシステム◦ データの分散方法をファイルごとに指定可能(後述)} FEFS(Fujitsu Exabyte File System)◦ Lustre ファイルシステムをベースに富士通が開発
 Lustre との高い互換性◦ 数万規模のクライアントによるファイル利用を想定
 最大ファイルサイズ、最大ファイル数等の拡張

第22回お試しアカウント付き並列プログラミング講習会

10} 共有ファイルシステムは、個人、またはグループに対して利用可能容量の制限(quota)がある} 残り容量の確認コマンド (show̲quota)$ show_quota
Disk quotas for user t00004
Directory
used(MB)/home/t00004
194,229/group/gc26/t00004
0/group/gv52/t00004
101,520/group/gv56/t00004
0/mppxb/t00004
202
Disk quotas for group gc26 gv52 gv56
Directory
used(MB)/group/gc26
8,732,088/group/gv52
131,701/group/gv56
1,481,982
第22回お試しアカウント付き並列プログラミング講習会
	limit(MB)204,800-

nfiles338,682
90,915
221,398
034,153limit(MB)57,344,000
8,192,000
8,192,000

nfiles971,278
273,851
233,07911

} それぞれのファイルシステムでファイル展開コマ

ンドを実行せよ◦ 実行時間にどのような差があるか？
} 各ファイルシステムの残り容量を確かめよ

第22回お試しアカウント付き並列プログラミング講習会

12} /home/t00004/public に、この講習会で使用したプログラム、課題の解答などのファイルを置きました。ご利用ください。

第22回お試しアカウント付き並列プログラミング講習会

13◦ 複数のOST (Object Storage Target: 仮想的なディスク) で構成◦ 各OSTは1つのRAIDグループに対応
 共有: RAID6 (9D+2P) x 480、ローカル: RAID5 (4D+1P) x 600、外部 RAID6 (8D+2P) x 236◦ メタデータの格納先 (MDT: Metadata Target)は
RAID1
メタデータ
サーバ

オブジェクト格納サーバ

第22回お試しアカウント付き並列プログラミング講習会

14} データ配置の指定◦ ファイルのデータをひとつのOSTに配置するか、複数のOSTに分散して配置するかはユーザが指定できる◦ デフォルトではひとつのOSTに配置◦ lfs getstripe / lfs setstripeコマンドで参照・変更可能
ひとつのOSTに配置

OST1

OST2

OST3

第22回お試しアカウント付き並列プログラミング講習会

複数のOSTに配置

OST1

OST2

OST3
15

} lfs setstripe -s size -c count ファイル名◦ size 毎にcount 個のOSTに渡ってデータを分散配置する設定にした空のファイルを作成する(lustre̲stripeディレクトリに、ここで使用したスクリプトがあります)$ dd if=/dev/zero of=/mppxc/t00004/4G.dat bs=1M count=4096
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 35.6352 s, 121 MB/s
OST数が1の場合の書き込み性能$ rm /mppxc/t00004/4G.dat$ lfs setstripe -s 1M -c 50 /mppxc/t00004/4G.dat
ストライプ設定の変更(50個のOSTにデータを分散)$ dd if=/dev/zero of=/mppxc/t00004/4G.dat bs=1M count=4096
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 17.6508 s, 243 MB/s
OST数が50の場合の書き込み性能
第22回お試しアカウント付き並列プログラミング講習会

16} pjstat-s ジョブID◦ ジョブの、より詳しい状態を確認するコマンド◦ ジョブIDを指定しない場合は実行前・実行中の、自分のすべてのジョブが対象} pjstat-X ジョブID◦ 実行中のジョブのノード割り当て、ランク割り当てを確認するコマンド

第22回お試しアカウント付き並列プログラミング講習会

17

Oakleaf-FX scheduled stop time: 2012/06/29(Fri) 09:00:00(Remain: 2days 17:26:40)
JOB IDJOB NAMEJOB TYPEJOB MODELRETRY NUM
SUB JOB NUM
USER
PROJECTRESOURCE UNITRESOURCE GROUP
APRIORITYPRIORITYSHELLCOMMENTLAST STATESTATEPRM DATE...
MAIL ADDRESSSTEP DEPENDENCY EXP
STEP EXITING WAIT MODE
FILE MASKSTANDARD OUT FILE
STANDARD ERR FILE
INFORMATION FILEPJSUB DIRECTORY
FILE SYSTEM NAMEAPPLICATION NAMEACCEPT DATEQUEUED DATEEXIT DATELAST HOLD USER

: 288534: STDIN: INTERACT: NM: 0: : t00004: gt00: oakleaf-fx: interactive_n1
: 127
: 63
: /bin/bash
:
: RNA
: RUN
: 2012/06/26 15:33:07: t00004@oakleaf-fx-6:: 2: 0022: : : : /home/t00004/private/:: :submitted on oakleaf-fx-6: 2012/06/26 15:33:05: 2012/06/26 15:33:06: :第22回お試しアカウント付き並列プログラミング講習会

HOLD NUM
HOLD TIMEJOB START DATEJOB END DATEJOB DELETE DATE (REQUIRE)JOB DELETE DATESTAGE IN START DATESTAGE IN END DATESTAGE IN SIZESTAGE OUT START DATESTAGE OUT END DATESTAGE OUT SIZENODE NUM (REQUIRE)CPU NUM (REQUIRE)
ELAPSE TIME (LIMIT)MEMORY SIZE (LIMIT)DISK SIZE (LIMIT)...
NODE NUM (ALLOC)MEMORY SIZE (ALLOC)
CPU NUM (ALLOC)
ELAPSE TIME (USE)NODE NUM (UNUSED)NODE NUM (USE)NODE ID (USE)TOFU COORDINATE (USE)MAX MEMORY SIZE (USE)CPU NUM (USE)USER CPU TIME (USE)SYSTEM CPU TIME (USE)CPU TIME (TOTAL)DISK SIZEI/O SIZE
FILE I/O SIZEEXEC INST NUM
EXEC SIMD NUM
TOKEN

: 0
: 00:00:00 (0): 2012/06/26 15:33:07<: : : : : : 0.0 MB (0): : : 0.0 MB (0): 1: 8: 02:00:00 (7200) <DEFAULT>: 28672.0 MiB (30064771072): 240000.0 MB (240000000000): 1:1x1x1: 28672.0 MiB (30064771072): 16: 00:00:12 (12): 0
: 1
: 0x030F0006: (8,4,0): 0.0 MiB (0): 0: 0 ms: 0 ms: 0 ms: 0.0 MB (0): 0.0 MB (0): 0.0 MB (0)
: 0
: 0
: -

18

} 同一ノードには同一のNODEIDが表示される◦ 2ノード、8プロセスの場合の例$ pjstat -X
JOBID
288538RANK NODEID
0 0x010A0006
1 0x010A0006
2 0x010A0006
3 0x010A0006
4 0x02020006
5 0x02020006
6 0x02020006
7 0x02020006

第22回お試しアカウント付き並列プログラミング講習会

19} pjsub-L node=2,rscgrp=tutorial スクリ

プト名◦ tutorialリソースグループの2ノードを使用して実行◦ ジョブスクリプトに書いたものより、コマンドライン引数で指定したオプションのほうが優先される◦ 注意: 投入したスクリプトに記述された設定と実際のオプションが異なる場合がある◦ pjstatコマンドを使って確認すれば、正しい情報が得られる

第22回お試しアカウント付き並列プログラミング講習会

20

-L rscgrp=tutorial,node=1 コマンドを実行し、標準入力に env|sort; sleep 30を入力してCtrl-Dキーで終了} pjsub} pjstat-sで詳細情報を確認せよ} ジョブ終了後、STDIN.o??????に出力された内容を確認せよ◦ どのような環境変数が設定されているか◦ env を mpiexec env に変更すると、どのような環境変数が設定されるか

第22回お試しアカウント付き並列プログラミング講習会

21} 実行されたジョブのノード数を NODES 環境変数に、総プロセス数を PROCS 環境変数に設定するにはどうすればよいか?
◦ ヒント
 MPIプログラムを実行すれば上記の情報はわかる eval ̀echo x=1̀ を実行すると、シェル変数 x に 1 が設定される

第22回お試しアカウント付き並列プログラミング講習会

22第22回お試しアカウント付き並列プログラミング講習会

23} プログラムの分割コンパイル等を支援するソフト

ウェア} 変更があったファイルのみを再コンパイル} 大規模なプログラムを書くときに便利} 本質的にはワークフロー言語の実行エンジン} コンパイルに限らず、処理の依存関係を記述して、依存関係に従ってコマンドを実行できる◦ この講習会では GNU make (version 3.81)を使用する

第22回お試しアカウント付き並列プログラミング講習会

24} hello.c#include <stdio.h>
int main(int argc, char** argv) {printf("Hello, world!\n");return 0;}} Makeﬁlehello: hello.c
gcc -o hello hello.c◦ スペースでなくタブにする} 実行$ make hello
gcc -o hello hello.c

第22回お試しアカウント付き並列プログラミング講習会

もう一度makeを実行するとどうなるか？
$ make hello
make: `hello' is up to
date.
25

} ルールは、ターゲット、依存するファイル、コマンドで記述されるターゲット: 依存するファイル …
コマンド…
} makeの実行◦ make ターゲット◦ ターゲットを省略した場合は、Makeﬁleの最初のター
ゲットが指定されたものとして実行される

第22回お試しアカウント付き並列プログラミング講習会

26} 以下のいずれかが満たされる場合にコマンドを実行◦ ターゲットが存在しない◦ (ターゲットのタイムスタンプ )< (依存するいずれかのファイルのタイムスタンプ)} 依存するファイル X が存在しない場合、make

X

を先に実行
} コマンドを実行した後の終了ステータスが 0 以外の場合は続きの処理を実行しない

第22回お試しアカウント付き並列プログラミング講習会

27} hello.c} 実行#include <stdio.h>$ makevoid hello(void) {gcc -c hello.c
printf("Hello, world!\n");gcc -c main.c}
gcc -o hello hello.o main.o} main.cvoid hello(void);
int main(int argc, char** argv) { } hello.cを書き換え
hello();
例: world! を world!! にreturn 0;
書き換え}} Makeﬁlehello: hello.o main.ogcc -o hello hello.o main.o} makeを再実行
hello.o: hello.c
gcc -c hello.c$ makemain.o: main.c
gcc -c hello.c
gcc -c main.c
gcc -o hello hello.o main.o
第22回お試しアカウント付き並列プログラミング講習会

28

} 2回目のmakeで起きていたこと◦ main.oのコンパイルは、main.cに変更がなかったため行われなかった} Makeﬁleに依存関係を適切に記述することで、変更があった部分だけを再コンパイルすることができる

第22回お試しアカウント付き並列プログラミング講習会

29

module1.o: module1.c common.hgcc -o module1.o module1.c -cmodule2.o: module2.c common.hgcc -o module2.o module2.c -cmodule3.o: module3.c common.hgcc -o module3.o module3.c -ca.out: module1.o module2.o module3.o
gcc -o a.out module1.o module2.o module3.ocommon.hmodule1.c
module2.c
module3.c

第22回お試しアカウント付き並列プログラミング講習会

module1.omodule2.o

以下の場合に何が起きるか考えよ・module1.cが変更された場合
・module2.oが削除された場合
a.out

module3.o30} Makeﬁleの指定$ make -f test.mk} 長い行
hello: hello.o main.ogcc -g -Wall -O3 \-o hello hello.o main.o} PHONYターゲット.PHONY: clean
clean:(cleanというファイルがあっても実行する)
rm –f hello hello.o main.o} ディレクトリを移動してmake$ make –C hello2 target(cd hello2; make targetと同様)

第22回お試しアカウント付き並列プログラミング講習会

31} コマンドの前のタブを、スペースにした場合、どのようなエラーが出力されるかX があるときとない時で、make X の動作に違いがあることを確認せよ} .PHONY:

第22回お試しアカウント付き並列プログラミング講習会

32} 変数、関数の使用・特別なルールの書き方} Makeﬁleのより簡潔な記述} より柔軟な出力やエラー制御

第22回お試しアカウント付き並列プログラミング講習会

33} 代入方法
OBJECTS=main.o hello.o} 参照方法
hello: $(OBJECTS)${OBJECTS}でもよい$OBJECTSとすると、$(O)BJECTSと同じことになる} 再帰的な展開
CFLAGS=$(INCLUDES) -O -g
INCLUDES=-Idir1 -Idir2
CFLAGSは -Idir1 -Idir2 -O -gに展開される

第22回お試しアカウント付き並列プログラミング講習会

34} 実行しようとするコマンドを表示しない

test1:@echo Test message} コマンド終了時ステータスを無視する

test2:-rm file1 file2 file3

第22回お試しアカウント付き並列プログラミング講習会

35} コマンドの条件分岐
hello: $(OBJECTS)
ifeq ($(CC),gcc)$(CC) -o hello $(OBJECTS) $(LIBS_FOR_GCC)
else$(CC) -o hello $(OBJECTS) $(LIBS_FOR_OTHERCC)
endif} 変数代入の条件分岐
ifeq ($(CC),gcc)
LIBS=$(LIBS_FOR_GCC)
else
LIBS=$(LIBS_FOR_OTHERCC)
endif} 利用可能なディレクティブ◦ ifeq, ifneq, ifdef, ifndef
第22回お試しアカウント付き並列プログラミング講習会

36} 変数と似た参照方法で利用可能

VALUE=$(subst xx,yy,aaxxbb)

VALUEにaayybbが代入される

CONTENTS=$(shell cat data.txt) CONTENTSにはdata.txtの中身が代入される
SECOND=$(word 2, This is a pen) SECOND=isと同じ
CDR=$(wordlist 2,$(words $(LIST)), $(LIST))CDRには$LISTの2番目以降の単語のリストが代入される} 他の関数の例◦ dir, notdir: シェルのdirname, basenameに似た動作◦ suﬃx, basename: 拡張子とそれ以外の部分に分ける
 シェルのbasenameとは違う◦ wildcard: ワイルドカードを展開

第22回お試しアカウント付き並列プログラミング講習会

37} ターゲット名や依存ファイル名などに展開される

特殊な変数がある
$@
$<
$?
$+

ターゲット名最初の依存ファイルターゲットより新しい依存ファイル
すべての依存ファイル

hello: hello.o main.ogcc -o hello \hello.o main.o
hello.o: hello.c
gcc -c hello.c
main.o: main.c
gcc -c main.c
第22回お試しアカウント付き並列プログラミング講習会

CC=gccOBJECTS=hello.o main.o
hello: $(OBJECTS)$(CC) -o $@ $+hello.o: hello.c$(CC) -c $<main.o: main.c$(CC) -c $<38} 指定したパターンにマッチしたらコマンドを実行

する%.o : %.c$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@◦ ***.o は ***.c に依存する
hello: hello.o main.ogcc -o hello hello.o main.o
hello.o: hello.c
gcc -c hello.c
main.o: main.c
gcc -c main.c

第22回お試しアカウント付き並列プログラミング講習会

CC=gccOBJECTS=hello.o main.o
hello: $(OBJECTS)$(CC) -o $@ $+%.o: %.c$(CC) -c $<39

DATE1 = $(shell date)
DATE2 := $(shell date)
DATE3 = `date`} DATE1◦ 参照されるたびにdateが実行される◦ 実行されるタイミングは最初(アクションが実行される前)} DATE2◦ (参照されなくても)1度だけdateが実行される◦ 実行されるタイミングは最初} DATE3◦ 最初は̀datèという文字列が展開されるだけ◦ Dateが実行されるのは各アクションが実行されるとき
第22回お試しアカウント付き並列プログラミング講習会

40} 以下のルールDATE1をDATE2,DATE3に変更して実行せよ。2つechoの出力に違いはあるか？
test:echo $(DATE1)
sleep 1echo $(DATE1)} DATE1,DATE2は、一見すると出力が同じであるが、どうすれば動作の違いを説明できるか？
} DATE4:= `date`◦ はどれと同じ動作になるか

第22回お試しアカウント付き並列プログラミング講習会

41} wildcard関数を使用して以下の処理を行う

Makeﬁleを記述せよ◦ 入力データの中から、2009年8月と9月のデータだけを処理する} 入出力データの仕様◦ 入力ファイル名に日付が含まれている(YYYYMMDD.in)◦ 出力データは拡張子を.inから.outに変え、内容をコピーする

第22回お試しアカウント付き並列プログラミング講習会

42第22回お試しアカウント付き並列プログラミング講習会

43} makeは本質的にはワークフロー言語とその実行

エンジン◦ コンパイル以外にもいろいろなことができる} makeを使う上での便利な点◦ 実行するコマンドの依存関係を簡単に記述可能◦ 簡単な並列化
 依存関係の解析はmakeが自動的に行ってくれる◦ 耐故障性 途中で失敗しても、makeし直せば続きから実行してくれる

第22回お試しアカウント付き並列プログラミング講習会

44} make-j による並列化◦ 同時実行可能なコマンドを見つけて並列に実行◦ 依存関係の解析は make が自動的に行ってくれる

all: a b
a: a.c$(CC) a.c -o ab: b.c$(CC) b.c -o b

第22回お試しアカウント付き並列プログラミング講習会

同時
実行
可能

45

GNU
make

-j で指定した数まで同時に実行する

第22回お試しアカウント付き並列プログラミング講習会

sh

コマンド

sh

コマンド

sh

コマンド

sh

コマンド

sh

コマンド

sh

コマンド
46

} make-j 最大並列度◦ 最大並列度で指定した数まで同時にコマンドを実行する◦ 最大並列度の最大値は 4096 (RHEL6における制約)
 それ以上を指定すると 1 を指定したものとみなされる◦ 省略した場合、可能な限り同時にコマンドを実行する( )} make-j が正常に動作しない場合◦ Makeﬁleの書き方の問題
 暗黙の依存関係
 同名の一時ファイル◦ リソース不足
 使用メモリやプロセス数が多すぎる 最大並列度を適切に設定する必要がある

第22回お試しアカウント付き並列プログラミング講習会

47

} 逐次 make の実行順序に依存した Makeﬁle の記述をしてはいけない} 左のターゲットから順番に処理されることに依存した Makeﬁle:all: 1.out 2.out
1.out:
sleep 1; echo Hello > 1.out
2.out: 1.out
cat 1.out > 2.out} 本来は依存関係を明示する必要がある(wrong̲makeﬁles/wrong1.mak に、ここで使用した Makeﬁle があります)
第22回お試しアカウント付き並列プログラミング講習会

48

} 逐次 make 実行順序に依存する Makeﬁle の別な例} 同名の一時ファイルを使用すると、並列実行時に競合する
all: a b
a: a.c.gz
gzip -dc < a.c.gz > tmp.c$(CC) tmp.c -o ab: b.c.gz
gzip -dc < b.c.gz > tmp.c$(CC) tmp.c -o b

tmp.c
が競合

(wrong̲makeﬁles/wrong2.mak に、ここで使用した Makeﬁle があります)
第22回お試しアカウント付き並列プログラミング講習会

49} MakeﬁleFILE_IDS := $(shell seq 1 10)
FILES:= $(FILE_IDS:%=%.dat)
all: $(FILES)%.dat:
sleep 5touch $@◦ 変数や%を使わない場合どのようなMakeﬁleになるか◦ make と make -j の実行時間を比較せよ

第22回お試しアカウント付き並列プログラミング講習会

50} Oakleaf-FX の場合、1 ノードで使える CPU コ

ア数は 16 まで} 多数のノードを使用すれば、よりたくさんの処理を行うことが可能} GXP make を使用すると複数ノードで並列
make を実行可能◦ GXP make は並列シェル GXP と一緒に配布されているソフトウェア
◦ Make の処理を、マスターワーカー型の並列処理として複数ノードで実行可能◦ 各ノードでファイルが共有されていることが前提
第22回お試しアカウント付き並列プログラミング講習会

51} 並列分散環境を簡単に扱うための、並列版シェル◦ 多数のノードのインタラクティブな利用◦ 並列ワークフローの実行 (GXP make)} 詳しい情報

http://www.logos.t.u-tokyo.ac.jp/gxp
http://sourceforge.net/projects/gxp} ダウンロード方法$ cvs -d \:pserver:anonymous@gxp.cvs.sourceforge.net:/cvsroot/gxp \co gxp3} Oakleaf-FX 上のインストール先/t00004/public/gxp3
第22回お試しアカウント付き並列プログラミング講習会

52} 各計算ノードでデーモンプロセス(GXPD)を起動◦ ノード集合と、GXPD の起動方法を指定 (use) SSH, PBS, GridEngine 等が利用可能。拡張も可能◦ ノード集合を指定して、GXPD を起動 (explore)} e(execute) コマンドでユーザプロセスを起動◦ 全部または一部のノードを指定可能
SH

RSH
RSH

SSH
TORQUE
第22回お試しアカウント付き並列プログラミング講習会

RSH
RSH
53

#PJM-L node=4#PJM--mpi proc=4
NODES=ノード数

ノード数を取得
gxpc --root_target_name headgxpc rsh YYY XXX %target% %cmd%
gxpc use YYY head node
gxpc explore node[[1--$NODES]]

各ノードでGXPDを起動

gxpc cd `pwd`
gxpc e 'echo $GXPC_EXEC_IDX `hostname`'
gxpc quit

head node1

コマンドの実行XXX は、各ノードでプロセスを起動するためのrsh-likeなコマンド
第22回お試しアカウント付き並列プログラミング講習会

node2 node3
54} Oakleaf-FX では、プロセス起動に rsh 等を使用できないため、MPI プロセス経由で起動する
gxpc --root_target_name headgxpc rsh mpi_redirect redirect_client %target% %cmd%
gxpc use mpi_redirect head node←redirect̲serverをバッ
クグラウンドで起動
NODES=`redirect_client getsize`←ノード数を取得
mpiexec redirect_server &gxpc explore node[[1--$NODES]]

gxpc cd `pwd`
gxpc e 'echo $GXPC_EXEC_IDX `hostname`'
gxpc quit
redirect_client shutdown
wait
第22回お試しアカウント付き並列プログラミング講習会←redirect̲serverを終了
55

} 用意された、初期化からExploreするところまでを実行するスクリプト、終了処理を実行するスク
リプトを使用すれば、より簡単に記述可能#PJM -L node=4. /home/t00004/public/fx10_gxp/gxp_init.sh
gxpc cd `pwd`
gxpc e 'echo $GXPC_EXEC_IDX `hostname`'. /home/t00004/public/fx10_gxp/gxp_finalize.sh

第22回お試しアカウント付き並列プログラミング講習会

56} makeで実行される各コマンドをGXP経由で実行◦ -jオプションと組み合わせて、ノードにまたがって
makeを並列実行することができる◦ 各ノードでファイルが共有されている必要がある} gxpc make …

◦ … には、GNU makeに渡すことができるすべてのオプ
ションを渡すことができる} Oakleaf-FXでのGXP makeの実行◦ CPU数の自動取得に失敗するため、作業ディレクトリ上に以下の内容でgxp̲js.confというファイルを作成
cpu 16

第22回お試しアカウント付き並列プログラミング講習会

57

mksh

gxpc

コマンド

gxpc

コマンド

gxpc

コマンド

gxpc

コマンド

mksh

gxpc

コマンド

mksh

gxpc

コマンド

mksh
GNU
make

mksh
mksh

GXP
make

直接コマンドを実行せずス
ケジューラに登録するだけ
第22回お試しアカウント付き並列プログラミング講習会

xmak
e
スケ
ジュー
ラ

どのノードでコマンド 指定されたノードでコマンを実行するか決める
ドを実行する

58

#PJM-L node=4#PJM--mpi proc=4. /home/t00004/public/fx10_gxp/gxp_init.sh

GXPDの起動gxpc cd `pwd`
gxpc make -j 64

並列makeの実行. /home/t00004/public/fx10_gxp/gxp_finalize.sh

GXPDの終了

第22回お試しアカウント付き並列プログラミング講習会

59} 以下に述べる並列処理を実行せよ} 処理の内容◦ 複数の入力ファイルがある(in/inpXX-Y.dat)◦ 入力ファイルごとに、その内容に従って「処理」を行い、1つの出力ファイルを生成する(out/outXX-Y.dat)
 入力ファイルの内容により、処理時間は異なる◦ それぞれのタスクは独立で、並列実行可能} 以下のそれぞれの場合を実際に試して、実行時間の違いの理由を考えよ◦ 処理するファイルをプロセスごとに固定する場合(MPI)◦ マスターワーカー型の負荷分散を行う場合(GXP make)第22回お試しアカウント付き並列プログラミング講習会

60

0

0

50

100

経過時間(秒)
150

200

250

300

プロセス番号

10
20
30
40
50
60
第22回お試しアカウント付き並列プログラミング講習会

61

0

0

50

100

経過時間(秒)
150

200

250

300

プロセス番号

10
20
30
40
50
60
第22回お試しアカウント付き並列プログラミング講習会

62

0

0

50

100

経過時間(秒)
150

200

250

300

プロセス番号

10
20
30
40
50
60
第22回お試しアカウント付き並列プログラミング講習会

63} 容易にパラメタ並列処理を記述可能◦ GXPが提供する、パラメタ並列用のMakeﬁleを
includeする} 使用方法◦ parameters, target, output, cmd 変数を定義する◦ output, cmdは、:=ではなく=で値を定義する
 これをテンプレートとして何度も展開される◦ $(GXP̲MAKE̲PP)をinclude文で読み込む
 (GXPインストール先)/gxpmake/gxp̲make̲pp̲inc.mk

第22回お試しアカウント付き並列プログラミング講習会

64} 例1: (2 * 3 * 4=24個のタスクを並列実行)◦ 以下のMakeﬁleを書いて、gxpc make -j baz を実行する
parameters:=a b c
a:=1 2b:=3 4 5
c:=6 7 8 9target:=baz
output=hoge.$(a).$(b).$(c)cmd=expr $(a) + $(b) + $(c) > hoge.$(a).$(b).$(c)include $(GXP_MAKE_PP)} 例2: (課題8の処理)◦ 複数のパラメタ並列処理の組み合わせも可能

第22回お試しアカウント付き並列プログラミング講習会

65} MapReduceモデル◦ Googleが提案する、大規模データの並列処理に特化したプログラミングモデル◦ 1レコードに対する処理を書くと、処理系が大規模デー
タに並列適用◦ 入力データは、レコードの集合◦ プログラムは、以下の2つの処理を定義
 Map: レコード→(key, value)の集合
 Reduce: (key, value)の集合→出力
 異なるレコードに対するmap処理と、異なるkeyに対するreduce処理が並列実行可能

第22回お試しアカウント付き並列プログラミング講習会

66} GXP make上に構築されたMapReduce処理系◦ パラメタ並列と同様に、GXP が提供する Makeﬁle を
include するだけで利用可能◦ GXP が動く環境ならどこでも動く} カスタマイズが容易◦ Makeﬁle と、mapper, reducer などのいくつかの小さなスクリプトを書くだけ

第22回お試しアカウント付き並列プログラミング講習会

67} include $(GXP̲MAKE̲MAPRED)の前に、以下の変数を設定する◦ input=入力ファイル名◦ output=出力ファイル名◦ mapper=mapperコマンド(ex̲word̲count̲mapper)◦ reducer=reducerコマンド(ex̲count̲reducer)◦ n̲mappers=map ワーカ数(3)◦ n̲reducers=reduce ワーカ数(2)◦ int̲dir=中間ファイル用ディレクトリ名
 省略時は$(output)̲int̲dir◦ keep̲intermediates=yの時、中間ファイルを消さない◦ small̲step=yの時、細かいステップでの実行

第22回お試しアカウント付き並列プログラミング講習会

68} 例(word count)◦ Mapper: レコード→(単語1, 1),(単語2, 1),…
◦ Reducer: それぞれのkeyについてvalueの和を出力◦ 以下のMakeﬁleを書いて、gxpc make -j bar を実行
する
input:=foo
output:=bar
mapper:=ex_word_count_mapper
reducer:=ex_count_reducer
n_mappers:=5
n_reducers:=3
include $(GXP_MAKE_MAPRED)} 複数のMapReduceやパラメタ並列処理を組み合わせることも可能
第22回お試しアカウント付き並列プログラミング講習会

69} ファイルシステムやジョブ管理システム◦ Oakleaf-FXに固有の情報を活用することで、より効率的なシステムの利用が可能} make, Makeﬁle◦ make, Makeﬁleを利用することで、変更箇所だけを再作成する分割コンパイルが可能} 並列ワークフロー処理◦ make -jで並列にmake処理を実行可能◦ makeを拡張したGXP makeを利用することで、大規模な並列処理を実行可能

第22回お試しアカウント付き並列プログラミング講習会

70