1 / 42

コンパイラ・インフラストラクチャにおける静的単一代入形式最適化部の実現

コンパイラ・インフラストラクチャにおける静的単一代入形式最適化部の実現. 佐々政孝  福岡岳穂  滝本宗宏 (東工大) (ソニー CE ) (理科大). 背景. 静的単一代入形式( SSA 形式) データフロー解析や最適化を見通しよく行える SSA 形式最適化の研究基盤として使える適当なコンパイラがほとんど存在しなかった (SUIF もほとんど扱わない ) SSA 形式に基づく変換と最適化をコンパイラ・インフラストラクチャ COINS に組み込 む SSA 形式への変換 と 逆変換 SSA 形式上の 種々の最適化と 有用な変換. 設 計と実装の方針.

yardley
Download Presentation

コンパイラ・インフラストラクチャにおける静的単一代入形式最適化部の実現

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. コンパイラ・インフラストラクチャにおける静的単一代入形式最適化部の実現コンパイラ・インフラストラクチャにおける静的単一代入形式最適化部の実現 佐々政孝  福岡岳穂  滝本宗宏 (東工大) (ソニーCE) (理科大)

  2. 背景 • 静的単一代入形式(SSA形式) • データフロー解析や最適化を見通しよく行える • SSA形式最適化の研究基盤として使える適当なコンパイラがほとんど存在しなかった(SUIFもほとんど扱わない) • SSA形式に基づく変換と最適化をコンパイラ・インフラストラクチャCOINSに組み込む • SSA形式への変換と逆変換 • SSA形式上の種々の最適化と有用な変換

  3. 設計と実装の方針   コンパイラ・インフラストラクチャでは研究目的だけではない考察と決断が必要:方針を立てる,既知のものと研究とのバランス,... • 複数のアルゴリズムが知られているもの→ 比較検討の上,採用するアルゴリズムを決定 • 共通インフラストラクチャとして → 基本的な最適化を含める,研究基盤として活用できる例示として → オリジナルな最適化も含める • アルゴリズムの比較評価のため → アルゴリズムのヴァリエーションをオプションで指定できる • SSA形式の分野で問題として示唆されてはいるが実際にどう解決するかが示されていない種々の点→ それぞれ一つの解決法を示す • 教育・研究基盤としての参照実装→ 詳しい仕様書を提供,読解性・保守性のよいコーディング

  4. 2 準備

  5. Java プログラム 新言語 プログラム C プログラム Fortran プログラム C O I NSコンパイラ ・インフラ C プログラム C 言語解析 Java 言語解析 Fortran 言語解析 新言語 解析 HIR→C 高水準中間表現(HIR) C プログラム ループ並列化 SMP並列化 基本最適化 HIR→LIR LIR→C 低水準中間表現(LIR) SSA最適化 SIMD並列化 命令選択 レジスタ割付け 命令スケジュール コード生成 SPARC マシン記述 SPARC x86 x86 ARM ARM MIPS MIPS SH-4 SH-4 Power PC Power PC コード 合計23万行

  6. SSA形式(静的単一代入形式) a1 = x0 + y0 a2 = a1 + 3 b1 = x0 + y0 a = x + y a = a + 3 b = x + y (b) SSA形式 (a) 通常形式 SSA形式:各変数の定義が字面上一つ.

  7. SSA形式  φ関数 L1 a = 1 L2 a = 2 L1 a1 = 1 L2 a2 = 2 L3 a3 =f(a1:L1,a2:L2) … = a3 … = a L3 (a) 通常形式 (b) SSA形式

  8. 4 SSA最適化部

  9. 静的単一代入(SSA)形式最適化部の構成 SSA最適化部 基盤部 ソース プログラム LIR->SSA変換 (3種類のヴァリエーション) 言語 解析 SSA最適化  コピー伝播  条件付定数伝播  共通部分式除去  質問伝播大域値番号付  無用コード除去  ループ不変計算移動  帰納変数の最適化  ... 高水準中間表現(HIR) HIR to LIR SSA形式LIR のCFG & 最適化されたSSA形式LIR のCFG 低水準中間表現(LIR) の制御フローグラフ(CFG) (通常形式LIR) SSA形式上の有用な変換  危険辺の分割 3番地コードへ変換  基本ブロック結合 コード 生成 SSA->LIR逆変換 2種類 (1つは3種類のヴァリエーション) + 合併(2種類) Javaで 約15,000行 目的 コード HIRでのSSA最適化プロトタイプも作成して検討した結果,LIRレベルで行うこととした

  10. SSA形式への変換 900  設計方針にしたがい,2つの有力なアルゴリズムをプロトタイプで比較し,Cytron法(支配辺境を用いる)を採用. 800 700 600 変換時間 (milli sec) 500 Cytron Sreedhar 400 300 200 100 0 0 1000 2000 3000 4000 通常プログラムの制御フローグラフのノード数

  11. SSA形式から通常形式への逆変換 • 主なアルゴリズム • Briggsらの方法 • Sreedharらの方法 • 設計方針にしたがい,これらを比較検討したところ,合併を行っても,SSA逆変換の際に挿入されるコピー文の数などからSreedharらの方法に優位性があると認められた.→ 既存のコンパイラでは採用が稀であったが,Sreedharらの方法を推奨として採用した. • Sreedharらの3つのヴァリエーションを実装(実はのちにBriggsらの方法も実装) • 2種類の合併も実装(これらもみなオプションで指定できる)

  12. その後この方針の妥当性が実証された Briggs法+合併とSreedhar法による目的コードの実行時間の相対比.Sreedhar法による目的コードの実行時間の方が短い.[伊藤2005]

  13. SSA最適化 (1)基本的な最適化 (設計方針により,共通インフラストラクチャとして基本的な最適化を含める) • コピー伝播 • 条件分岐を考慮した定数畳み込みと定数伝播 • 支配関係に基づく共通部分式除去 • 無用コード除去 • 無用φ関数除去 • 空の基本ブロック除去 • ループ不変計算のループ外移動 • ループの帰納変数に関わる演算の強さの軽減と判定の置き換え (これらは任意の回数,順序で適用できる) • この他,変換として,危険辺の分割,前処理として,ループ構造の変換(while型ループをif-do-while型ループへ),など.

  14. 最適化の例 条件分岐を考慮した定数畳み込みと伝播 i = 1; j = 1; k = 0; while (k < 100) { if (j < 20) { j = i; k = k + 1; } else { j = k; k = k + 2; } } printf("%d¥n",j); k = 0; while (k < 100) { k = k + 1; } printf("%d¥n",1); (本当はSSA形式) ‘j’ が常に 1であることが解析できる whileの中の if-elseや黒字の部分が除去される

  15. SSA最適化 (2)高度最適化 • 大域的再結合(global reassociation) • メモリ全体を一つの塊とみなす素朴な別名解析 • 効率的な質問伝播を用いた大域的値番号付けによる部分冗長性除去(後者2つはこのSSA最適化部が研究基盤になることの例示として新たに考案した最適化を組み込んだ)

  16. メモリ全体を一つの塊とみなす素朴な別名解析メモリ全体を一つの塊とみなす素朴な別名解析 • COINSのLIRでは別名の情報は得られない.そこで,別名が生じる可能性のある変数については安全のためメモリに置いたままにしていた. • このような変数についても,メモリへの書き込みがない間はこの変数の別名に変更はない,とみなす解析. if (t = a[j], t < min) { min = t; k = j; } if (a[j] < min) { min = a[j]; k = j; } 共通部分式 除去で効果

  17. 5 実装に当たっての問題点  の解決

  18. 実装に当たって解決すべき点がいろいろある  (既発表のアルゴリズムの誤り,問題として議論されている点) Briggs のSSA 逆変換アルゴリズムの修正 Sreedhar のSSA逆変換アルゴリズムの誤りの訂正と実装上の注意の指摘 積極的な最適化をどこまで許すかの決定 最適化アルゴリズムでのφ関数の適切な取扱い→それぞれ一つの解決を与え,仕様書に詳しく記述

  19. 積極的な最適化をどこまで許すかの決定 最終出力に 影響なし ... if(true) もともとは 出なかった出力 ? print(1) print(1) 無限ループ 積極的な最適化(Appel) 積極的な無用コード除去を行いつつ,ループから出るための条件分岐 「if (true)」を「明らかに生きているコード」とする.これにより,無限ループはそのまま保たれる.

  20. 最適化でのφ関数の適切な取扱い無用コード除去の危うい例最適化でのφ関数の適切な取扱い無用コード除去の危うい例 ... if(...) ... if(...) B B ? P P x3 =f(x1:P,x2:B) x3 =f(x1:P,x2:B) 最適化前 1),18),19)の既存アルゴリズム(誤) 本実現では既存アルゴリズムを改訂し,Φ関数の引数と関連付けられているブロックが制御依存する条件分岐文を除去しないようにした.これにより,右図への変換は行われない. (Φ関数は制御フローとデータフローを含んでいる)

  21. 最適化が保守的すぎないか?No, 無用コード除去の望ましい例を実現 ... if(...) ... if(...) ... B P x2 =f(x1:P,x1:B) x2 =x1 x2 =x1 最適化前 無用Φ関数除去 無用コード除去

  22. 6 評価 • 性能の評価 • インフラストラクチャとしての評価

  23. 多数のオプション・フラグによる評価→ SSA最適化部のお勧め決定 SPEC CPU2000. SUN Fire V440 (UltraSPARC III, 1GHz*4, メモリ8GB).単位はsec. ssa1 ssa2 ssa3 ssa4 -------------------------------------------------------------------- 164.gzip 3.97 4.02 4.03 3.97 175.vpr 5.84 5.82 5.85 5.88 181.mcf 0.812 0.738 0.826 0.736 197.parser 6.73 6.77 6.82 6.72 254.gap 2.32 2.31 2.47 2.45 256.bzip2 26.6 26.3 26.6 26.3 300.twolf 0.623 0.622 0.645 0.623 171.swim 2.50 3.04 3.06 2.50 172.mgrid 108 123 123 107 173.applu 1.19 1.37 1.45 1.21 177.mesa 5.28 5.28 5.36 5.46 179.art 17.0 16.7 16.9 16.2 183.equake 3.13 3.32 3.17 3.34 188.ammp 24.0 22.4 22.6 23.4 -------------------------------------------------------------------- ssa1: prun/divex/cse/cstp/dce/hli/osr/hli/cpyp/cstp/cse/cpyp/cstp/dce/ebe/srd3 ssa2: prun/divex/cpyp/cse/cstp/dce/hli/cstp/osr/cse/cstp/cse/dce/cbb/ebe/srd3 ssa3: prun/gra/divex/cpyp/cse/cstp/dce/hli/cstp/osr/cse/cstp/cse/dce/cbb/ebe/srd3 ssa4: prun/divex/cse/cstp/hli/osr/hli/cstp/cse/dce/srd3 SSA最適化のお勧め:ssa4を-O2オプションとして採用 最適化のパスを増やせばよいという訳ではない.キャッシュやパイプラインの影響も大.

  24. 評価 - SSA最適化のみの性能(SPEC CPU2000) SUN Blade 1000 (UltraSPARC III, 750MHz*2, メモリ1GB).実行時間の単位は秒. coins-noopt: COINS 基盤部最適化オプションなし ssa-O2-no-memory-analysis: ssa-opt=prun/divex/cse/cstp/hli/osr/hli/cstp/cse/dce/srd3, ssa-no-memory-analysis で指定されるSSA 最適化を行ったもの ssa-O2: ssa-opt=prun/divex/cse/cstp/hli/osr/hli/cstp/cse/dce/srd3 ssa-preqp1: ssa-opt=prun/divex/cse/cstp/hli/osr/hli/cstp/preqp/dce/srd3 ssa-preqp: ssa-opt=prun/divex/cse/cstp/hli/osr/hli/cstp/cpyp/preqp/cstp/rpe/dce/srd3 gcc-O2: gcc -O2 またはg77 -O2

  25. 評価 - SSA最適化のみの性能(SPEC CPU2000)目的コードの実行時間の相対比 (COINS最適化オプションなし=1)

  26. 評価 - SSA最適化のみの性能(SPEC CPU2000)目的コードの実行時間の相対比(COINS最適化オプションなし=1) 「メモリ全体を一つの塊とみなす素朴な別名解析」の効果が見て取れる. ■ssa-O2-no-memory-analysis 対 ■ssa-O2 で 2%から12%程度の性能向上.

  27. 評価 - SSA最適化のみの性能 考察 • 前図は他の最適化を適用せずにSSA最適化のみを適用した結果 • SSA最適化単体での結果はgccの-O2オプションの結果に全体としては及ばない(ある意味で当然) • その理由として • gccの目的コードではレジスタ・プロモーションや命令スケジューリングがなされているが,これはSSA最適化だけでは処理できない • SSA形式では配列SSAなど,スカラーでない変数の最適化が確立されていない • COINSの全最適化をONにして比べたい所であるが • COINSではHIR上の最適化や別名解析,レジスタ・プロモーションや命令スケジューリングも行われているが,みな試験実装の段階にありSPEC ベンチマークの結果を得られない • 今後さらに検討する予定

  28. 参考 レジスタ・プロモーションや命令スケジューリングを行うとCOINSの性能は十分(小規模プログラム)参考 レジスタ・プロモーションや命令スケジューリングを行うとCOINSの性能は十分(小規模プログラム) ■「ssa+S+R」=ssa-O2 +命令スケジューリング+大域変数のレジスタ・プロモーション ■「ssa+S+R」では全体的に■gcc の-O2 オプションより優れた性能

  29. 評価 - インフラとしての評価 • SSA最適化部の実装に当たっての問題点の解決 • (前述) • 教育・研究への適用 • COINSを用いたコンパイラの集中講義(2004年7月)このときに用いたSSAの豊富な例題と使用法はウェブページで公開 • 効率的な質問伝播を用いた部分冗長性除去 (前述).もともとはCOINSの外のユーザ.のちに本システムに組み込んだ. • その他,当該研究室の大学院生による研究も多い

  30. 7 関連研究 コンパイラ・インフラストラクチャを中心に • SUIFとMachine SUIF • Scale • gcc

  31. SUIFとMachine SUIF • SUIF • コンパイラ・インフラストラクチャの中で最もよく知られ,研究用に広く使われた. • SSA 形式についてはほとんど扱っていない. • National Compiler Infrastructureの終了に伴い,もはや保守されていない. • Machine SUIF • 一連のバックエンドの処理機構を備え,ターゲットにあまり依存しない解析と最適化ができる,という特徴がある. SUIFとともに用いる. • SSA 形式の最適化については無用コード除去があるだけである. • リリースも2002年以後は出ていない.

  32. Scale • 新しい高性能アーキテクチャの研究のためのコンパイラ・インフラストラクチャ. • SPEC ベンチマークのC プログラムからSPARC機械語への変換で,オブジェクトコードの実行性能はgcc とほぼ同等から1.7 倍(の遅さ). • SSA 最適化として,疎な条件分岐を考慮した定数伝播,部分冗長性除去,コピー伝播,値番号付け,ループ不変コード移動,インライン化,ループ展開,を実装. • SSA 形式最適化については,COINS との類似性がある. • ただし,COINS の特徴である,SMP 計算機用並列化やSIMD 命令を用いる命令レベル並列化などの並列化機能や,マシン記述によるリターゲット機能はない.

  33. gcc • gcc-4.0.0に含まれたTree SSA はSSA形式最適化モジュールで,最適化として,無用コード除去,条件分岐を考慮した定数伝播,部分冗長性除去,支配木ベースの最適化(定数伝播,コピー伝播,冗長性除去),集合体のスカラー置換,無用ストアの除去,など. • この最適化の内容は,COINSのSSA最適化部に重なるものも多い. • しかしgcc については,ソースが大きく複雑で手を入れにくい, C言語で書かれているのでバグ取りが難しくメモリ管理に誤りが入りやすい,RTL をファイルに書いて処理して再入力する手段がない,などの弱点. • これに対して,COINSは,Javaで記述されており,メモリ割り当ての誤りがほとんどなくバグ取りがしやすい,ソースの大きさが手頃である,LIR をファイルに書いて処理して再入力することができる,などの利点.

  34. 8 まとめ • 教育,研究用基盤を目指したコンパイラ・インフラストラクチャにおけるSSA形式最適化の実現について述べた. • 設計方針を立てて実施したことは,目標の実現に大きく寄与した. • SSA形式への変換と逆変換については,比較評価して良い方法を採用した. • SSA形式最適化の実装に当たっては,種々の解決すべき問題があったが,それぞれに一つの解決を与え,詳しいドキュメントとして残した. • 基本的なSSA形式最適化をほとんど実装してある. • アルゴリズムの比較評価のために種々のヴァリエーションを指定できる. • 参照実装として用いることができるように,読解性,保守性のよいコーディングを心がけ,詳しい仕様書を提供した.

  35. 今後の課題 • COINSの最適化の効果がgcc等にまだ及ばない点を検討し,他の最適化と連携しつつSSA最適化の改良を施す. • 仕様書の英文化もほぼなされているので,海外への情報発信に努める.

  36. x =… = x y =… z =… x =… = x y =… z =… = y = y = z x1=… = x1 y1=… z1=… x2=… = x2 y2=… z2=… x1=… = x1 y1=… z1=… x2=… = x2 y2=… z2=… x1=… = x1 y1=… z1=… x2=… = x2 y2=… z2=… = y1 = y2 = y1 = y2 = y1 = y2 x3= (x1,x2) y3= (y1,y2) z3= (z1,z2) = z3 y3= (y1,y2) z3= (z1,z2) = z3 z3= (z1,z2) = z3 設計方針にしたがい,最小,半ば刈り込んだ,刈り込んだSSA形式のいずれへも変換できる Normal form Semi-pruned SSA form Pruned SSA form Minimal SSA form

  37. アクセス方法 COINSプロジェクトURL http://www.coins-project.org/ からSSA最適化のページへ  概要 SSA最適化の例 SSA形式とは SSA最適化の詳しいスライド  集中講義資料(デモ)   仕様書  論文発表資料

  38. 評価 - インフラとしての評価 • SSA 最適化部の実装に当たっての問題点の解決 • SSA 変換・逆変換アルゴリズムの注意点の指摘と誤りの訂正 • 積極的な最適化をどこまで許すかの決定 • 最適化アルゴリズムでのΦ関数の適切な取扱い • これらをドキュメントとして残した • 教育・研究への適用 • COINSを用いたコンパイラの集中講義(2004年7月)このときに用いたSSAの豊富な例題と使用法はウェブページで公開 • 効率的な質問伝播を用いた部分冗長性除去 (前述).もともとはCOINSの外のユーザ.のちに本システムに組み込んだ. • その他,当該研究室の大学院生による研究も多い

  39. SUIFとMachine SUIF • SUIF • コンパイラ・インフラストラクチャの中で最もよく知られ,研究用に広く使われた. • 最適化と並列化を協調させたコンパイラの研究を支援し,特徴として,オブジェクト指向言語を扱う中間表現がある,解析用インフラが整っている,別名解析がある,手続き間の配列解析や並列化解析がある,など • 入力言語は,Fortran,C,C++,Java,出力は,C 言語,およびMachine SUIF を経由してAlpha とx86 の機械語 • SSA 形式についてはほとんど扱っていない. • National Compiler Infrastructureの終了に伴い,もはや保守されていない. • Machine SUIF • 一連のバックエンドの処理機構を備え,ターゲットにあまり依存しない解析と最適化ができる,という特徴がある. SUIFとともに用いる. • SSA 形式の最適化については無用コード除去があるだけである. • リリースも2002年以後は出ていない.

  40. Scale • 新しい高性能アーキテクチャの研究のためのコンパイラ・インフラストラクチャ. • 入力言語は,Fortran,C,Java.出力は,C言語,AlphaとSPARCのアセンブリ. • 別名解析,配列の依存テスト,ループ変換,SSA最適化,スカラー最適化. • SPEC ベンチマークのC プログラムからSPARC機械語への変換で,オブジェクトコードの実行性能はgcc とほぼ同等から1.7 倍(の遅さ). • SSA 最適化として,疎な条件分岐を考慮した定数伝播,部分冗長性除去,コピー伝播,値番号付け,ループ不変コード移動,インライン化,ループ展開,を実装. • Scale は,以前はC言語への変換しか実現していなかったが,現在では,アセンブリ言語も生成しており,Java で記述されていること,SSA 形式最適化を含んでいること,などCOINS との類似性がある. • ただし,COINS の特徴である,SMP 計算機用並列化やSIMD 命令を用いる命令レベル並列化などの並列化機能や,マシン記述によるリターゲット機能はない.

  41. gcc • 数年来Tree SSAと呼ばれるSSA形式最適化の試みがされていたが,Tree SSAのブランチは本体にマージされ,gcc-4.0.0にも含まれた. • Tree SSA は木構造を用いたSSA形式最適化モジュールで,最適化として,無用コード除去,条件分岐を考慮した定数伝播,部分冗長性除去,支配木ベースの最適化(定数伝播,コピー伝播,冗長性除去など),集合体のスカラー置換,無用ストアの除去,などを含んでいる. • この最適化の内容は,COINSのSSA最適化部に重なるものも多い. • しかしgcc については,ソースが大きく複雑で手を入れにくい, C言語で書かれているのでバグ取りが難しくメモリ管理に誤りが入りやすい,RTL をファイルに書いて処理して再入力する手段がない,などの弱点が指摘されている. • これに対して,COINSのSSA最適化部は,Javaで記述されており,メモリ割り当ての誤りがほとんどなくバグ取りがしやすい,ソースの大きさが手頃である,LIR をファイルに書いて処理して再入力することができる,などの利点がある.

More Related