6.4 コード最適化 (1)コード最適化(code optimization)

Slides:



Advertisements
Similar presentations
C言語によるプログラミングスタイル 制御システム工学科 山北 昌毅.
Advertisements

言語処理系(1) 金子敬一.
コンパイラ 第13回 最適化 38号館4階N-411 内線5459
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
コンパイラ 2011年10月17日
プログラミング言語としてのR 情報知能学科 白井 英俊.
情報基礎実習I (第7回) 木曜4・5限 担当:北川 晃.
言語処理系(4) 金子敬一.
12.3,E,-15, 12.3,E5,+,=, >,<,…,
VBA H106077 寺沢友宏.
地理情報システム論 第3回 コンピュータシステムおける データ表現(1)
コンパイラ演習 第 8 回 (2011/12/01) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
Semantics with Applications
プログラムの動作を理解するための技術として
情報基礎A 第14週プログラミング 実際のデータ処理での応用(2)
4.2 連立非線形方程式 (1)繰返し法による方法
言語処理系(9) 金子敬一.
第11講: 平成18年12月 8日 (金) 4限 E352教室 グラフ (1).
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
6.4 離散的コサイン変換 (DCT : discrete cosine transform ) (1)DCTとは
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
コンパイラ 2012年10月15日
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
スクリプト言語を用いたPHITSの連続実行
テキストボックス、チェックボックス×2、コマンドボタンを配置する。 コマンドボタンに機能を与える
大域的データフロー解析 流れグラフ 開始ブロック 基本ブロックをnodeとし、 基本ブロック間の制御関係をedgeとするグラフを、
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
二分探索木によるサーチ.
静的情報と動的情報を用いた プログラムスライス計算法
言語プロセッサ 第7回目 平成27年11月16日.
本時の目標 「簡単なプログラム言語の意味を理解し、マクロ機能を使って簡単なプログラムを作ることができる。」
勉強会その3    2016/5/1 10 8分35秒 データの表現 演算.
動的依存グラフの3-gramを用いた 実行トレースの比較手法
帰納変数 iが基本帰納変数 変数iに対して、 i := i±c という形の代入が一つのみ jがiに対する帰納変数
最適化の方法 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第11章.
電気・機械・情報概論 VBAプログラミング 第2回 2018年7月2日
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
地域情報学演習 VBAプログラミング 第3回 2017年10月24日
アルゴリズムとデータ構造1 2006年6月16日
Modern Compiler Implementation in C 19章後半(451ページから)
レジスタの割付け 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第12章5節.
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
プログラムの制御構造 配列・繰り返し.
バイトコードを単位とするJavaスライスシステムの試作
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
情報とコンピュータ 静岡大学工学部 安藤和敏
プログラムの基本構造と 構造化チャート(PAD)
コンパイラ 2011年10月20日
ベイジアンネットワーク概説 Loopy Belief Propagation 茨城大学工学部 佐々木稔
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
JAVAバイトコードにおける データ依存解析手法の提案と実装
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
文法と言語 ー文脈自由文法とLR構文解析ー
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
言語プロセッサ 第12日目 平成20年1月9日.
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
コンパイラ 2012年10月11日
アルゴリズムの視覚化 この図は左が大きく、 右が小さくなるようにソートしている  この図は左が大きく、  右が小さくなるようにソートしている
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
場合分け(If Then Else,Select Case) 繰返し(Do While) 繰返しその2(For Next)
6.2 高速フーリエ変換 (1)FFT(fast Fourier transform)とは
6.5 アダマール(Hadamard)変換 (1)アダマール変換とは
1.2 言語処理の諸観点 (1)言語処理の利用分野
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
情報基礎A 第14週プログラミング 実際のデータ処理での応用(2)
情報処理Ⅱ 第8回:2003年12月9日(火).
6.5 最終コード生成 (1)コードの形式 ①絶対2進コード(AB : absolute binary) 命令後のオペランドが絶対番地指定。
8.数値微分・積分・微分方程式 工学的問題においては 解析的に微分値や積分値を求めたり, 微分方程式を解くことが難しいケースも多い。
Presentation transcript:

