210 likes | 484 Views
Dependence Testing. 2004 年 6 月 4 日 吉田仁. 発表の流れ. 用語解説 Single-Subscript Dependence Test ZIV SIV 複数のループの依存関係 MIV Banerjee 方程式 Testing in Coupled Groups. 用語解説 (1). Nonlinearity 全ての Subscript が a 1 i 1 + a 2 i 2 + ・・・ + a n i n + e (Dependence Equation) で表わされる → Linear
E N D
Dependence Testing 2004年6月4日 吉田仁
発表の流れ • 用語解説 • Single-Subscript Dependence Test • ZIV • SIV • 複数のループの依存関係 • MIV • Banerjee 方程式 • Testing in Coupled Groups
用語解説(1) • Nonlinearity 全てのSubscriptが a1i1+a2i2+・・・+anin+e (Dependence Equation) で表わされる → Linear 表わされない →Nonlinear 依存関係がプログラムに依存するのでNonlinearのDependence Testは行わない
ZIV SIV MIV 用語解説(2) • Conservative Testing • Dependence equationに解が無いことを示す • ⇔Exact Testing…解がある時、依存関係を求める • Complexity • 1組のSubscriptsの中にループ変数が • 無い → ZIV (Zero Induction Variable) • 1種類 → SIV (Single Induction Variable) • 2種類以上 → MIV (Multiple Induction Variable) Ex.) A(5,i+1,j)= A(N,i,k) + C
用語解説(3) • Direction Vector WriteとReadのどちらが先に行われるかを表わす。 • <:Write → Read • =:Write と Read が同時 • >:Read → Write • Distance Vector Direction Vector で表わした関係が具体的にどのくらいの距離だけ離れているかを表わす。 • <: 0 < distance • =: 0 = distance • >: 0 > distance
Index の分離 • 1つのループ変数が複数のIndexに現れるかどうかで分けて処理をする • Separable 1つの変数が1箇所のIndexにしか現れない →どれか1変数(1Index)でも独立と示されれば全体も独立 • Coupled Group 同じ変数が現れる複数のIndexの組み合わせ(後述)
ZIV • Subscriptが1次元の時の依存関係を考える。 • SubscriptがZIV(ループ変数を含まない)の場合 Subscript が等しいかどうかを確認するだけで良い。 ex) A(100) = A(50); Independent A(85) = A(85); Dependent
SIV(1) • SIVの場合 • Strong SIV Subscript の場合 Subscriptの形は <ai+c1, ai’+c2> なので、i = i’ + dとすると ai+c1 = ai’+c2 d = i - i’ = (c1-c2)/a |d| ≦U–Land dが整数 の場合、依存がある。 • 一般にdはU–Lの倍数なので、最初/最後だけ別にすれば並列化可能な場合が多い。 f(i) d c1 g(i) c2 i L U
SIV(2) • Weak-Zero-SIV の場合 a2=0より <a1i+c1,c2> i = (c1-c2)/a1 で交差するから、 L≦i≦Uの場合は依存 • 前半と後半に分ければそれぞれで並列化可能 • 一般にc1-c2 =Lor Uなので前半か後半が無い場合が多い。 f(i) c2 c1 i
SIV(3) • Weak-Crossing SIV の場合 <ai+c1, -ai’+c2> i = (c1-c2)/2a で交差するから iが整数か整数+1/2 L≦i≦U の場合、依存がある。 • 依存がある場合は前半と後半を分ければそれぞれで並列化可能。 c2 g(i) f(i) c1 i
Exact SIV Test SIV Subscript が <a1i+a0, b1i+b0> ならば、依存関係があるのは不定方程式 a1x - b1y = b0 - a0 が整数解を持つとき。また、この方程式が整数解を持つ条件は GCD(a1, b1) | b0 – a0 で、その具体的な整数解は拡張ユークリッドの互除法を用いて求めることができる。 • 本当に依存するかどうかは変数の範囲などを調べなければならない。
複数のループの依存関係(1) • 2重のループで、内側のループの幅が外側のループ変数に依存している場合を考える DO I = 1, N DO J = L0 + L1 * I, U0 + U1 * I S1 A(J+D) = A(J) + B END DO END DO どこかで依存関係があるならば |d| ≦ U0-L0+(U1-L1)I ⇔I ≧ {|d|-(U0-L0)} / (U1-L1) 発想を逆転させると I< {|d|-(U0-L0)} / (U1-L1) の時はJのループをベクトル化できる
複数のループの依存関係(2) • Weak-Zero型 DO I = 1, N DO J = L0 + L1 * I, U0 + U1 * I S1 A(c) = A(J) + B END DO END DO • どこかで依存関係があるならば • L0+L1I ≦c ≦ U0+U1I⇔ (c-U0) / U1 ≦I ≦(c-L0) / L1 • なので、それ以外の場合はJのループをベクトル化できる。 • どちらかの分母が0であれば、そちら側の閾は無いと考える。
複数のループの依存関係(3) • a1は非負とする • a1とa2が同符号の場合 依存が起こるのは a1i - a2j = c2 - c1 iやjの範囲を考えると a1L1-a2U2≦c2-c1≦a1U1-a2L2 • 異符号の場合 a1L1-a2L2≦c2-c1≦a1U1-a2U2 • L1=L2, U1=U2とすると、1つのループの依存テストにも適用できる DO I = L1, U1 S1 A(a1*I+c1) = … END DO DO J = L2, U2 S2 … = A(a2*J+c2) END DO DO I = N+1, 2*N S1 A(I+N) = A(I) + B END DO N+1-2N ≦ 0–N ≦ 2N-(N+1) 1–N ≦ -N ≦ N-1
Breaking Conditions • L≦Nならベクトル化可能だが、コンパイル時に判定できない。 DO I = 1, L S1 A(I+N) = A(I) + B END DO Why? → ユーザーがLを決めるかもしれないから。 それなら勝手に分岐を作っちゃえ。 IF (L<=N) THEN A(N+1:N+L) = A(1:L) + B ELSE DO I = 1, L S1 A(I+N) = A(I) + B END DO END IF
MIV SIVと同様に考えると <a0+a1x1+…+anxn, b0+b1y1+…+bnyn> a1x1-b1y1+…+anxn-bnyn = b0-a0 という不定方程式を解くことになる。 ただし、整数解を求めるのは難しいので、xi, yiを実数の範囲で扱う。 この式が実数解を持つ必要十分条件は GCD(a1,…,an,b1,…,bn) | b0 – a0 • Banerjee Inequalityを用いて判定する
Separable Coupled Testing in Coupled Groups • これまではSeparableなIndexについてのお話 • 次にNon-Separable、つまりCoupled Groupsについてのお話。 • Coupled Groupsとは? 同じループ変数が現れる複数のIndexの組 Ex) A(I,J+1,K) = A(I, J, J) + C Ex) A(I+J,J+1,K,K) = A(I,J+K,J,K) + C 全部Coupled
Delta Test (1) procedure Delta_test (subscripts, DV set, dV) 制約ベクトル C = <無条件>; while (未チェックのSIVがある) do begin 未チェックのSIV全てにSIV Testを適用させ, 独立なら return 独立 依存なら 新しい制約ベクトル C’を作る C’← C ∩ C’ if C’=φ then return 独立 if C ≠ C’then begin C = C’; CをMIVに適用してZIVやSIVにする。 ZIV Testを適用し、独立なら return 独立 end end (次ページへ続く)
Delta Test (2) while (∃未チェックのRDIVがある) do RDIV Testを行い、その制限を適用させる。 残りのMIVについてチェックし、 その結果となるDirection VectorをCと合わせる CからDV set と dV を作る。 end Delta_test
Delta Test 実例(1) Ex) A(I+1,I+2) = A(I,I) + C (Iはループ変数) <I+1,I> <I+2,I> <I+1,I> → I+1 = I’で依存 → C’= {I+1=I’} <I+2,I> → I+2 = I’で依存 → C’={I+2=I’ ∩I+1=I’} = φ C’= C∩C’ = φ C = φ より return 独立
Delta Test 実例(2) Ex) A(J-I,I+1,J+K) = A(J-I,I,J+K) (I,J,Kはループ変数) <J-I,J-I> <I+1,I> <J+K,J+K> <I+1,I> → I+1 = I’で依存 → C’= {I+1=I’,∀J,∀K} C’= C∩C’ = {I+1=I’,∀J,∀K} C≠C’より C = C’= {I+1=I’,∀J,∀K} <J-I,J-I>にCを適用 → <J+1,J> <J+1,J> → J+1 = J’で依存 → C’={∀I,J+1=J’,∀K} C’= C∩C’ = {I+1=I’,J+1=J’,∀K} C≠C’より C = C’= {I+1=I’,J+1=J’,∀K} <J+K,J+K>にCを適用 → <K,K+1> <K,K+1> → K = K’+1 で依存 → C’={∀I,∀J,K=K’+1} C’= C∩C’ = {I+1=I’,J+1=J’,K=K’+1} C≠C’より C = C’= {I+1=I’,J+1=J’,K=K’+1} 出力に移る → dV = (1, 1, -1) DVset = (<,<,>)