# HG changeset patch # User Shinji KONO # Date 1357884959 -32400 # Node ID bb43d09406e19ffef9ba7692c1e9d0f561709650 # Parent fcf3b09ef1a3daf0fa3bd79fa4dbf6703397628b final diff -r fcf3b09ef1a3 -r bb43d09406e1 presen/.DS_Store Binary file presen/.DS_Store has changed diff -r fcf3b09ef1a3 -r bb43d09406e1 presen/alice-presen.ind --- a/presen/alice-presen.ind Fri Jan 11 09:58:57 2013 +0900 +++ b/presen/alice-presen.ind Fri Jan 11 15:15:59 2013 +0900 @@ -11,12 +11,20 @@ これらの経験から並列分散を統一的に扱えるプログラミングフレームワークを考えたい。 +そこで、 + + data segment と code segment で書くというのを考えた + Java で実装して評価した + --並列分散フレームワークには何が求められるのか 並列実行単位の記述 プロトコルの記述 実用的な実装 + 高い対障害性 + Scalability 実験環境の用意 + Version up への対応 多言語対応 検証や証明への対応 @@ -27,298 +35,186 @@ in Tuple を取り出す out Tuple 書きだす +in, out で待ち合わせを行う + --Federated Linda の Pros and Cons +in/out のAPIさえあれば良いので、言語独立 (良) + +Tuple のキーが文字列でわかりやすい (良) + +切断に強い (良) + +記述部分がスパゲティになりやすい (悪) + +call back を使うと、さらにダメな記述に (悪) + +--Linda の だめな記述の例 + + left.in(Up, new PSXCallback() {public void callback(ByteBuffer reply) { + if (debug) System.out.println("Up from left at"+nodeId); + left.in(Up,this); + leftWaiter.add(reply); + checkSend(ml); + } + --Cerium Task 単位で並列実行するツール +Task を作って scheduler に投入 + +Task のデータは暗黙に通信される + +Open CL 、Spurs Engine などの実装がある + --Cerium の Pros and Cons +Task は短く単純になる (良) + +アセンブラ的なので性能は出やすい (良) + +Task の依存関係は自分で管理 (悪) + +データ構造は基本的に配列になりやすい (悪) + +Task 管理部分が極めて複雑になる (悪) + +--Cerium の だめな記述の例 + + { + int i = half_num-1; + + if (s->bsort[i]) manager->free_htask(s->bsort[i]); + s->bsort[i] = manager->create_task(QUICK_SORT, + (memaddr)&s->data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num, + (memaddr)&s->data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num); + s->bsort[i]->flip(); + s->bsort[i]->set_cpu(GPU_0); + s->bsort[i]->set_param(0,(memaddr)last_half_block_num); + } + + for (int i = 0; i < half_num; i++) { + s->bsort[i]->wait_for(s->fsort[i]); + s->bsort[i]->wait_for(s->fsort[i+1]); + s->bsort[i]->no_auto_free(); + s->bsort[i]->spawn(); + } + + +--Linda と Cerium の良いとこ取りをしたい + +Task 依存は、Tuple の依存で決まる + +コードをTaskに分割する + Code Segment + +データをTupleに分割する + Data Segment + +Code と Data は双対になるはず + --Data segment と Code Segment +Code segment には input data segment と output data segment がある + +
+ --Java Implmentation : Alice +data segment は key (strig) でアクセスされる + +input data segment は書き込みを待つ + +--Local / Remote data segment Manager + +Data Segmentを管理するのが、Data Segment Manager 各ノード毎に、Local DS ManagerとRemote DS Managerが存在する。 + +Local DS Managerはノード固有のKey Value Storeであり、Remote DS Managerは他のノードのLocal DS Managerのproxyである。 + +
+ --CS/DS API ---Alice Architecture +input data segment の作成 (PEEKとTAKE) + public Receiver ds1 = ids.create(CommandType.TAKE); +key の設定 + ds1.setKey("finish"); +output data segment の書き出し (put と update) + ods.put("local", "finish", ValueFactory.createNilValue()); + +これらを用いてデータの送受信を行う。 + +--Data segment の型 + +MessagePack を使用すると、そのままオブジェクトを data segment に使える + + import org.msgpack.annotation.Message; + @Message + public class FishPoint { + public float x = 0.0f; + public float y = 0.0f; + public float z = 0.0f; + } + + +--Example ---Sample Application + public class SendWidth extends CodeSegment { + Receiver width = ids.create(CommandType.PEEK); + @Override + public void run() { + int width = this.width.asInteger(); + ods.put("parent", "widths", width); + System.out.println("send widths: " + width); + SendWidth cs = new SendWidth(); + cs.width.setKey("local", "width", this.width.index); + } + } + + +--Sample Application 水族館の例題 + +複数の魚が複数のディスプレイ上を移動する。 + +魚のうち一匹はクライアントが操作することができる。 + +トポロジーはツリー状に構成してある。 +
+ +--CS/DS Java 版 Alice + +Java で SEDA をしようして実装 + +MessagePack を使って Marshaling + +--SEDA + +Thread pool を使ったパイプラインによるサーバ実装 + +応答よりもスループット重視 + +
--Experiment ---Ring - - - - - -に置いて、タスクをCode Segment、データをData Segmentという単位に分割して記述する方法を提唱している。

-

しかし、前述したプログラムをプログラマーが一から記述していくことは大変である。

-

そこで、本研究室の卒業生である赤嶺一樹氏が分散ネットフレームワークAliceのプロトタイプを作成した。

-

本研究では実際にAliceを利用して、水族館の例題を作成した。また、Federated Lindaとの性能比較を行った。そして、Aliceの問題点の洗い出し、APIの見直しを行った。

- ---発表内容 - - ---Alice -