310 likes | 432 Views
Global Optimization by Suppression of Partial Redundancies について. 野崎 晋也. 部分冗長性除去 (PRE) とは. PRE:Partial Redundancy Elimination プログラム内において不要な部分を取り除く 最初に提案したのは E. Morel and C. Renviose
E N D
Global Optimizationby Suppression ofPartial Redundanciesについて 野崎 晋也
部分冗長性除去(PRE)とは • PRE:Partial Redundancy Elimination • プログラム内において不要な部分を取り除く • 最初に提案したのはE. Morel and C. Renviose • Global Optimizationby Suppression ofPartial RedundanciesCommunications of the ACM, 22(2):96--103, February 1979
概要 • 冗長な計算の除去と、不変な計算のループ外への移動は別に行われる事が多い • 2回実行される部分の削除によって、上記2つを一度にやり、最外ループへ移動 • プログラムの形に関係なくコストはほぼ線形
Local Properties(1) • ブロックi内のあるexpression(式)に対して • Transparency:TRANSP • ブロックi内のコマンドの実行によって、その式のオペランドに修正がなければその式は“transparent” ・・・ y=c+d x=a+b z=e ・・・ 青の式の オペランドに対する 変更文がない
・・・ a=c z=e ・・・ x=a+b Local Properties(2) • ブロックi内のあるexpression(式)に対して • Local Availability:COMP • ブロックi内に最低1つ式の計算があり、その式の最後の計算より後に出てくるコマンドがオペランドを修正しなければ“locally available” ・・・ a=c x=a+b z=e ・・・
x=a+b ・・・ z=e a=c ・・・ Local Properties(3) • ブロックi内のexpression(式)に対して • Local Anticipability:ANTLOC • ブロックi内に最低1つ式の計算があり、その式の最初の計算より前に出てくるコマンドがオペランドを修正しなければ“locally anticipated” ・・・ z=e x=a+b a=c ・・・
Global Properties(1) Availability=上安全(up-safe) • Iの入口挿入点で上安全であるのは、Iのすべての先行ブロックが、出口計算を持つか出口挿入点で上安全である場合 • ※開始ノードでは上安全ではない • Iの出口挿入点で上安全であるのは、Iに変更文がなく、かつ、Iに入り口計算があるかIの入口挿入点で上安全である場合
上安全の例 • プログラムの入口からIに達するどの道にも同じ値を与える計算がある場合 x=a+b x=a+b I
Global Properties(2) Anticipability=下安全(downsafe) • Iの入口挿入点で下安全であるのは、Iに入口計算があるか、Iの出口挿入点で下安全かつIに変更文がない場合 • Iの出口挿入点で下安全であるのは、Iに出口計算があるか、Iのすべての後続ブロックの入口挿入点で下安全である場合 • ※後続ブロックがない場合は、後続ブロックは下安全ではないと考える
下安全の例 • Iからプログラムの出口へのどの道へも同じ値を与える計算がある(変更文を通らずにその計算に達する) I x=a+b x=a+b
Global Utilization of Partial Redundancy Elimination • The steps of the algorithm are as follows: • (a)Resolution of the Boolean systems for availability , anticipability , and partial availability. • 上安全、下安全、そして部分的に上安全である場所の決定
Global Utilization of Partial Redundancy Elimination • The steps of the algorithm are as follows: • (b)Determination of predecessors of the blocks containing the partial redundancies and where a new computation may be introduced. This involves the computation of the Boolean properties PPIN and PPOUT (Placement Possible on Entry and Placement Possible on Exit). • 部分冗長を含み、新しい計算を挿入できる先行ノードの決定
Determination of PPIN and PPOUT • PPINの決定の為の各block iのCONSTi • CONSTi : • 各blockのPPIN/PPOUT
Global Utilization of Partial Redundancy Elimination • The steps of the algorithm are as follows: • (c)Determination of a subset of these blocks on exit of which a computation must be inserted. These blocks satisfy the Boolean property INSERT. • プログラム中の各block iのINSERTi
Global Utilization of Partial Redundancy Elimination • The steps of the algorithm are as follows: • (d)Insertion of new computations at the exit of the blocks satisfying INSERT = TRUE and suppression of the partially redundant computations which are now redundant. • その後、INSERT=TRUEを満たす部分に新たな計算を挿入 • を満たすものは部分冗長から冗長に→除去可能
Local Boolean Properties.ANTLOC is TRUE for nodes 6,7,8,9; FALSE elsewhere.COMP is TRUE for nodes 6,7,8,9; FALSE elsewhere.TRANSP is FALSE for node 4; TRUE elsewhere. Global Boolean Properties(obtained by resolution of Boolean Systems).ANTIN is FALSE for nodes 1,2,4; TRUE elsewhere.AVOUT is TRUE for nodes 6,7,8,9; FALSE elsewhere.PAVIN is FALSE for node 1; TRUE elsewhere. Value of PPIN and PPOUT (obtained by resolution of Boolean Systems). PPIN is FALSE for nodes 1,2,3,4; TRUE elsewhere. PPOUT is FALSE for nodes 1,2,8,9; TRUE elsewhere. Computation of INSERT. INSERT is TRUE for nodes 3,4; FALSE elsewhere. Insertion and Suppression of Computations.ANLOC . PPIN is TRUE for nodes 6,7,8,9;FALSE elsewhere. a a+b a a+b a+b a+b a+b a+b
Lazy Code Motion M2 小川健一
従来の PRE 技術 • PREのアルゴリズムはデータフロー方程式を分析する • データは前向きの流れと、後向きの流れ、両方向分析が主流 →しかし最もよい手法でもO(n^2) • 1979年ビットベクトルアルゴリズムが生み出される(Morel等) →単方向分析に変化 →計算量がO(n log n)に
PREのアルゴリズムのひとつ • Code Motion →不必要な再計算を避け効率のよい改良を行う技術 予備変数を利用し、出来るだけ前で計算 (Busyな手法) 問題点 ・過剰なレジスタプレッシャーを引き起こす →予備変数を長時間保持してしまう 解決策 ・lazyな方法を用いる(安全かつ適当なところで計算)
Busy Code Motionの特徴 • 単方向分析 →計算量はO(n log n) • コードの安全性の保ちながら改良 →2つの集合(D-safe,Earliest)を求めてコード移動を • 出来るだけ前で計算を行う ○→冗長な計算の多くを削除できる ×→レジスタを長く占有する可能性がある →不必要なコード移動の存在
Code Motion (Busy) の具体例 1 1 h=x+y 2 2 a=x+y a=h 3 3 4 a=x+y 5 4 a=h 5 a=x+y a=h 6 6 7 7 ブロック1から7まで変数h,x,yがレジスタを占有
Lazy Code Motionの特徴 • 単方向分析 →計算量はO(n log n) • コードの安全性の保ちながら改良 →4つの集合(D-safe,Earliest,Latest,Isolated) を求めてコード移動を • 可能な限り遅く計算を行う ○→レジスタプレッシャーの軽減 →不必要なコードを除去できる ×→正確な除去が出来ない
Code Motion (Lazy) の具体例 1 1 a=x+y a=x+y 2 3 3 2 4 a=x+y 5 4 h=x+y a=h 5 h=x+y a=x+y a=h 6 6 7 7 レジスタ占有時間を減らすことに成功
Code Motion Algorithm 0.危険辺の除去 1.vを変数、tを計算式、G(N,E,s,e)をフローグラフとする 2.Used、Transp を求める 3.D-Safe、Earliestを求める(busyなら4、Lazyなら5へ) 4.コードの変形を行う → Busy 5.Delayを求める 6.Isolated、Latestを求める 7.OCP、ROを求めコードの変形を行う → Lazy
安全なポイントをさがすために • 危険辺(Critical Edge)の除去 a=x+y h=x+y a=h 1 2 1 2 h=x+y 4 3 b=x+y b=h 3
Used Transp の計算 • 両値ともにTかFで表現されるため、ノード1つに必要な情報量は1ビット • Used:対象式tがノードNに含まれていればTrue • Transp:透過性の意、対象式がx+yの時にノードN にxやyへの代入文が含まれていないとTrue Used(n,t´) = t´ ∈ SubTerms(t) Transp(n,t´) = v ∈ Var(t´)
The Busy Code Motion Transformation • 対象計算式 t のために新たな変数 h を作成 • D-Safe と Earliest を満たすノード全ての入口部分に h = t を挿入 • 全ての対象計算式 t を h で置換する
The Lazy Code Motion Transformation • 対象計算式 t のために新たな変数 h を作成 • OCPを満たすノード全ての入り口部分に h = tを挿入 • ROを満たすノード全てに計算式 t を h で置換 OCP = { n|Latest(n)∧¬ Isolated(n) } RO = { n|Used(n)∧¬(Latest(n)∧Isolated(n)) } OCP ( optional computation point ) RO ( redundant occurrence )