# 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の紹介
-
- プログラムの記述方法
-
- 水族館の例題と性能評価
-
- まとめと課題
-
-
---Alice
-
-Alice は本研究室で開発を行なっている分散タスク管理フレームワークである。
-Cell用のOpen CL に似たTask管理用フレームワークCeriumと
- Lindaを相互接続した分散フレームワークであるFederated Lindaの開発を通して得られた知見を生かされている。
-
-
---Cerium
-
-Ceriumは当研究室で開発を行なっている並列プログラミングフレームワークである。
-CeriumではTaskを小さく分割して並列実行し、データ転送はパイプライン実行により隠される。
-Taskには依存関係がありデータの依存関係がそのままTaskの依存関係になることが多い。
-繰り返し使われるデータの管理が重要であり、実行時にわかるデータ構造間の依存関係がTaskを複雑にしている。
-
-
---Data Segment API
-
-Data Segmentは数値や文字などのデータを構造体的に保持するが、分散プログラムにおいてData Segmentの相互参照が問題になってくる。
-AliceではData SegmentにユニークなKeyを持たせ、Key Value Storeとして扱っている。Key毎のキューがあり、Key毎に順に実行される。
-
-
-
-
-
-
-
---Data Segment API
-
-Data Segmentを管理するのが、Data Segment Manager
- 各ノード毎に、Local DS ManagerとRemote DS Managerが存在する。
-Local DS Managerはノード固有のKey Value Storeであり、Remote DS Managerは他のノードのLocal DS Managerのproxyである。
- AliceのTopology Managerが自動的に構成する。
-
-
-
-
-
-
---Data Segment API
-
- 以下が用意されているData Segment APIである。
-- void put(String key, Value val)
-- void update(String key, Value val)
-- void peek(Receiver receiver, String key)
-- void take(Receiver receiver, String key)
-これらを用いてデータの送受信を行う。
-
-
---Data Segment API - put
-
-
-
-
-
-
---Data Segment API - update
-
-
-
-
-
- putと異なる点は先頭データを削除し、データを追加する。
-
-
---Data Segment API - peek
-
-
-
-
-
- peekはデータを取得しreceiverに渡す。
-
-
---Data Segment API - peek
-
-
-
-
-
---Data Segment API - take
-- データを取得して取得されたデータはdequeueされる
-
-
-
-
-
---Data Segmentの実装
-
- Data Segmentのデータ表現はMessagePackを使用。
-
-
-
-Data Segment APIでは
- MessagePack for javaのValueオブジェクトを使用
- MessagePackのバイナリにシリアライズできる型のみで
- 構成されているため自己記述式のデータ形式
-
-
---Data Segmentの実装
-
-
---CodeSegment
-
-- Code Segmentはタスクのこと
-- ユーザーが記述する際にCode Segment内で使用する
Data Segmentの作成を記述
-- Input Data SegmentとOutput Data Segmentを作るAPI
-- 必要なInput Data Segmentが揃った時に実行される
-
-
---Input Data SegmentとOutput Data Segment
-
-- localかremoteを指定
-- Data Segmentに関連付けされているKEYを指定
-
-
-
---Data Segmentの例
-
-
-
---Input Data Segmentの例
-
-
- Receiverの作成
- PEEK,TAKEのどちらかを選択
-
-
-
- 第1引数 マシン名
- 第2引数 Data Segmentに関連付けられているKEY
- 第3引数 index(指定しない場合は先頭データが取得される)
-
-
---Output Data Segmentの例
-
-
- putかupdateのどちらかを選択
-
-
- 第1引数 マシン名
- 第2引数 Data Segmentに関連付けるKEY
- 第3引数 Data Segment
-
-
---Code Segmentの実行方法
-
-
-
-
- AliceにはCのmainに相当するStart Code SegmentというCode Segmentが存在する。
- Start Code SegmentはInput Data Segmentが存在しない。
-
-
---Code Segmentの実行方法
-
-
-
-
- このStart Code Segmentをnewし、executeメソッドを呼ぶことでCode Segmentを実行することができる。
-
-
---Code Segmentの記述方法
-
-
-
- ユーザがCode Segmentを記述する際にはCode Segmentを継承する。
- runの中に実際にさせたい処理を記述する。
-
---Topology Manager
-
- Alice同士の接続トポロジーを管理する。
- トポロジーファイルを読み込み、参加を表明したクライアントに接続すべきクライアントのIPアドレスやポート番号、接続名を送る。
-
-
-
-
-
---Topology Manager
-
- Topology Manager関連の通信は全て、Code Segmentで実装されている。
-
-
---トポロジーファイル
-
-
---トポロジーファイルの記述方法
-
-
---トポロジーファイルの確認方法
-
-
---水族館の例題
-
-
-
-
-
-
-
-
-
---性能比較 - 実験概要
-
- AliceとFederated Linda で性能比較を行った。
+ AliceとFederated Linda で性能比較を行った。
Ring型のトポロジーを構成、メッセージが100周する時間を計測。
1周あたりの平均時間を求めた。
-
-
-
+
+
パケットのサイズは10byte,10Kbyte,100kbtyeで実験
-
+
+--何故 Ring?
+
+なぜ、不利なベンチマークを取るのか?
---実験環境
-
- ブレードサーバー上の仮想マシンによる仮想クラスタ環境を用いて実験した。
-ブレードサーバー詳細
+SEDA でレスポンスをはかっちゃだめだろう?
+
+SEDA はCPU食い。Core Duo とかで全然ダメ。
+
+なので、Core i7 を用意しました。
+
マシン台数 |
@@ -344,79 +240,34 @@
132GB |
-
-
---実験環境
-
-仮想クラスタ詳細
-
-
-マシン台数 |
-48台 |
-
-
-CPU |
-Intel(R) Xeon(R) X5650 @ 2.67GHz |
-
-
-物理コア数 |
-2 |
-
-
-論理コア数 |
-4 |
-
-CPU キャッシュ |
-12MB |
-
-
-Memory |
-8GB |
-
-
-
+
+
+--実験結果 小さいデータ
+
+10byte
+
+
+Single threaded な Federated Linda に負けている
+
+--実験結果 大きなデータ
---実験結果
-
-10byte
-
-
-
---実験結果
-
-10kbyte
-
-
-
---実験結果
-
100kbyte
-
+
データ量が増えると差が縮まっている。これはここの通信の手間の影響が大きことを示している。
-
---評価と考察
-
- 今回の実装はJavaによりCode SegmentとData Segmentに必要なAPIを洗い出すものだった。この実装でも問題をいくつか発見した。
-API
-- Class継承したりData Segmentの作成にFactory objectを使うのはJavaを使う際の技術的な問題
-- JavaのObject指向な記述が全体を煩雑にしている部分がある
-- updateはData Segmentの競合的な更新に使われるべきだと思われる
-
-
---評価と考察
-SEDA
-
-- Federated Lindaに比べ遅い原因の一つはSEDA architectureのせいと思われる
-- SEDAはスループット重視の実装であり、多段パイプラインのせいでレスポンスが遅れてしまう
-
-
-
---評価と考察
-
-- スレッドプールを使わないほうが、Ringの結果は良い
-
-
+
+--実験結果 スレッドプールなし
+
+スレッドプールを使わないほうが、Ringの結果は良い<
+
+
+
+--わかりやすい記述になったのか?
+
+Input DS と Output DS の記述が対称にならない
+
+CS/DS の関係を CS 内部に書くのはダメな戦略?
+
--評価と考察
MessagePack