6.4 コード最適化 (1)コード最適化(code optimization) コンパイル過程において生成するコードを最適化すること。 ①コードを小さくする最適化 ②実行時の効率化(これが中心課題) ③実行時の記憶容量の最小化 プログラム変換のひとつと考えてよい。

(a)機械独立と機械依存 ①機械独立(machine independent)な最適化 中間言語に対して最適化するもの。   中間言語に対して最適化するもの。   通常は四つ組みで表現されたものに対して最適化することが多い。 ②機械依存(machine dependent)な最適化   対象機械のアーキテクチャに対して行うもの。

(b)コード最適化の手法 ①共通部分式の除去 ②複写伝播 ③不要コードの除去 ④ループ不変量の抽出とコード移動 ⑤演算子の強さの軽減 等 以上は互いに関連している。

(c)局所的と大域的 ①局所的 演算命令だけからなる列に対する最適化 (比較的単純で容易) ②大域的(制御とデータの流れ解析)   演算命令だけからなる列に対する最適化   (比較的単純で容易) ②大域的(制御とデータの流れ解析)   ループなど分岐を含むプログラム部分に対する最適化   (プログラムの実行時の振る舞いに関する情報を得る必要がある)

(1)コード最適化の手法 (a) 共通部分式の除去 common subexpression elimination A = B / (C + D) - (C + D) (+, C, D, R1) (/, B, R1, R2) (+, C, D, R3) (-, R2, R3, A ) (+, C, D, R1) (/, B, R1, R2) (-, R2, R1, A ) R1とR3は同じ

(b) 複写伝播 copy propagation X = Y; Z = X + 1; W = X; X = Y; Z = Y + 1; W = Y; これだけでは最適化になっていないが、 この処理を行った後、 次の不要コードの除去と組み合わせると コードを除去できる可能性が多くなる。

(c) 不要コードの除去 dead code elimination ① X = Y; ② Z = Y + 1; ③ W = Y; この後、Xの値が使用されなければ、 ①を除去することができる。

(d) コード移動 code motion for(i=0; i<100; i++) X[i]=10*A[j]+Y[i] TP=10*A[j] for(i=0; i<100; i++) X[i]=TP+Y[i]

(e) ループ制御変数の除去 induction variable elimination for(i=0; i<100; i++) C[i]=A[j]*B[i] 1. i = 0 2. goto 0004 3. i = i + 1 4. if not(i<100) goto 8 5. p = 4 * i 6. C[p]=A[p]*B[p] 7. goto 3 8. 1. p = 0 2. goto 0004 3. p = p + 4 4. if not(p<400) goto 7 5. C[p]=A[p]*B[p] 6. goto 3 7.

(f) 演算子の強さの軽減 reduction in strength 演算命令をより「弱い」命令 (実行時間が短い命令)に変える MULTI R0, 2 ⇒  ADD R0,R0   ADDI R0, 1 ⇒ INC R0

