逐次プログラムの半自動並列化

Download Report

Transcript 逐次プログラムの半自動並列化

逐次プログラムの
半自動並列化
電子情報工学科 4年
近山・田浦研究室
03-10396 早津 政和
背景・動機

並列処理の需要の高まり
 単一プロセッサの性能向上は伸び悩み
 並列システムは低コストで普及しつつある

並列プログラムの難しさ
 プログラム全体にわたる依存関係の把握が必要
 逐次プログラムより記述・デバッグが困難
逐次プログラムを効率よく並列化したい!!
従来の(完全)自動並列化

静的手法([Cytron, et al. 1989] など)
 ソースコードを解析
特定のパターンのプログラムしか並列化できない
コンパイル時に依存関係が判断できないものもある

動的手法([Chen, et al. 1994] など)
 実行履歴情報を解析
ループにしか適用できない
未知のコントロールフローや
動的に確保された変数には対応できない
アクセス履歴を用いた
並列性抽出手法



[Nguyen, et al. 2001 ]
動的手法を採用
特徴
 ループを末尾再帰に
⇒ ループを他と同じように扱える
 スタックを解析
⇒ 未知の制御フローにも対応
 メモリを全て監視
⇒ 動的に確保された変数に対応
半自動並列化
 結果が入力に依存するため、並列化候補を提示し、最後
にプログラマが判断する「半自動並列化」として用いる
半自動並列化手法の動作概要
1.実行時
アクセス
履歴取得
2.アクセス
ログ解析
3.並列化
候補抽出
逐次プログラム
foo();
foo(){
bar1() ;
… = Y;
bar2() ;
Z = …;
}
bar1(){
… = X;
X = …;
}
bar2(){
… = X;
}
並列化候補
//S0
//S1
//S2
並列化?
//S3 ○並列化!!
//S4
//S5
並列化?
//S6
S5
//S7
R(X)
逐次化情報
S0 S1
S1,S5
S2,READ
S4
X
S5 ⇒ S6
S0 S1 S6S0WRITE
X
S1 ⇒ S3
S0 S2
READ
S1
S2
S3
S0 S3
S7 READ
R(Y)
プログラマによる
S0
S4
WRITE
並列化の判断
S6
S7
W(X)
R(X)
Y
S4
X
W(Z)
Z
過去の実装
[Nguyen, et al. 2001 ]
Schemeを対象に実装
 再帰・ループなどを統一的かつ単純な枠組み
で並列化することに成功
 実行時間に比例した量の記憶域が必要
⇒小規模な実行しか扱えない
本研究の貢献

履歴解析コストの削減
 履歴解析を実行後から実行時に行うよう変更
 実行時解析に適したデータ構造に変更
 解析済で不要となった情報を捨てる

Schemeを対象として実装
解析コスト削減手法(1)

データ構造の変更
以前の手法では、
ログ形式で
書き出していた
スタック情報を
木構造で
保持する
S0 S1 S4
R(X)
S0 S1 S5
R(Y)
S0 S1 S6
S0
S0 S2
W(X)
S0 S3 S7
S3
S0 S3 S8
R(X)
W(Z)
W(Y)
解析コスト削減手法(2)

解析済みで不要な情報の削除
情報削減その2
同じオブジェクト
へのアクセスは
1つにまとめる
情報削減その1
解析済の部分木の
枝の部分を刈る
S0
S1
「S0→S1→S5でW(X)」
を記録しなくても、
「S0→S1でW(X)」を記録
していれば、S1⇒S2の
依存関係は導ける
S2
R(X)
W(X)
R(Y)
R(Y)
W(X)
S3
S4
S5
S6
S7
R(X)
R(Y)
W(X)
R(X)
W(Z)
実装

C/C++言語で並列性抽出システムを作成
 Schemeインタプリタ部(C言語・5000行)
 履歴解析部(C++言語・1000行)

実験環境

CPU: IntelPentiumⅢ 1.13GHz,
メモリ: 1024MB, OS: WindowsXP
N-Queen, Quick Sort, Matrix Multiply に対し、
▽並列性抽出
▽コスト(使用記憶域量・実行時間)比較
並列性抽出の例
(Quick Sort)
;; quick : v — sort したい配列 left, right — sort する範囲
(define (quick v left right)
(if (>= left right) v
(let ( (new-left
(new-left left)
left)
(new-right right)
(new-right
right)
(pivot (vector-ref
(pivot
(vector-ref vv (floor
(floor (/(/ (+(+ left
leftright)
right)2))))
2))))) )
(do () ((> new-left new-right))
(do () ((>= (vector-ref
(vector-ref vv new-left)
new-left) pivot))
pivot))
並列化候補
(set! new-left
new-left (+
(+ new-left
new-left 1)))
1)))
( 0R-05-01, 0R-05-02, 0R-05-03 )
(do () ((<= (vector-ref
(vector-ref vv new-right)
new-right)pivot))
pivot))
( 0R-0e-01, 0R-0e-02 )
(set! new-right
new-right(-(- new-right
new-right1)))
1)))
( 0R-0t-02, 0R-0t-03 )
(if (<= new-left new-right)
( 0R-0w-01, 0R-0w-02 )
(begin
(swap v new-left new-right)
(set! new-left
new-left (+(+new-left
new-left 1))1))
新しく分割された
(set! new-right
new-right(-( -new-right
new-right1))
1))))))))
2つの範囲での
(begin (quick
(quick vv left
left new-right)
new-right)
(quick vv new-left
(quick
new-left right)
right)))))
))))
再帰呼び出しを
(quick #(4 5 3 1 4 0 5 6 ) 0 7)
並列化!!!
解析時使用記憶域量の比較 (Quick Sort)
記 憶 域 量 (レ コ ー ド 数) [x10 3 ]
1000000
100000
過去の実装
木構造導入
木構造+不要情報削減
10000
1000
100
10
1
0.1
1
10
100
1000
10000
問題サイズ
実行時間の比較 (Quick Sort)
実 行 時 間 [s]
100
木構造+不要情報削減
逐次実行のみ
10
1
1
10
100
1000
10000
0.1
0.01
問題サイズ
実行時間の比較 (N-Queen)
1000
実 行 時 間 [s]
100
木構造+不要情報削減
逐次実行のみ
10
N
1
0
0.1
0.01
2
4
6
8
10
まとめと今後の課題

まとめ
アクセス履歴解析コストを削減
 記憶域使用量は過去の実装の1/100~1/4000
 実行時間は単純実行の5倍~180倍

今後の課題
 Garbage
Collector の導入
▽記憶域削減 ▽不要情報削除の回数削減
 C言語への対応