本研究室では分散プログラミングと並列プログラミングのツールを開発してきた。
分散プログラミング用のFederated Lidnaこれらの経験から並列分散を統一的に扱えるプログラミングフレームワークを考えたい。
並列プログラミング用のCerium
そこで、
data segment と code segment で書くというのを考えた
Java で実装して評価した
並列実行単位の記述
プロトコルの記述
実用的な実装
高い対障害性
Scalability
実験環境の用意
Version up への対応
多言語対応
検証や証明への対応
データの塊である Tuple を使って通信するフレームワーク
in Tuple を取り出すin, out で待ち合わせを行う
out Tuple 書きだす
Tuple のキーが文字列でわかりやすい (良)
切断に強い (良)
記述部分がスパゲティになりやすい (悪)
call back を使うと、さらにダメな記述に (悪)
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);
}
Task 単位で並列実行するツール
Task を作って scheduler に投入
Task のデータは暗黙に通信される
Open CL 、Spurs Engine などの実装がある
アセンブラ的なので性能は出やすい (良)
Task の依存関係は自分で管理 (悪)
データ構造は基本的に配列になりやすい (悪)
Task 管理部分が極めて複雑になる (悪)
{
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();
}
Task 依存は、Tuple の依存で決まる
コードをTaskに分割する
Code SegmentデータをTupleに分割する
Data SegmentCode と Data は双対になるはず
input data segment は書き込みを待つ
Local DS Managerはノード固有のKey Value Storeであり、Remote DS Managerは他のノードのLocal DS Managerのproxyである。
public Receiver ds1 = ids.create(CommandType.TAKE);key の設定
ds1.setKey("finish");output data segment の書き出し (put と update)
ods.put("local", "finish", ValueFactory.createNilValue());これらを用いてデータの送受信を行う。
import org.msgpack.annotation.Message;
@Message
public class FishPoint {
public float x = 0.0f;
public float y = 0.0f;
public float z = 0.0f;
}
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);
}
}
複数の魚が複数のディスプレイ上を移動する。
魚のうち一匹はクライアントが操作することができる。
トポロジーはツリー状に構成してある。
MessagePack を使って Marshaling
応答よりもスループット重視
SEDA でレスポンスをはかっちゃだめだろう?
SEDA はCPU食い。Core Duo とかで全然ダメ。
なので、Core i7 を用意しました。
マシン台数 | 8台 |
CPU | Intel(R) Xeon(R) X5650 @ 2.67GHz |
物理コア数 | 12 |
論理コア数 | 24 |
CPU キャッシュ | 12MB |
Memory | 132GB |
Single threaded な Federated Linda に負けている
スレッドプールを使わないほうが、Ringの結果は良い<
CS/DS の関係を CS 内部に書くのはダメな戦略?
MessagePack
Key
Java
拡張性
今回Code SegmentとData Segmentによる並列分散フレームワークのJavaによる実装を示した。実装でしかえられない知見を得ることができた。
今回Javaによる実装を行ったがJavaがAliceの実装に不向きであるということもわかった。
今回はノード内の並列実行やGPGPUによる並列実行などは考慮していない。将来的にそれを含め実装をしていきたい。