(g) オブジェクト生成時の作業領域の削減 式実行時の作業領域への格納と参照の無駄の排除 この削除によって生じる未使用作業領域の削除 B * C + D LOD R0,B MUL R0,C STR R0,Temp001 /* この部分が LOD R0,Temp001 /* 無駄 ADD R0,D      ・ Temp001 DA 1       /* 上記の部分を削除すると /* これもいらなくなる

(3) 制御の流れ解析 control flow analysis 原始プログラムを基本ブロック(basic block)と 分岐の形に変換して解析する。 1. i = 0 2. goto 0004 3. i = i + 1 4. if not(i<N) goto 8 5. p = 4 * i 6. if A[p]=X goto 10 7. goto 3 8. F = 0 9. Goto 11 10. F = 1 11. for(i=0; i<N; i++) if(A[I]==X) goto L1; F = 0; goto L2 L1: F = 1; L2:

(a) 流れグラフ flow graph 基本ブロック内を局所的(local) 基本ブロックにまたがる関係を大域的(global) 1. i = 0 2. goto 0004 3. i = i + 1 4. if not(i<N) goto 8 5. p = 4 * i 6. if A[p]=X goto 10 7. goto 3 8. F = 0 9. Goto 11 10. F = 1 11. i = 0 B2 i = i + 1 B3 if not(i<N) goto 8 B4 p = 4 * i if A[p]=X goto 10 B6 B5 F = 1 F = 0

頂点Aが頂点Bを支配する(dominant)とは ①流れグラフの出発点から Bに至るすべての経路が Aを通るとき    A dom B と表記。 ②ある辺 B→ A が帰辺 (back edge)であるとは、 である。 B1 i = 0 B2 i = i + 1 B3 if not(i<N) goto 8 B4 p = 4 * i if A[p]=X goto 10 B6 B5 F = 1 F = 0 B3 dom B2, B2→B3は帰辺 B3 dom B4, B4→B3は帰辺 B4 dom B6, B6→B4は帰辺

(b)自然なループ(定義) 自然なループ ある帰辺N→Dが存在して、 その部分グラフが 頂点DとDを通らず Nに到達できるような すべての頂点を 合わせたもの B1 i = 0 B2 i = i + 1 B3 if not(i<N) goto 8 B4 p = 4 * i if A[p]=X goto 10 左の例では、  B3, B4, B2(先頭B3) が自然なループである (赤い線) B6 B5 F = 1 F = 0 B3 dom B2, B2→B3は帰辺 B3 dom B4, B4→B3は帰辺 B4 dom B6, B6→B4は帰辺

(c)性質 流れグラフの中の2つの自然なループは、先頭が異なれば、 互いに共通部分がないか、一方が他方に含まれるかのいずれかである。 先頭が同じであれば、一方が他方に含まれるとはいえない場合が生じる。

(d)到達可能性解析の処理 ① ソースプログラムを解析してネットワークを作成。 このときブロック番号一覧を作成する。   このときブロック番号一覧を作成する。 ② 各ブロック番号に対して以下を行う。 ③ ブロック番号履歴を空リストとして到達可能性リストを作成する。 【到達可能性リストの作成】 ① 終了または現ブロック番号がブロック履歴にあった場合、   現ブロック履歴を到達可能リストとして登録して終わる。 ② 上記①でない場合、以下を行う。 ③ 現ブロック番号をブロック履歴に追加。 ④ 現ブロックからの分岐数分だけ、分岐先のブロック番号を現ブロック番号として再帰的に呼び出す。

到達可能性の処理 Excelによるアルゴリズムの確認

到達可能性の処理(1) Private History(100) As Integer Private ListData(100, 100) As Integer Private NumList(100) As Integer Private PntList As Integer Private Function Hsearch(Bno, History, P) History(P + 1) = Bno k = 1 Do While History(k) <> Bno k = k + 1 Loop Hsearch = k End Function Sub 登録(History, P) PntList = PntList + 1 NumList(PntList) = P For k = 1 To P ListData(PntList, k) = History(k) Next End Sub

到達可能性の処理(2) Sub 到達可能性リスト(Bno, History, P) If Bno = 0 Or Hsearch(Bno, History, P) <= P Then 登録 History, P Else With Worksheets("Sheet1") History(P + 1) = Bno num = Val(.Cells(Bno + 1, 2)) If num = 0 Then 登録 History, P + 1 For k = 1 To num nextBno = Val(.Cells(Bno + 1, k + 2)) 到達可能性リスト nextBno, History, P + 1 Next End If End With End Sub

到達可能性の処理(3) Sub 表示() With Worksheets("Sheet2") .Cells(1, 1) = PntList For i = 1 To PntList .Cells(i + 1, 1) = i .Cells(i + 1, 2) = NumList(i) For k = 1 To NumList(i) .Cells(i + 1, k + 2) = ListData(i, k) Next   Next End With End Sub Sub ボタン1_Click() PntList = 0 For i = 1 To 6 到達可能性リスト i, History, 0 表示

処理結果 出発点 到達点

(4) データの流れ解析 data flow analysis ①到達定義解析 ②生存変数解析 ③使用可能式解析

(a) 到達定義解析 ある定義 D が流れグラフ中の別のある点 P まて到達する D からが点 P までグラフ上の路があり、 その変数への値の代入またはその可能性がない。 (値の代入またはその可能性があることを「定義が殺される」という)

(b) 生存変数解析 流れグラフ中のある点のある変数の値が、 その点以降のどこかの経路で使用されるか 使用されないかを調べる ①どこかの経路で使用されるとき  その変数は「その点で生きている」という。 ②どの経路でも使用されないときその変数は  その変数は「その点で死んでいる」という。

(c) 使用可能式解析 available expression analysis 途中で式の値を評価し、 そのような評価で P に達するものはどれも、 また、その後 P に到達するまでの間、 式中に使われる変数への代入がない。 もっと簡単に「P 以降で代入がない」と言ってもよい。

言葉の定義 ①基本ブロック B が式 f(X,Y)を殺す。  言葉の定義 ①基本ブロック B が式 f(X,Y)を殺す。  基本ブロック中で X または Y の値の変更せず、その後 f(X,Y)を計算しないこと。基本ブロック中で殺される式の集合を次のように表記する。     e_kill[B] ②基本ブロック B が式 f(X,Y)を生成する。  基本ブロック中で式 f(X,Y)を計算し、その後 X または Y の値の変更しないこと、基本ブロック中で生成される式の集合を次のように表記する。     e_gen[B]

基本ブロックでの使用可能式の集合 ①基本ブロック B の入り口での使用可能式の集合 in[B]  基本ブロックでの使用可能式の集合 ①基本ブロック B の入り口での使用可能式の集合    in[B] ②基本ブロック B の出口での使用可能式の集合    out[B] 【関係】 データの流れの方程式    out[B] = (in[B]-e_kill[B]) ∪ e_gen[B] in[B] = ∩ out[P] (Pは直前のブロック)     in[B1] = φ    ( B1は出発ブロック)

アルゴリズム 入力:流れグラフ G, 出発ブロック B1 ,式全体の集合 U    各ブロックB の e_kill[B] と e_gen[B] は計算されているものとする。 出力:各基本ブロック B における in[B] とout[B]

処理の流れ (for(B≠ B1) は、 B1 以外の各ブロックBに対して行うという意味) in[B1]=φ; out[B1]=φ; for(B≠ B1) U- e_kill[B] change=true; while (change){ change=false; for(B≠ B1) {in[B]=∩ out[P]; /* Pは直前のブロック */ oldout=out[B]; out[B]=(in[B]- e_kill[B])∪ e_gen[B]; if(oldout ≠ out[B])change=true; }

(5) 大域的な変換 (a)共通部分式の大域的な変換 【例】文S : A = B + C B + C が文Sを含む基本ブロックの先頭において 使用可能式であり、かつこのブロック内のSより 前の部分でB、Cが定義されていないものとする。 ① このブロックに到達する B + C の評価を見つけるために流れグラフを逆にたどる。使用可能式なので必ず見つかる。 ② 新しい変数Uを作る。 ③ 上記1で見つかった文 X = B + C を     U = B + C; X = U; で置き換える。 ④ 文Sを X = U で置き換える。 実行順序関係の同じ式を見つけたら、上記のような置き換えを行う。

(b)複写伝播と不要コードの除去 (a)使用可能式による変換 (b)複写伝播と不要コードの除去 B1 B1 U = B + C R1 = U R2 = C * D B1 R1 = B + C R2 = C * D U = B + C R2 = C * D 削除 B2 B2 B2 R3 = B + C R4 = X * R3 R3 = U R4 = X * R3 R4 = X * U 変更