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
ダウンロード

発表用スライド