next up previous
Next: 研究の成果 Up: 「KL1のゴール・スケジュー リング最適化」に関する成果概要 Previous: 研究の背景と目的

研究の内容

本研究では、逐次実行が最適なゴール系列を一つのスレッドとみなし、プログ ラムを並行スレッドの集まりと考えて最適化を行う。これにより、スレッド内 については逐次実行効率を優先したコードを生成すると共に、スレッド間の動 的スケジューリングによって元プログラムの本質的な並行動作を実現し、デー タ依存関係を保つことができる。

最適化手法 

最適化は、まずゴール間の依存解析を行った後、その結果を元にプログラムを スレッドに分割し、各スレッドについて最適化コードを生成するという方法を とる。

KL1での同一化は、対象となる変数について必ずしも具体値を必要としないた め、変数間の論理的なデータの流れがすべて依存になるとは限らない。提案す る手法では、ユーザ定義述語を「ガードで引数の一部を参照し、子供となるボ ディゴールを生成して終了する」存在と捉える。組込述語については、「ラン タイムが引数の一部を参照し、ボディゴールの呼び出しは行わずに引数の一部 を具体化して終了する」ものと考える。ここで参照、具体化される引数をそれ ぞれ入力、出力とみなすと、あるゴールが実行可能になるための条件は、入力引数の各々について、 それらを出力引数とするゴールの実行がすべて終了しており(データ依存)、 の親ゴールの実行も終了している (制御依存)、ということである。したがって、これらの依存を解析した上で、 半順序の依存関係が成り立つゴールの集合を1スレッドとすればよい。

依存解析は後述するように具体化ゴール情報を付加した型解析を用い、データ の生成ゴール・参照ゴール間の依存情報を抽出する。次に、この依存情報を利 用してプログラムをスレッドに分割する。あるスレッド中のゴールpがボディゴールを生成する場合を考えると、逐次化を 行うには、の依存関係により両者 の実行順序を決定しなければならない。片方向の依存であれば実行順序を依存 順に、依存関係がなければ実行順序を任意に、それぞれ固定できる。相互依存 であれば、の次の実行ゴールは とし、を新たなスレッドの開始ゴールとする。これを繰り返して、プログラム中の全 ゴールをスレッドに分割すると同時に、スレッド内のゴールを静的スケジュー リングする。各スレッド内のゴールから実行コードを生成する際には、逐次化 により不要になる動的な判定・操作を削減し、実行効率を向上させる。

実行時処理

従来のKLIC実行系では各ゴールがスケジューリング対象となるが、提案する手 法では、各スレッド内のゴールのスケジューリング順序を静的に固定している。 したがって、本手法の実行系ではスレッド単位のスケジューリングを行う。

実行系があるスレッドを選択すると、入力引数がそろっている限り、スレッド 内ゴールを逐次的に実行する。未具体化の入力引数が現れた場合にはゴールの 実行が中断するが、その変数を具体化するのは他のスレッド中のゴールである ので、実行中のスレッド自体が中断し、実行系は他のスレッドを選択して処理 を続ける。



www-admin@icot.or.jp