平成9年度 委託研究ソフトウェアの提案

(19) KL1のスレッド実行の高速化

  
研究代表者: 中島 浩 教授
豊橋技術科学大学 情報工学系



[目次]

  1. 研究の背景
  2. 研究の目的
  3. 研究内容
  4. 研究体制/研究方法
  5. 想定されるソフトウェア成果

[研究の背景]

PIM ならびに KLIC の研究・開発を通じて,KL1 の逐次的なプログラムの実行 性能は,他の論理型言語や一般の記号処理向き言語のシステムと比べて,遜色 のない水準に達している[1]。しかし,手続型やオブジェクト指向言語と比べ ると,その実行性能は必ずしも満足できるものとはいえない。

この主な原因として,我々はプロセッサ間およびプロセッサ内での並列/並行 実行のメカニズムが過度に一般化された動的なものであることに着目した。即 ち,モード解析[2]などの静的解析技術を用いることによって,並列/並行実 行のオーバヘッドを大きく削減できるのではないかと考えた。

このような研究方針に基づき,我々は既にプロセッサ間通信の最適化技法[3] と,ゴール・スケジューリングの最適化技法[4,5]を確立し,それぞれ大幅な 性能向上が得られることを示してきた。これらはいずれも変数のタイプ解析に 基づくものであり,一つの解析技術を様々な局面で応用できることを示したも のでもある。そこで,これまでに得られた成果に基づいて,静的解析を利用し た高速化手法をさらに追求することで,より優れた KL1 の処理系を得ること が本研究の基本的な方針である。


[研究の目的]

KL1 の高速実行のための有力な方法として,我々は静的解析に基づくゴール・ スケジューリングの最適化方式に関する研究を平成7〜8年度に行なった [4,5]。

この方法では,まず静的解析によってゴール間のデータ依存関係を調べ,同一 クローズから起動される二つのゴール p, q が特定の順序で(例えば p->q の 順序)逐次実行可能か否かを判定する。その結果,逐次実行可能と判定されれ ば p, q は一つの「スレッド」に属するゴールとして,逐次的に実行される。 従って p の実行が中断しても q はスケジューリングされず,従来のスケジュー リング方式の欠点である無駄な中断が除去される。またスレッド内の実行が完 全に逐次的であることを利用し,ゴールの実行環境をスタックで管理すること によって,ガベージ・コレクションの起動回数を削減することもできた。この 他,動的なスケジューリング単位がスレッドとなったために生じる並列実行時 の応答性能の劣化を補償するために,スレッドのスケジューリング優先度を動 的に定める reply first scheduling を考案して実装した。

以上のスレッド化技法を用いることにより,KL1 の実行速度が 1.3〜2.9 倍に 向上することが確かめられた。しかしスレッド化技法には,さらなる性能向上 のための改善の余地が数多くある。例えばスレッド内の実行環境を管理するス タックには,オリジナルの KLIC のゴール・レコードとほとんど同じものが格 納されており,ガベージ・コレクション以外での性能向上への寄与はほとんど ない。また,スレッドごとのスタック割付けアルゴリズムも単純であるため, スタックの伸縮が頻繁に生じるプログラムでは,割付けのためのオーバヘッド が小さくない。

またスレッド長をできるだけ大きくするようなスレッド化を行なっているため, 極めて粒度が大きなスレッドが生成されることが多い。例えばゴール p, q に 相互の依存関係がなく,逐次/並行のどちらでも実行可能な場合,現状ではス レッド長を大きくするために必ず逐次実行(例えば p->q の順序)が行なわれ る。その結果,q による具体化を必要とするようなゴールが別のプロセッサで 実行されている場合,p の実行によって応答性能が悪化することがある。

本研究の目的は,上記のようなスレッド化技法の問題点を解決することにある。 即ち;

(a) スタック管理を中心としたスレッド内実行方式の改良
(b) スレッド粒度の制御を可能とするようなスレッド生成/スケジューリング 方式の考案

の2点が本研究の目的である。


[研究内容]

現状のスレッド内実行方式の問題点を細かく見ると,以下のようになる。

(a1)現状では,例えば;

   p :- q, r, s.

では,s と r に関するゴール・レコードとほぼ同じ情報を(この順序で) スタックにプッシュし,q を実行する。q の完了後,r のフレームがポッ プされ,r が実行される。この方法(ゴール環境法)を WAM のような方 式,即ちクローズの実行環境をスタックに保持する方式(クローズ環境法) と比較すると,KL1 ではバックトラックが生じないため,r や s の呼び 出しに要する手間は同等であるように見える。しかしヘッドに現れない所 謂ローカル変数 X を q, r, s の三者が共有する場合,クローズ環境法で は r と s に X の「値」を渡せるのに対し,ゴール環境法では r へは X への reference pointer を渡さざるを得ない。また定数やプログラム中 に現れる構造体を渡す場合にも,ゴール・レコードへの書込/読出が余分 な手間となる。

