250 likes | 379 Views
dklic: KL1 による分散 KL1 言語処理系の実装. 早稲田大学 高木祐介 , 上田和紀. 並行論理プログラミング言語 (並行制約プログラミング言語). Object-based な微粒度並行言語 GHC (1985) → KL1 on KLIC (1990’s) and many others (Strand, Oz, …) 特徴: 論理変数の表現力 ストリームを用いた非同期メッセージ送信 未完成(返信箱つき)メッセージ 局所チャネルの動的生成と移送 (cf. π 計算 (1989)) 送受信される情報の形態 = (等号)制約
E N D
dklic: KL1による分散KL1言語処理系の実装 早稲田大学 高木祐介, 上田和紀
並行論理プログラミング言語(並行制約プログラミング言語)並行論理プログラミング言語(並行制約プログラミング言語) • Object-basedな微粒度並行言語 • GHC (1985) → KL1 on KLIC (1990’s) • and many others (Strand, Oz, …) • 特徴: 論理変数の表現力 • ストリームを用いた非同期メッセージ送信 • 未完成(返信箱つき)メッセージ • 局所チャネルの動的生成と移送 (cf. π計算(1989)) • 送受信される情報の形態 = (等号)制約 • 例: X=2001, L0=[pop(Y)|L]
並行オブジェクト 動的生成 繰返し オブジェクトの状態 Object identity 通信路 メッセージ 返信箱 同期・受信 送信 Channel mobility ゴール(のマルチ集合) ゴールの起動 末尾再帰 ゴールの引数ベクトル ゴールのインタフェースである非局所論理変数 ストリーム(=リスト) ストリームの要素 メッセージの引数 Ask (制約の観測) Tell (制約の放出) ストリームの動的生成と送受信 プログラミング・イディオム
KL1の計算モデル • 動的プロセス生成+動的ネットワーク構成 • プログラムは節(書換え規則)の集合 節: Head :- Guard | Body . (テンプレート) (付帯条件) (生成ゴール群) 末尾再帰 Goal Goal Goal 通信路 Goal Goal ゴール群
なぜKL1ベースの分散処理か? • 単純な言語である • 安全性や正当性の検証を伴う分散プログラミングを最終目標としている • 論理変数 • ポインタ概念の隠蔽 • 安全性 • 局所的な実体と分散された実体の意味が完全に同一 • 実装の自由度 • データの複製 (replication) が自由 • Update in place による最適化が可能 • 参照数解析 (linearity analysis)
dklic = KLIC+API • KLIC (http://www.klic.org/) • KL1-to-C translator + runtime system • 記号処理言語としては良好な性能 • PVMに基づく分散メモリ並列処理系 • 同一アーキテクチャのPEをまたがる論理変数の分散実装 • 分散機能はUnixソケットのみ • dklicではソケットを隠蔽
dklicの目標 • ネットワーク透過な分散計算環境の実現 • 分散実行系によって遠隔ノードに計算依頼 • 遠隔述語呼出し(cf. Java RMI) • 述語移送(cf. Javaクラスローダ) • サービス検索(cf. ORB, Jini) Distributed Runtime System request Stream client server
dklicが前提とする分散環境 • ノード • 固有の計算空間を持ったプロセス • アーキテクチャは不特定 • ノード間接続 • 各ノードは通信データの損失や追越しのない通信路で接続されている(cf. TCP/IP, SSL) • ノードの把握 • ノード数は不定で、動的に増減する • 順序付けはできず、識別のみができる
dklic処理系の構成 • 100% KL1による単純な実装 • ノード実行系はKLIC任せ • 実行系は約400行(第1版は1600行) • 遠隔述語呼出しを実現 • 述語移送(140行)とサービス検索は試作あり dklic runtime /KL1 user program /KL1 KLIC compiler KLIC runtime, dklic runtime, user program /bin
dklicによる遠隔述語呼出しの例 • ping + pingd 逐次部分29行、分散化5行 main(R) :- R=normal(O) | unix:argv([Host | _]), % pingd:pingd(Ts) @node(Host), remote:call(pingd:pingd(Ts), Host), O = [fwrite(Host), fwrite(": pinging.\n") | O1], putt(0, 0, Ts, O1).
ノード毎に1個 pingd(Ts) stub skeleton Ts=[T|Ts1] ping pingd 遠隔述語呼出しの仕組み KLIC runtime KLIC runtime
分散論理変数とは X2 X0 X1 X2 X0 X1 異なるノードの論理変数を対応付けて同じ実体とする。
分散論理変数の実装方針 • 分散論理変数の用途 • メッセージ通信 • 送信したデータは原則として読まれる • 1対1、プッシュ型が基本 • (大きな)データの共有 • 1対多、プル型が基本 • プル要求は(KL1では)感知できない • プル型では分散GCが重要 • データサーバを要求駆動型に記述すれば,プッシュ型でプル型などさまざまな配送ポリシーが実現可能 • dklicでは1対1、プッシュ型を基本に • cf. 並列KLIC (プル型)、Distributed Oz (1対多)
変数表を用いた分散論理変数の実現 • 変数表 • IDを用いて別ノードの内部変数どうしを対応付け • (スタブ、スケルトンの子)の対ごとに1対 • 分散論理変数に対する操作 • 生成: 変数表エントリの対の作成 • 具体化: 単一化ゴールの送信 (分散単一化) • ノード内はKLIC実行系任せ • 参照の輸出入 • IDの重複を避けてノード別の輸出ID空間
pingd(_0) ソケット _0 _0 X0 論理変数の輸出入 輸出側がIDを発行 X0 X
_0=[0,_2|_4] _2 _2 X1 X1 _4 _4 X2 X2 _2=0 分散論理変数の単一化 X0 =[0,X1|X2] [0,X1|X2]=X0 _0 _0 =0 0= [2,X3|X4]=
分散論理変数の削除 • 削除しないと • 変数表は単調増加する • 内部変数が参照され続け、GCされない • プッシュ型なので具体化と同時に削除可能 • IDの再利用 • 使用済みIDを発行ノードに返却する • 発行側が具体化するなら即時再利用可能
_0=[0,_2|_0] =[0,Y1|Y2] _2 _2 Y1 =0 0= X1 _2=0 Y2 X2 分散変数管理の最適化 Y0 [0,X1|X2]=X0 _0 _0
第三者による中継 Node1 agent(X,1) 輸出 X 間接参照 を輸出 X Node0 agent(X,0), client(X) Node2 agent(X,2) X 直接参照 agent(X,N) :- (condition) | agent(X,N+1)@node(N+1).
第三者による中継の排除 • KL1による実装では,第三者による中継を排除できない • 未定義変数どうしの同一性を検査できない • p(X,X) :- true | … • 変数への参照数を感知できない • 解決策: • generic object機構(C言語によるKLICの拡張)を用いて未定義変数の同一性検査を実装 • 静的参照数解析により,中継ノードに参照が残らないことを保証
遠隔サーバへの接続 • チャットサーバを遠隔述語呼出しすると • 複数の接続をまたいでサーバの履歴を残すことができない • クライアント別の履歴ではチャットにならない • 既存の遠隔サーバへの接続が必要 • 遠隔述語呼出しによるプロセス生成だけでは不十分
遠隔サーバの仕組み KLIC runtime KLIC runtime chatd(I,O) stub skeleton 検索 登録 chatd I, O chat getl, putl
サービス検索 • サービス名によってサービスストリームを要求する。 • service_name(S)メッセージを適切なノードの実行系に送信すれば良い。 • 既存のサーバがサービスを生成する。 • 遠隔述語呼出しでは、スケルトンがサービスを生成する。
まとめと今後の課題 • ネットワーク透過な遠隔述語呼出しを低コストで実現した。 • 今後の課題 • KLICのgeneric object機構と静的解析を用いた分散変数管理の最適化 • ネットワーク透過な遠隔サーバへの接続の実現 • 実装および安全性保証への検証技術の適用
その他 • 失敗(例外)の原因 • 単一化の失敗,ゼロ除算,配列参照,メモリ不足,計算時間超過,node failure,入出力エラー • 対策はいろいろな角度から • 静的モード解析(cf. 単一化の安全性) • JIT検証(cf. proof carrying code) • 例外処理機構(cf. 荘園)の設計 • フォールトトレランス 静的 動的