100 likes | 160 Views
LMNtal コンパイラにおける 並び替えとグループ化を 用いた命令列の最適化. 1G01P047-1 櫻井 健. LMNtal とは. 階層的グラフ構造を書き換え規則 ( ルール ) で書き換えることで処理が進行 計算モデルとして簡明であること , 高い汎用性を持つことが目標 「高い汎用性」の観点から , それなりに 実行効率を高くしたい → 最適化 LMNtal のプログラムの構成要素は , アトム , リンク , 膜 , ルールの 4 つ 例: a(X), b :- X > 5 | ok. a(3). a(3). c. c.
E N D
LMNtalコンパイラにおける並び替えとグループ化を用いた命令列の最適化LMNtalコンパイラにおける並び替えとグループ化を用いた命令列の最適化 1G01P047-1 櫻井 健
LMNtalとは • 階層的グラフ構造を書き換え規則(ルール)で書き換えることで処理が進行 • 計算モデルとして簡明であること, 高い汎用性を持つことが目標 • 「高い汎用性」の観点から, それなりに 実行効率を高くしたい → 最適化 • LMNtalのプログラムの構成要素は, アトム, リンク, 膜, ルールの4つ 例: a(X), b :- X > 5 | ok. a(3) a(3) c c ルール適用 b a(8) ok a(3) a 3 =
処理系の概要と実装した最適化 ソースコード 解釈・実行 命令列の並び替えとグループ化を行う機能を追加した ルールの構造 ヘッド :- ガード | ボディ → ヘッド命令列, ガード命令列, ボディ命令列にコンパイル 最適化するのはヘッド命令列と ガード命令列のみ. コンパイラ インタプリタ 中間命令列 最適化器 中間命令列 (最適化後)
コンパイル後の命令列ルール:a(X), b :- X>5 | ok. ヘッド データ a(3) a(1) ガード findatom [1, 0, a_1] findatom [2, 0, b_0] allocatom [3, 5_1] derefatom [4, 1, 0] isint [4] igt [4, 3] ・アトムは変数番号で管理する ・findatom命令 データの中からアトムを取得して, それ 以下の命令列(四角内)を実行する. 四角内で失敗すると外に戻る. → 直前のfindatomにバックトラック 問題点:ガード命令列が実行されるのが 遅い X > 5 (igt) で失敗するとbの取得からや り直す →実際にはa(X)の取得からやり直すべき. a(8) b b b
命令列の並び替えa(X), b :- X > 5 | ok. 並び替え前 並び替え後 findatom [①, 0, a_1] allocatom [③, 5_1] findatom [②, 0, b_0] findatom [①, 0, a_1] allocatom [③, 5_1] derefatom [④, 1, 0] derefatom [④, 1, 0] isint [4] isint [4] igt [4, 3] igt [4, 3] findatom [②, 0, b_0] ・ある変数番号を使う命令→ その変数番号を定義した命令の直後へ移動 (①・・・変数番号1が定義された所) 並び替えた結果・・・ ・X > 5で失敗するとすぐにa(X)の選び直し → バックトラックを改善できた 残る問題点:bの取得に失敗してもa(X)を 選び直す → bの取得に失敗した時点でルール適用 失敗のはず
データ a(3) a(1) a(8) グループ化による解決策 • a(X), b どちらか一方でも取得できなくなったらルール適用失敗 このデータでは ルール適用失敗は 決定的 • a(X), b :- X>5 |ok.においてはX>5である a(X)の取得と, bの取得は独立した処理. a(1)の代わりにa(3)を取得してもbの取得には影響しない • グループ化したルールのイメージ group[a(X), X>5], group[b] | ok. 独立した処理ごとに命令列を区切る
グループ化後の命令列a(X), b :- X>5 | ok. False 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 [] ] True False True グループ内の命令列を実行 成功:次のグループへ 失敗:その時点でルール適用失敗
性能評価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 Nab=200, Ncd=400 Nab=400, Ncd=200
考察 ・各最適化レベルのルールのイメージ 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の差が顕著に 表れている.
まとめと今後の課題 まとめ 実装した最適化とその効果 • 命令列の並び替え ・ガード検査を行うルールで有効. ・性能評価では最大で元の約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命令の仕様の変更と 新しいインタプリタの実装が必要.