230 likes | 350 Views
Supercompilers for Parallel and Vector Computers. 2003/4/22 近山・田浦研究室 修士1年 早津 政和. 概要. イントロ 前提知識 依存関係の定義 依存関係の定式化 依存関係テスト. フロー(正)依存. 逆依存. 出力依 存. Introduction(1). 逐次プログラムの意味を保ちつつ順序制約を緩める⇒依存関係 依存関係の種類 ex) S1: A=1.0 S2: B=A+3.14 S3: A=(C-D)/3 S4: A=(B*3.8)/2.718.
E N D
Supercompilers for Parallel and Vector Computers 2003/4/22 近山・田浦研究室 修士1年 早津 政和
概要 • イントロ • 前提知識 • 依存関係の定義 • 依存関係の定式化 • 依存関係テスト
フロー(正)依存 逆依存 出力依存 Introduction(1) • 逐次プログラムの意味を保ちつつ順序制約を緩める⇒依存関係 • 依存関係の種類 ex) S1: A=1.0 S2: B=A+3.14 S3: A=(C-D)/3 S4: A=(B*3.8)/2.718
Introduction(2) • 配列を用いたループの並列化 • 「配列のアクセス」だけでは不十分 • (ループの範囲内での)配列の添字の解析が必要 • diophantine equation • 依存関係テスト • 完全テスト(分離テスト) • 近似テスト(GCDテスト、Banerjeeテスト) • 一般的なテストアルゴリズム
概要 • イントロ • 前提知識 • 依存関係の定義 • 依存関係の定式化 • 依存関係テスト
Iteration vector • Iteration vector ループのインデックス (i, j, k) を iteration vector iとする • 辞書的順序 (i, j, k) < (i’, j’, k’) ⇔ i<i’ or (i=i’ and j<j’) or (i=i’ and j=j’ and k<k’)
Execution order • maximum common loop maximum common loop index: m \i := i(1:m) • 実行順序 S(i)≪S’(i’) ⇔ (\i<\i’) or (\i=\i’ and S bef S’) ※S bef S’: テキスト上で S が S’より先に出てくる
概要 • イントロ • 前提知識 • 依存関係の定義 • 依存関係の定式化 • 依存関係テスト
Data dependence • ループ中の文 S, S’にデータ依存があるか ⇔ S(i),S’(i’)が同じ変数にアクセス(少なくとも一方が書込み)している組 (i,i’) が存在するか • DEF, USE • DEF(S):={v∈VARX: Sはvを定義} • USE(S):={v∈VARX: Sはvを使用} ※VARXはプログラム中の変数 ここでは変数の名前と実態が 一意に決まるとしているが、 Cなど変数のaliasingがある言語の場合は、 もっと複雑な解析が必要。
Definition of data dependence • S(i)δS’(i’) ⇔ • (DEP1) S(i)≪S’(i’) • (DEP2) ∃v∈VARX: {v∈DEF(S(i)) and v∈USE(S’(I’))} or {v∈USE(S(i)) and v∈DEF(S’(I’))} or {v∈DEF(S(i)) and v∈DEF(S’(I’))} • (DEP3) 次のような SI がない: S(i)≪ SI ≪ S’(i’) and v∈DEF(SI) 正依存 逆依存 出力依存
概要 • イントロ • 前提知識 • 依存関係の定義 • 依存関係の定式化 • 依存関係テスト • 完全テスト(分離テスト) • 近似テスト(GCDテスト、Banerjeeテスト) • 一般的なテストアルゴリズム
問題設定 • (DEP-1)で≪を扱うのは難しいため、direction vector(後述) で抽象化して扱う • (DEP-3)でSIの存在を無視する 保守的に依存問題の解を求める、というアプローチ • 要するに、 f(i)=f’(i’) となる i, i’は存在するか という問題になる ※A[f(i)] ∈DEF(S), A[f’(i’)] ∈USE(S’) or DEF(S’)
Distance vector & Direction vector • Distance vector μ = dist(i, i’):= \i’- \i • Direction vector Θ = dir(i, i’):= {‘<‘, ‘=‘, ‘>’, ‘*’} ‘<‘, if μj>0 Θj= ‘=‘, if μj=0 ‘>’, if μj<0 計算量を減らす以外の こいつの存在意義 って何だろう? m
問題設定 • 問題設定 • 添字表現はループ変数の線形式に制限し、 • ループの境界で決まる解の範囲と、与えられたdirection vector Θ の下で依存関係式の解が存在するかを調べる • 線形条件 f(I)=a0+∑ajIj f’(I’)=b0+∑bjI’j
Dependence system • Dependence systemは、dependence equation(DEQ), region(REG), constraint(CST) から成る • (DEQ) (a0+∑ajij )-(b0+∑bji’j)=0 • (REG) ij∈[Tj:Uj] i’j∈[T’j:U’j] • (CST) ijΘji’j • 解の範囲(REG)内で、変数制限(CST)の下、方程式(DEQ)を解くという問題に帰着
Linear diophantine equation • DEQは線形ディオファンタス方程式※ ∑ajxj =c ...(☆) の形をしている ※方程式の係数が整数であるような不定方程式の、整数解だけを求めるものはディオファンタス方程式と呼ばれる • 解の存在の判断基準 • gcd(a1,… ,an) | c のとき、かつそのときに限り、☆は解を持つ • 左辺の係数の最大公約数が右辺の約数になっているか?
Linear diophantine equation • 線形ディオファンタス方程式の一般解 線形ディオファンタス方程式: ax+by=c, g:=gcd(a,b)|c, g=au+bv (u, v は整数) とすると すべての解の集合(xt, yt) は以下のように与えられる xt = uc/g + tb/g yt = vc/g - ta/g 要するにこいつをループの 制限の下で求めればよいが、 実際の計算量はでかいので どうしよう、という流れ
概要 • イントロ • 前提知識 • 依存関係の定義 • 依存関係の定式化 • 依存関係テスト
Dependence testing • 分離テスト • 依存関係の必要十分条件となっている • GCDテスト • DEQの解の存在を与える • 依存関係の必要条件となっている • Banerjeeテスト • DEQのREG内のCST下の実数解の存在を与える • 依存関係の必要条件となっている
separability test • Separability condition (SEP) ∃k∈[1:m]:∀j∈[1:n]:j≠k⇒aj=0 and ∀j∈[1:n’]:j≠k⇒bj=0 ※要するに同じ変数がたかだか1つしか現れない • 完全テスト • 解が存在しない ⇒依存なし • 解が存在する ⇒依存あり 変数1つだけにしか 用いれないのは何故? 頑張れば 高次もいけない?
gcd test & Banerjee test • GCDテスト • DEQの解の存在を与える • 依存関係の必要条件となっている • 解が存在しない ⇒依存がない • 解が存在する ⇒解の範囲に収まっているかは分からない • Banerjeeテスト • DEQのREG内のCST下の実数解の存在を与える • 依存関係の必要条件となっている • 解が存在しない ⇒依存がない • 解が存在する ⇒整数解かは分からない
A general algorithm for dependence testing • 別紙参照 • プログラム中に q 個の文があったとすると、 O(q ) の文の組についてアルゴリズムを適用せねばならず、最悪 p*3 (p:文の組の数)回の依存テストをしなければならない 2 m 一般的に、並列化の粒度を上げるため 一番外側から数段のループの並列化を考える。 その中の文の間の依存関係を見るため、 qは減る。それでも計算量多くなったら諦める。