一方,クローズ環境法では q の完了時に制御が q->p->r と移動するのに 対し,ゴール環境法では q->r と移動するため制御移行オーバヘッドは小 さい。したがって,ゴール引数生成と制御移行のどちらのオーバヘッドが 大きいかを評価/勘案し,スレッドの実行方式を見直す必要がある。なお 現状では q が一定の条件を満たせば q->r の分岐を直接分岐とする最適 化を行なっているが,この方法や gcc のラベル変数利用などはどちらの 環境管理方式にも適用できる。

また現状では実装を簡単にするために,上記の X をヒープに割付け,s に対しても reference pointer を渡しているが,これを s のゴール・レ コード中に割付けるようにするのは容易である。その際に生じる所謂ロー カル変数の安全性問題については,スレッド化のための依存解析によって, ほとんどの場合はコンパイル時に解決できる。

(a2)スレッドごとのスタックの割付/解放を,現状では一定の大きさのページ
単位に行なっている。従ってスタック・トップがページ境界を通過するた びに,ページの割付または解放が行なわれる。このオーバヘッドを軽減す るために,現状の実装ではページ境界をまたぐスタック・トップの振動を 検出し,ページ境界をずらすという工夫を行なっているが,ページ境界通 過に伴う本質的なオーバヘッドは依然存在する。

そこでスタック・ページ割付について;

などの改良が考えられる。

また,現状のスレッド生成方式では,あるスレッド t に属するゴール p, q について,静的に定められた実行順序が p->q であることは,必ずしも q が p に依存することを意味しない。即ち p が q に依存しないこと,つまり p の中断時に q をスケジューリングしなくてもデッドロックが生じないことが 確かめられれば,実行順序を固定する。この方法は,例えば quick sort の二 つの再帰ゴールのように,相互依存関係が存在しないゴール群に対して不要な スレッド生成を行なわないようにするというメリットがある。

しかし,上記の q が他のスレッド s が参照する変数を具体化するようなもの であるとき,以下のような問題が生じる可能性がある。

(b1)p の完了に長い時間を要する場合,t と s とは並行/並列に動作可能で
あるにも関わらず,s が動作できない。この問題はオリジナルの KLIC で も生じる。

(b2)p の完了がさらに別のスレッド u による具体化に依存する場合,s と u
とは無関係に動作できるにも関わらず,s が結果的に u に依存する。こ の問題はオリジナルの KLIC では生じない。なおプログラムが全体として deadlock free であれば,deadlock が生じることはない。

これらを解消するためには,q を t とは別のスレッドとする必要があるが, そのためには以下のような項目について深く検討しなければならない。

<1> q を分離する(あるいは分離可能にする)条件。相互依存関係のみでは前 述のように quick sort の再帰ゴールが分離されるおそれがある。なお quick sort では上記の問題は結果的に生じないが(リストの先頭側の生 成が完了しなければ,後方側を参照することができない),それを解析に よって知ることは困難であると予想される。また逆に q が p に依存する 場合でも,p の完了が q による具体化の実行条件とは限らない。

<2> q の分離を静的に行なうか,動的に行なうか。静的に行なう場合,分離戦 略のプログラムへの適合性が性能に強く影響することが予想されるが,適 切に戦略を定めるのは困難が予想される。したがって,コンパイル時には 分離可能(あるいは「分離希望」)であることを指示し,実行時に判断す る方法が考えられる。

<3> 動的分離の場合の分離タイミング。p, q が属するクローズの実行時に分 離するのは容易であるが,分離判定に使用できる情報が不十分であること が予想される。例えば,クローズ実行時に他のスレッドからの具体化要求 がなければ分離しないとすると,上記の(b1), (b2)の問題が解消できない ことが多くなると予想される。逆に p の実行開始後でも分離できるよう にすると,q を分離可能にするためのオーバヘッドが大きくなることが予 想される。

<4> 動的分離の場合の条件。他のスレッドからの具体化要求以外に,存在する (あるいはアクティブな)スレッド数などを勘案することも考えられ,特 に分離タイミングをクローズ実行時にする場合には必須であろう。その場 合,分離条件に関わるパラメータ(例えばスレッド数の上限)の設定をど のように行なうかが課題となる。

以上のように検討が必要な課題が数多くあるが,いずれも研究的価値が高い課 題であると考える。

[1] Chikayama, T., et al. A Portable and Efficient Implementation of KLIC. In Proc. Intl. Symp. on Programming Language Implementation and Logic Programming, pp. 25-39, LNCS 844, Springer Verlag, September, 1994.

