LMNtalコンパイラにおける 並び替えとグループ化を 用いた命令列の最適化 1G01P047-1 櫻井 健 1 LMNtalとは 階層的グラフ構造を書き換え規則 (ルール)で書き換えることで処理が進 行 計算モデルとして簡明であること, 高い 汎用性を持つことが目標 「高い汎用性」の観点から, それなりに 実行効率を高くしたい → 最適化 LMNtalのプログラムの構成要素は, ア トム, リンク, 膜, ルールの4つ 例: a(X), b :- X > 5 | ok. a(3) a(8) a(3) c ルール適用 b = a(3) c ok a 3 2 処理系の概要と 実装した最適化 ソースコード コンパイラ 中間命令列 解釈・実行 命令列の 並び替えと グループ化 を行う機能 を追加した 最適化器 インタプリタ 中間命令列 (最適化後) ルールの構造 ヘッド :- ガード | ボディ → ヘッド命令列, ガード命令列, ボディ命令列にコンパイル 最適化するのはヘッド命令列と ガード命令列のみ. 3 コンパイル後の命令列 ルール: a(X), b :- X>5 | ok. findatom findatom allocatom ガード derefatom isint igt ヘッド [1, 0, a_1] [2, 0, b_0] [3, 5_1] [4, 1, 0] [4] [4, 3] データ a(1) a(3) a(8) b b b ・アトムは変数番号で管理する ・findatom命令 データの中からアトムを取得して, それ 以下の命令列(四角内)を実行する. 四角内で失敗すると外に戻る. → 直前のfindatomにバックトラック 問題点:ガード命令列が実行されるのが 遅い X > 5 (igt) で失敗するとbの取得からや り直す →実際にはa(X)の取得からやり直すべき. 4 命令列の並び替え 並び替え前 findatom findatom allocatom derefatom isint igt a(X), b :- X > 5 | ok. 並び替え後 [①, 0, a_1] [②, 0, b_0] [③, 5_1] [④, 1, 0] [4] [4, 3] allocatom findatom derefatom isint igt findatom [③, 5_1] [①, 0, a_1] [④, 1, 0] [4] [4, 3] [②, 0, b_0] ・ある変数番号を使う命令→ その変数番号を定義した命令の直後へ移動 (①・・・変数番号1が定義された所) 並び替えた結果・・・ ・X > 5で失敗するとすぐにa(X)の選び直し → バックトラックを改善できた 残る問題点:bの取得に失敗してもa(X)を 選び直す → bの取得に失敗した時点でルール適用 失敗のはず 5 グループ化による解決策 a(X), b どちらか一方でも取得できなく なったらルール適用失敗 データ a(1) このデータでは a(3) ルール適用失敗は 決定的 a(8) a(X), b :- X>5 |ok.においてはX>5であ る a(X)の取得と, bの取得は独立した 処理. a(1)の代わりにa(3)を取得してもbの取 得には影響しない 独立した処理ごとに命令列を区切る グループ化したルールのイメージ group[a(X), X>5], group[b] | ok. 6 グループ化後の命令列 a(X), b :- X>5 | ok. group [ spec [0, 0], allocatom [3, 5_1], findatom [1, 0, a_1], derefatom [4, 1, 0], isint [4], igt [4, 3], proceed [] ] group [ spec [0, 0], findatom [2, 0, b_0], proceed [] ] グループ内の命令列を実行 False True False True 成功:次のグループへ 失敗:その時点でルール適用失敗 7 性能評価 a(A), b(B), c(C), d(D) :- A>B, C>D | ok. 測定環境 最適化オプション PentiumIII 845MHz メモリ: 256MB WindowsXP Home Z0: 最適化無し Z1: 並び替え Z4: グループ化+Z1 A, B, C, D:ランダムな整数 Nab: a(A), b(B)の数 Ncd: c(C), d(D)の数 ルール適用開始から終了までの時間を計測 Nab=100, Ncd=100 Nab=200, Ncd=200 時間[ms] 性能比 Z0 401196 1.00 Z1 444.7 902 Z4 280.3 1430 時間[ms] 性能比 Z0 計測不能 Z1 1485.2 1.00 Z4 869.3 1.71 Nab=200, Ncd=400 Nab=400, Ncd=200 時間[ms] 性能比 Z0 計測不能 Z1 856.3 1.00 Z4 884.4 0.968 時間[ms] 性能比 Z0 計測不能 Z1 176870 1.00 Z4 1065.8 166 8 考察 ・各最適化レベルのルールのイメージ Z0: a(A), b(B), c(C), d(D) :- A>B, C>D | ok. Z1: a(A), b(B), A>B, c(C), d(D), C>D :- ok. Z4: group[a(A), b(B), A>B], group[c(C), d(D), C>D] | ok. ・あるタイミングでa(A), b(B)がNab’個, c(C), d(D)がNcd’個残っているとすると, その時 1回ルール適用を成功させるためのマッチング の回数(findatom命令の実行回数)は Z0: O(Nab’×Nab’×Ncd’×Ncd’ + Ncd’×Ncd’)回 Z1, Z4: O(Nab’×Nab’ + Ncd’×Ncd’)回 Z1とZ4の違いはグループ化の有無だが, ルール適用成功時のマッチングの回数は同じ. 差が生じるのはルール適用失敗(終了)時に次 の条件が満たされる場合. ・C>Dを満たすc(C), d(D)の組合わせはもう無 いがA>Bを満たすa(A), b(B)の組合わせが たくさん残っている場合 表ではNad=400, Ncd=200の時, この条件が成 立する可能性が高いため, Z1とZ4の差が顕著に 表れている. 9 まとめと今後の課題 まとめ 実装した最適化とその効果 • 命令列の並び替え ・ガード検査を行うルールで有効. ・性能評価では最大で元の約902倍高速化. • 命令列のグループ化 ・ルールがいくつかの独立したパターンマッチング で成り立つ時, 各々のマッチングで失敗するタ イミングが大きく異なる場合に有効. ・性能評価ではグループ化の有無による差は, 最大で約166倍 今後の課題 • a(A), b(B), c(C), d(D) :- A>B, A>C, A>D | ok. → グループ化まで最適化すると group[a(A), b(B), A>B, c(C), A>C, d(D), A>D] | ok. A>Cに失敗するとc(C), b(B), a(A)の順にバックト ラック. 改善にはfindatom命令の仕様の変更と 新しいインタプリタの実装が必要. 10
© Copyright 2024 ExpyDoc