• 検索結果がありません。

writeln(c);

ドキュメント内 プログラム解析の効率化に関する研究 (ページ 41-55)

?

?

?

依存キャッシュスライシング

データ依存関係に着目した準動的スライシン グ手法

制御依存関係

構文解析で容易に解析可能

⇒ 静的に解析

データ依存関係

静的に正確な解析は困難

⇒ 簡単なキャッシュを用い、動的に解析

依存キャッシュスライスの計算

1.

実行前解析

:

節点と制御依存辺のみからなる

PDG

のサブセット

PDG DS

を構築。変数に

キャッシュを用意

2.

実行時解析

:

変数が定義されれば、キャッ シュに文を設定。変数が参照されれば、

キャッシュに保持されている文からデータ依 存辺を追加

3.

実行後解析

:

なし

4.

スライス計算

: PDG DS

の辺を辿りスライスを抽

アルゴリズムの概要

1.

静的制御依存関係解析

PDG

の部分グラフ

PDG DS

を静的に生成する.

まず,静的スライシングで利用する

PDG

と同様,文または制御文に対応 する節点を用意する.そして,文間に制御依存関係が存在すれば,対応す る節点間に制御依存辺を引く.ただし,

PDG DS

にデータ依存辺は加えな い.

2.

動的データ依存関係解析

対象プログラムをある入力データで実行する.

実行の際,次節で示すデータ依存関係抽出アルゴリズムに基き,動的な データ依存関係を計算し,

PDG DS

にデータ依存辺を追加する.プログラ ム実行が終了した時点で,

PDG DS

の完成となる.

3. PDG DS

によるスライス計算

PDG DS

を用いて,静的スライシングと同様の方法でスライス計算を行う.

例えば,スライシング基準

(s c , v)

に関する依存キャッシュを抽出する場合

,まず,

s c

に対応する節点から制御依存辺および

v

に関するデータ依存辺 を逆向きに辿ることで到達可能な節点集合を導出する.そして,この節点 集合に対応する文が求めるスライスとなる.

動的データ依存関係抽出アルゴリズム

入力

PDG BL :

部分的に生成されブロック化された

PDG P:

対象プログラム

I: P

への入力

作業変数

P

中の各変数

v

に対する依存キャッシュ

C(v)

出力

OUT:

入力

I

に対するプログラム

P

の実行の出力

PDG BL :

完成した

PDG

アルゴリズム本体

1. P

中の各静的変数

v

に対し

, C(v) := Φ 2. P

が停止するまで以下を繰り返し実行する

{ P

を入力

I

で最初から停止するまで文ごとに実行

}

a) I

に関して,

P

の次の一文

s

を実行

b) s

で使用

(

参照

)

される各変数

u

について,

C(u) ≠Φ

かつ,データ依存辺

C(u) u s

が存在しなければ

PDG BL

C(u) u s

を追加する.

c) s

で定義される各変数

w

について,

C(w) := s

a[0] a[1] b c s1

s1 s2

s1 s2 s3

データ依存関係収集

1: a[0]:=0;

2: a[1]:=3;

3: readln(b);

4: a[b]:=2;

5: c:=a[0]+4;

6: writeln(c);

2: a[1]:=3;

3: readln(b);

4: a[b]:=2;

5: c:=a[0]+4;

6: writeln(c);

1: a[0]:=0;

Input: b=0

b a[0]

c

キャッシュ内容

s4 s2 s3

s4 s2 s3 s5

s4 s2 s3 s5

a[0] a[1] b c s1

s1 s2

s1 s2 s3

データ依存関係収集 (2)

1: a[0]:=0;

2: a[1]:=3;

3: readln(b);

4: a[b]:=2;

5: c:=a[0]+4;

6: writeln(c);

2: a[1]:=3;

3: readln(b);

4: a[b]:=2;

5: c:=a[0]+4;

6: writeln(c);

1: a[0]:=0;

Input: b=1

b a[0]

c

キャッシュ内容

s1 s4 s3

s1 s4 s3 s5

依存キャッシュスライスの特長

簡単なキャッシュを用いることで、動的な データ依存関係を収集

⇒ 効率的かつ効果的なスライス

既存環境にキャッシュおよび

DD

辺構築機能 を追加することで実装可能

⇒ 実装が容易

実験

3つのプログラム

P1:

カレンダー

P2

:酒屋問題

P3

:酒屋問題(拡張版)

について、

静的スライス

コールマークスライス 依存キャッシュスライス 動的スライス

を計算

実験結果~スライスサイズ

21

182 187

17

162 166

15 16

61

5 5 8

0 20 40 60 80 100 120 140 160 180 200

P1 P2 P3

static call-mark

dependence-cache dynamic

静的 >

CM >> DC >

動的

P2 ・ P3

では配列変数を使用しているため顕著

47 43

4700

47 43

4731

51 174 45

4540

206464 4834

0 1000 2000 3000 4000 5000 6000

P1 P2 P3

static call-mark

dependence-cache dynamic

実験結果~実行時解析時間

時間

(ms)

静的 ≒

CM DC ≒ <<

動的

DC

は僅かな実行時オーバヘッド増加で解析可能

まとめ

準動的手法を用いたスライシング手法 「依 存キャッシュスライシング」 を提案

スライスサイズは静的スライシングより小さ く、動的スライシングより大きい

僅かな実行時オーバヘッドで、配列・ポイン タ等を正確に解析可能

むすび

まとめ

プログラム中の文間の依存関係解析に関して,解析を効 率化するための手法を提案した.

プログラムに変更が加えられた際の再解析を効率化し,インタ ラクティブなデバッグ作業を実現するプログラム依存グラフの 効率的な更新手法

静的解析情報と動的解析情報を組み合わせた準動的解析手法を 用いることにより,現実的な実行時オーバヘッドで高精度のプ ログラムスライスを抽出できる依存キャッシュスライシング手

提案手法についてそれぞれの有効性を確認

デバッグ作業の効率化、ソフトウェア開発の生産性向上

ドキュメント内 プログラム解析の効率化に関する研究 (ページ 41-55)

関連したドキュメント