[2] Ueda, K. and Morita, M. Moded Flat GHC and Its Message-Oriented Implementation Technique. In New Generation Computing, Vol. 13, No. 1, pp. 3-43, November 1994.

[3] 大野 和彦,他. 静的解析による並列論理型言語KL1の最適化手法. JSPP'95, pp.169--176, May, 1995.

[4] 伊川,他. KLIC におけるゴール・スケジューリング最適化.情処研報 96-PRO-10, pp. 43-48, 1996.

[5] 中島,他. KLIC のゴール・スケジューリング最適化.IFS 研究報告. 1997.


[研究体制/研究方法]

(1) 研究体制

   氏 名 所  属
研究代表者中島 浩豊橋技術科学大学   *1
研究協力者貴島 寿郎豊橋技術科学大学   *1
研究協力者大野 和彦京都大学(博3)    *2
研究協力者杉山奈美代豊橋技術科学大学(修1)*1

*1 情報工学系/情報工学専攻
*2 工学研究科 情報工学専攻


(2) 研究の方法

前年度までの成果である「ゴール・スケジューリング最適化 KLIC 改良版」を 基礎として,本研究に必要な解析系/実行系を付加する形で改良する。研究は 2年計画で実施し,初年度は主にスレッド内実行系の改良と,スレッド分離機 構の方式検討を行なう。また,必要に応じて関連する研究の調査を行なう。


[想定されるソフトウェア成果]

(1)作成されるソフトウェア名称

スレッド化 KLIC 改良版

(2)そのソフトウェアの機能/役割/特徴

スレッド化 KLIC 改良版は,既に開発した「ゴール・スケジューリング最適化 KLIC 改良版」と同様に,ゴール間のデータ依存解析を行なってスケジューリ ング戦略を定める解析系と,解析系が求めた戦略にしたがってゴールのスケジュー リングを行なう実行系に分かれる。また解析系/実行系ともにオリジナルの KLIC に組み込まれ,ユーザのプログラム変更が不要であることも,同様であ る。

解析系には,これまでのデータ依存関係に基づくスレッド化機能に,従来はス レッドに属していたゴールを別スレッドとして分離する,あるいは動的に分離 可能とする機能が加えられる。このため,ゴール間あるいはスレッド間のデー タ依存関係に関して,従来版よりも詳細な解析を行なう。またスレッド内のゴー ル呼び出しについても,実行系の改良に伴う生成コードの修正を行なう。

実行系については,まずスタックを利用したスレッド実行環境の管理が大幅に 修正される。また動的スレッド分離を行なう場合には,従来の reply first scheduling の改良や新たな機能の導入により,解析系の指示に基づくスレッ ドの分離機能を追加する。

(3)ソフトウェアの構成/構造

解析系は KLIC コンパイラの一部として組み込まれ,ゴール間のデータ依存解 析を主とする解析部と,解析結果に基づくコード生成部とに分かれる。既存の KLIC との連続性や,KLIC の今後の改良に対応するため,解析系は既存部分と は最大限に独立した形で実装する。またデータ依存解析はできるだけ汎用的に 行ない,他の用途への流用が容易に行なえるように設計する。

実行系も KLIC ラインタイム・システムの一部として組み込まれる。ユニフィ ケーション機構など,既存のランタイム機構はほとんど影響を受けないので, ジェネリック・オブジェクトなど既に作成されたユーザ定義モジュールを変更 する必要は一切ない。

(4)参考とされたICOTフリーソフトウェアとの関連

本研究で作成するソフトウェアは,既に IFS として提供している「ゴール・ スケジューリング最適化 KLIC 改良版」を改良する形で実装される。

(5)使用予定言語および動作環境/必要とされるソフトウェア・パッケージ/ポータビリティなど

解析系は KL1 で,実行系は C で作成する。動作環境などは KLIC と全く同一 で良い。

(6)ソフトウェアの予想サイズ(新規作成分の行数)

解析系 1000 行。実行系 1500 行。

(7)ソフトウェアの利用形態

KLIC の改良版として提供されるので,KL1 プログラムは勿論,ユーザ定義の ジェネリック・オブジェクトを変更する必要は一切ない。

また本研究での最適化は,ほとんど全てのプログラムに効果があると予想され るが,特にプロセスを指向したプログラミング・パラダイムを採用したプログ ラムについて,大きな効果を発揮するものと期待できる。また今後のプログラ ム開発において,従来のように処理系の性質を過度に考慮することなく,自然 なプログラミングで十分に高い性能を得ることができると期待される。

(8)添付予定資料

ソフトウェア仕様書,ユーザマニュアル


www-admin@icot.or.jp