annotate Paper/alice.ind @ 31:32b555e8fb6f

minor change
author e095732 <e095732@ie.u-ryukyu.ac.jp>
date Fri, 21 Dec 2012 15:32:46 +0900
parents dc453f4c4acf
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
5a5db338e71c add mind map
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 -title: Code Segment と Data Segment によるプログラミング手法
5a5db338e71c add mind map
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
3 -author: 河野 真治, 杉本 優
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
5 -abstract:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
6
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
7 データをData Segment、タスクをCode Segmentという単位に分割して記述する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
8 分散ネットフレームワーク Alice を作成した。Alice によるプログラミング例を示すと共に、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
9 本研究室で従来使ってきた Federated Linda との比較も示し、Java による実装について考察する。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
11 -abstract-e:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
12
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
13 We have developed an distributed programming frame Alice, which uses Data Segment and Code Segment as programming units.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
14 We show programming examples and comparisons with our old framework, Federated Linda. We show some consideration about
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
15 our Java implementation.
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
18
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
20 --分散ネットフレームワークAlice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
21
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
22 Alice\cite{kono11g}は、本研究室で開発を行なっている並列タスク管理フレームワーク である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
23 Cell 用の Open CL に似た Task 管理フレームワークCerium\cite{kono09b,cerium-sourceforge} と、Linda\cite{linda} を相互接続した分散フレームワークである Federated Linda\cite{kono05b} の開発を通して得られた知見を生かされている。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
24
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
25 Cerium では、Taskを小さく分割して並列実行し、データ転送はパイプライン実行により隠される。Taskには依存関係があり、その記述は煩雑になるが、実際にはデータの依存関係がそのまま Task の依存関係になることが多い。繰り返し使われるデータ構造の管理が重要であり、実行時にわかるデータ構造間の依存関係が Task を複雑にしている。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
26
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
27 Federated Linda では、Linda サーバ内部に Meta Engine と呼ばれる Linda のタプル(データ構造)をやり取りする部分を作成した\cite{kono10d}。Meta Engine では、タプルのやり取りによって起動する call back を使うが、call back による記述が分散してしまい、可読性を落としてしまう。また、複数のタプルの待ち合わせが重要だが、その待ち合わせは single threaded な Meta Engine 内部の状態に依存する。
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
28
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
29 これらが示しているのは、並列分散実行はコードの並列実行だけでなく、データの単位が重要だということである。そこで、 AliceはData SegmentとCode Segmentという単位でデータと処理を細かく分割し、それぞれの依存関係を記述して分散プログラムを作成する。Code Segment は Continuation based C の実行単位\cite{kono00a,cbc-sourceforge} であり、その双対が Data Segment である。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
30
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
31 Data Segment は Code Segment と分離されたデータ構造であり、オブジェクトではない。オブジェクト指向プログラミングが状態を複雑に持ち、並列実行や分散実行に向かないことは徐々に理解されてきている。一方で、状態自体は有限状態遷移機械(Finite State Machine/FSM) で記述するのが自然である。Code Segment は状態遷移記述そのものであり、その状態遷移は Data Segment の到着によってトリガーされる。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
32
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
33 カプセル化されたデータをプロセスがやり取りするのは、DFD(Data Flow Diagram)の古典的な手法であり、それ自体は新しくはない。むしろ、メインフレーム上でのソフトウェア開発に良く使われてきた手法である。Alice では、それを再実装する。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
34
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
35 Alice は Code Segment と Data Segment を Java と Message Pack で実装したフレームワークである。トポロジーマネージャーを持ち、Blade 上での
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
36 分散プログラムの実験を容易に行うことができる。また、SEDA Architecture \cite{SEDA2001} を採用しており、マルチコア上でのスループットの向上を期待している。
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
37
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
38 本論文では、Code Segment と Data Segment の Alice のAPIと、その設計方針を示し、それによって実装された水族館プログラムを示す。また、これまでの Federated
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
39 Linda との性能評価も行う。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
40
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
41 % また、他のマシンとの接続トポロジーの構成の機能も有しているのでユーザーはトポロジー構成後の処理を記述するだけでよい。また、AliceはJavaで実装されている。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
42
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
43 --Data Segment API
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
44
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
45 Data Segment は数値や文字列などのデータを構造体的に保持するが、Data Segment の相互参照が問題になる。
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
46 AliceではData Segmentをデータベースとして扱い、Data Segment は必ずキーを持つ。つまり、Data Segment を Key Value Store として考えることができる。
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
47 通常のデータベースでは隠れているが、Key 毎のキューがあり、Key 毎に順に実行される。key 毎の追加と取得は、Linda に準じた設計になっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
48
31
32b555e8fb6f minor change
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
49 Data Segmentを管理するのがData Segment Managerである。ノード毎に local DS manager と remote DS manager がある。local DS manager は、ノードに固有の
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
50 key Value Store と考えることができる。したがって Key はノード内部で unique な文字列である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
51
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
52 remote DS manager は他のノードのlocal DS manager の proxy である。Alice のトポロジーマネージャーが remote DS manager を自動的に構成する。つまり、remote DS manager は複数あって、それぞれ対応するノードが異なる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
54 Key Value Store へのアクセスはキューによって、ノード内部で逐次化される。それ以外は、すべて Java の Thread pool により並列実行される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
55 Code Segment が実行される時には、Data Segment はすべて手元に揃っているので、Blocking が起きることはない。逆に、Blocking が必要な場合は、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
56 Code Segment を分割する必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
57
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
58 以下が用意されているData Segment APIである。これらを用いてデータの送受信を行う。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
59 \begin{itemize}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
60 \item {\ttfamily void put(String key, Value val)}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
61 \item {\ttfamily void update(String key, Value val)}
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
62 \item {\ttfamily void peek(Receiver receiver, String key}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
63 \item {\ttfamily void take(Receiver receiver, String key)}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
64 \end{itemize}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
66
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
67 ---put
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
68
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
69 {\tt put} はデータを追加するための API である。Key Value Store のキューに追加される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
70 (図 \ref{fig:put})
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
71
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
72
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
73 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
74 %\begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
75 \scalebox{0.6}{\includegraphics{images/put.pdf}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
76 %\end{center}
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
77 \caption{putはデータを追加する}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
78 \label{fig:put}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
79 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
80
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
81 ---update
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
82
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
83 {\tt update} はデータを置き換えるための API である。キューの先頭を置き換える特急メッセージのように動作する。
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
84 (図 \ref{fig:update})
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
85
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
86
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
87 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
88 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
89 \scalebox{0.6}{\includegraphics{images/update.pdf}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
90 \end{center}
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
91 \caption{updateはキューの先頭を書き換える}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
92 \label{fig:update}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
93 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
94
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
95 ---peek
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
96
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
97 {\tt peek はデータを調べる}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
98
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
99 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
100 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
101 \scalebox{0.6}{\includegraphics{images/peek.pdf}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
102 \end{center}
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
103 \caption{peekはデータを調べる}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
104 \label{fig:peek}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
105 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
106
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
107 最新のData Segment がなければ、Code Segmentの待ち合わせ(Blocking)が起きる。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
108 (図 \ref{fig:no_peek})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
109
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
110 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
111 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
112 \scalebox{0.6}{\includegraphics{images/peek1.pdf}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
113 \end{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
114 \caption{希望のデータが無いときは保留する}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
115 \label{fig:no_peek}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
116 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
117
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
118 {\tt put} や {\tt update} によりData Segment の更新があれば、 {\tt peek} が直ちに実行される。つまり、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
119 Data Segment を作成した Code Segment が active queue に移される。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
120
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
121 ---take
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
122
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
123 {\tt take} もデータを読み込むための API である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
124 読み込まれたデータは Key Value Storeのキューから取り除かれる。これは、Linda の in() に相当する。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
125 (図 \ref{fig:take})
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
126 必要な待ち合わせが行われる。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
127
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
128 \begin{figure}[tp]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
129 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
130 \scalebox{0.6}{\includegraphics{images/take.pdf}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
131 \end{center}
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
132 \caption{take はデータを読み込む}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
133 \label{fig:take}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
134 \end{figure}
6
5a5db338e71c add mind map
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
136 --Data Segmentの実装
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
137
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
138 Data Segmentのデータの表現にはMessagePackを利用している。
24
bfce690dd189 correct a mistake
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
139 MessagePackに関してJavaにおけるデータ表現は以下の3段階あり、これらのデータ表現は制限を伴うが互いに変換可能である。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
140
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
141 \begin{itemize}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
142 \item {\ttfamily 一般的なJavaのクラスオブジェクト}
24
bfce690dd189 correct a mistake
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
143 \item {\ttfamily MessagePack for JavaのValueオブジェクト}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
144 \item {\ttfamily byte[]で表現されたバイナリ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
145 \end{itemize}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
146
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
147 Data Segment APIでは、このMessagePack for JavaのValueオブジェクトを用いてデータが表現されている。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
148 MessagePackはJavaのように静的に型付けされたオブジェクトではなく、自己記述なデータ形式である。MessagePack for JavaのValueオブジェクトはMessagePackのバイナリにシリアライズできる型のみで構成されたJavaのオブジェクトである。そのため、Valueも自己記述式のデータ形式になっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
149
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
150
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
151 Valueオブジェクトは通信に関わるときには、シリアライズ・デシリアライズを高速に行うことができる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
152 また、ユーザーはメソッドを用いてオブジェクト内部のデータを閲覧、編集することができる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
153
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
154
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
155 ユーザーが一般的なクラスをIDL(Interface Definition Language)のように用いてデータを表現することができる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
156 この場合、クラス宣言時に@Messageというアノテーションをつける必要がある。(ソースコード \ref{fig:MessagePackTest})もちろん、MessagePackで扱うことのできるデータのみをフィールドに入れなければならない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
157 \begin{table}[htbp]
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
158 \lstinputlisting[label=fig:MessagePackTest, caption=一般的なクラスをIDLのように使用]{source/MessagePackTest.java}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
159 \end{table}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
160
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
161 --Code Segment
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
162
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
163 Code Segmentはタスクのことである。Code Segmentをユーザーが記述するときに、Code Segment 内で使用するData Segment の作成を記述する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
164 Code Segment には、Input Data Segment と Output Data Segment を作る API が存在する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
165
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
166 Input Data Segment で作成された Data segment は、remote か local かと、key を指定する必要がある。Input Data Segment がすべて揃わないと
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
167 Code Segment は active にならない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
168
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
169 Output Data Segment で作成された Data segment にも、remote か local かと、key を指定する必要がある。Input/Output が Code Segment 間の
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
170 依存関係を自動的に記述することになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
171
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
172 \begin{table}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
173 \lstinputlisting[label=fig:SendWidth, caption=Data Segment の例]{source/SendWidth.java}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
174 \end{table}
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
175
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
176 {\tt ids,ods} により、Input/Output を選択して Data Segment を作成する。Output には put 時にキーを指定する(図\ref{fig:SendWidth})。Input は setKey を使ってキーを指定する。
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
177 もちろん、{\tt cs.width} のようにアクセスするのは Java 的には正しくない書き方であり避けるべきである。{\tt SendWidth} は Code Segment であり、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
178 Data Segment が揃った時に、 {\tt Runnable} のように実行される。{\tt SendWidth} 内部で setKey する方が Java 的には望ましい。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
179
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
180 どの時点でキーとノードを指定するか、どのようなAPIを用意するべきかは、まだ、議論の余地がある。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
181
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
182 --Code Segmentの実行方法
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
183
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
184 Alice には、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
185 Start Code Segment (ソースコード \ref{fig:StartCodeSegment})というC の main に相当するような最初に実行される Code Segment がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
186 Start Code SegmentはどのData Segmentにも依存しない。つまりInput Data Segmentを持たない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
187 このCode Segmentをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。(ソースコード \ref{fig:TestLocalAlice})
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
188
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
189
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
190 \begin{table}[tb]
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
191 \lstinputlisting[label=fig:TestLocalAlice, caption=Start Code Segmentを実行させる方法]{source/TestLocalAlice.java}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
192 \end{table}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
193
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
194 --Code Segmentの記述方法
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
195
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
196 Code Segmentをユーザーが記述する際にはCode Segmentを継承して記述する。(ソースコード \ref{fig:CodeSegment})そのCodeSegmentはInputDataSegmentManagerとOutputDataSegmentManagerを利用することができる。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
197
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
198 \begin{table}[tb]
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
199 \lstinputlisting[label=fig:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
200 \end{table}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
201
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
202 \begin{table}[tb]
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
203 \lstinputlisting[label=fig:CodeSegment, caption=CodeSegmentの例]{source/TestCodeSegment.java}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
204 \end{table}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
205
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
206 InputDataSegmentManagerはCode Segmentの{\tt ids}というフィールドを用いてアクセスする。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
207 \begin{itemize}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
208 \item {\ttfamily Receiver create(CommandType type)}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
209 \end{itemize}
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
210 createでコマンドが実行された際に取得されるData Segmentが格納される受け皿を作る。引数にはCommandTypeが取られ、指定できるCommandTypeは{\tt PEEK}または{\tt TAKE}である。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
211 \begin{itemize}
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
212 \item {\ttfamily void setKey(String managerKey, String key)}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
213 \end{itemize}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
214 setKeyメソッドにより、どこのData Segmentのあるkeyに対してpeekまたはtakeコマンドを実行させるかを指定することができる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
215 コマンドの結果がレスポンスとして届き次第Code Segmentは実行される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
216
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
217
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
218 OutputDataSegmentManagerはCode Segmentの{\tt ods}というフィールドを用いてアクセスする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
219 OutPutDataSegmentManagerは{\tt put}または{\tt update}を実行することができる。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
220 \begin{itemize}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
221 \item {\ttfamily void put(String managerKey, String key, \\ Value val)}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
222 \item {\ttfamily void update(String managerKey, String key, Value val)}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
223 \end{itemize}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
224
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
225 --Topology Manager
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
226
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
227 Alice は複数のノードで構成され、相互に接続される。通信するノードは、URLなどにより直接指定するのではなく、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
228 TopologyManagerによって管理される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
229
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
230 TopologyManager関連の通信処理はCode Segmentで実装してある。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
231 TopologyManagerはトポロジーファイルを読み込み、参加を表明したクライアント(以下、Topology Node)に接続するべきクライアントのIPアドレスやポート番号、接続名を送り、トポロジーファイルに記述された通りにトポロジーを作成する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
232
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
233 Code Segment 内部で remote DS manager にアクセスする場合は、Topology Manager によって指定されたノード内部だけで有効なlabel(文字列)を使う。これにより、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
234 特定のURLが Code Segment 内部に記述されることを防いでいる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
235
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
236 ---Topology Managerの設定ファイル
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
237
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
238 Topology Managerはトポロジーファイルを読み込むが、トポロジーファイル自体はDOT Language\cite{graphviz}という言語で記述される。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
239 DOT Languageとはプレーンテキストを用いて、データ構造としてのグラフを表現するための、データ記述言語の一種である。このDOT Languageのグラフを利用して、クライアント間の接続を表現する。DOT Languageファイルはdotコマンドを用いて、グラフの画像ファイルを出力することができるので、記述したトポロジーが正しいことを可視化して確認することができる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
240
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
241 クライアント間の接続にはlabelを用いて名前が割り振られており、この接続名を用いてユーザーはData Segment Managerにアクセスすることができる。
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
242 前述したReceiver にsetKeyを行う際、odsでputまたはupdateする際の引数のmanagerKeyがこれにあたる (図\ref{fig:ring})。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
243
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
244 \begin{table}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
245 \lstinputlisting[label=ring, caption=3台でリングを組んだ時の例]{source/ring.dot}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
246 \end{table}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
247
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
248
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
249
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
250 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
251 \begin{itemize}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
252 \item {\ttfamily dot -T png ring.dot -o ring.png}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
253 \end{itemize}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
254
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
255 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
256 \scalebox{0.6}{\includegraphics{images/ring.pdf}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
257 \end{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
258 \caption{dotコマンドで作成された3台で構成されたリングのグラフ}
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
259 \label{fig:ring}
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
260 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
261
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
262
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
263 Alice の Nodeを起動する際にコマンドライン引数としてTopology ManagerのIPアドレスとポート番号を指定をする。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
264 そしてmain関数内でTopologyNodeをnewを行えば良い。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
265 TopologyNodeの第一引数は Alice デーモンの設定オブジェクト、第二引数はStart Code Segmentである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
266 ここで指定した、Start Code Segmentがトポロジーが完成した後実行される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
267
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
268
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
269 --水族館の例題
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
270
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
271 今回作成した例題は水族館である。複数のクライアントのディスプレイを複数の魚が移動していくものである。魚は画面の端まで移動すると自分の画面上からは消え、別のクライアントの画面の端から魚が出てくる。また、魚のうち一匹はクライアントが直接操作することができる。トポロジーはTopologyManagerによりツリー状に構成してある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
272
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
273 \begin{enumerate}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
274 \item ユーザーが魚を操作するまたはCode Segmentにより魚の座標が更新される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
275 \item 画面に表示させるためのSetLocation (Code Segment)が実行され実際に魚のオブジェクトにセットされ画面に反映される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
276 \item Update(Code Segment)にFishPosition(魚の座標データ)が渡される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
277 \item Updateにlist(送信者リスト)が渡される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
278 \item Updateが実行され、listを元にデータが送信される。ただし、この時にFishPositionには送信元情報が付加されているので、送信元には送信されない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
279 \item 各clientで2 - 4が実行される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
280 \end{enumerate}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
281
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
282 --実験
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
283
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
284 Ring 上のトポロジーを構築して、100周回時間を測定してみた。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
285 マシン48台,CPU Intel(R) Xeon(R) X5650 @ 2.67GHz, 仮想コア数4,CPU キャッシュ12MB。Blade 上の仮想マシン上での測定となっている。
25
dc453f4c4acf correct a mistake
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
286 従来のFederated Lindaよいも若干遅い結果になっている。一部の異常なデータがあるが、データ量が増えると差は縮まっている。これは、コピーの影響よりも、個々の通信の手間の影響が大きいことを示している。
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
287
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
288 \begin{figure}[htbp]
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
289 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
290 \includegraphics[width=70mm]{./images/ring10B.pdf}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
291 \end{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
292 \caption{10 bytes のデータを100周させたときの1周にかかる平均時間}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
293 \label{fig:ring10B}
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
294 \end{figure}
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
295
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
296 \begin{figure}[htbp]
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
297 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
298 \includegraphics[width=70mm]{./images/ring10KB.pdf}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
299 \end{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
300 \caption{10 Kbytes のデータを100周させたときの1周にかかる平均時間}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
301 \label{fig:ring10KB}
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
302 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
303
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
304 \begin{figure}[htbp]
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
305 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
306 \includegraphics[width=70mm]{./images/ring100KB.pdf}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
307 \end{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
308 \caption{100 Kbytes のデータを100周させたときの1周にかかる平均時間}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
309 \label{fig:ring100KB}
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
310 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
311
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
312
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
313
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
314 --評価と考察
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
315
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
316 今回の実装は、Java により Code Segment と Data Segment に必要な API を洗い出すためのものであった。この実装でもいくつかの問題が明らかになっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
317
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
318 {\bf API } Class を継承したり、Input Data segment や Output Data segment の作成に factory object を使うのは Java を使う際の技術的なものであり、Alice のAPI自体は Java に固有である必要はない。むしろ、Java の Object 指向な記述が全体を煩雑にしている部分がある。{\tt update} は、Data Segmentの競合的な更新に使われるべきだと思われる。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
319
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
320 {\bf SEDA } Federated Linad に比べて、通信のレスポンスが遅い原因の一つはSEDA architectureのせいだと思われる。SEDA はスループット重視の実装であり、多段のパイプラインのせいでレスポンスは遅れてしまう。実際、スレッドプールを使用しないほうが、Ring の結果は良くなる(図\ref{fig:ringnothread})。
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
321
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
322 \begin{figure}[htbp]
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
323 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
324 \includegraphics[width=70mm]{./images/ring_notp_10b.pdf}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
325 \end{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
326 \caption{Code Segment のスレッドプールを使用せずに、 10 bytes のデータを回した時の実験結果}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
327 \label{fig:ringnothread}
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
328 \end{figure}
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
329
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
330 レスポンスが要求される部分のスケジューラーを別にするなどの工夫が必要だと思われる。それを記述そのものに入れるのが良いかどうかには議論の余地がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
331
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
332
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
333 {\bf MessagePack } 今回の実装では単純な Message の転送の場合でも MessagePack の decode/encode が必要になる。これは単純に overhead になる。encode/decode 抜きに直接処理できる方が望ましい。また、Data Segment の一部の修正に Data Segment を再構成するのは望ましくない。Cerium では Input Data Segment と Output Data Segment を swap する API があり、若干状況は複雑になるが良好な結果を得ている。この辺りは、ユーザから見えない最適化として実装する方が望ましいが、なんらかの制御方法も必要だと思われる。
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
334
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
335 {\bf Key } 本実装では Data Segment 相互の参照は Key 経由となる。Linda や分散実装では、それは妥当だが、並列実装では、すべての Data Segment を
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
336 Key Value Store
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
337 に格納するのは性能的な問題を引き起こす。一方で、分散記述と並列記述がかけ離れてしまうのも好ましくない。現状は Key Value Store は Java の Concurrent
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
338 Hash map を用いているが、今のベンチマークでは、そこがネックになっているわけではないと思われる。本来は、このKey Value Store は持続性を持つべきだと
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
339 思われるが今回は実装していない。
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
340
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
341 {\bf Java }
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
342 Ring の実験での異常なデータは、Java の分散プログラミングでは良く現れる。一つは Java のGCの影響だと思われる。Alice では、すべての Data Segment
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
343 は Key Value に格納され、実行時の Data Segment は Code Segment が active な時のみにメモリ上にある。この最大値を見積ることは、Active Task の
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
344 量を見積もれば良い。したがって、Alice には Garbage Collection は必要ない。一方で、Key Value Store 上のデータは決して Garbage Collection の
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
345 対象にならない。しかし、それは Garbage Collector には負荷をかけてしまう。つまり、Alice 自体は Java で実装するのには向いていない。
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
346
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
347 {\bf 拡張性}
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
348 分散アプリケーションでのプロトコルは常に変更されるものであり、Alice もそれに対応する必要がある。Alice 上で走るプロトコルは、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
349 Data Segment と Code Segment によって決まる。Key とトポロージーマネージャーをプロトコル毎に別に用意すれば、複数のプロトコルを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
350 同時に走らせることが可能である。プロトコル間の互換性はいろいろあり得る。Data Segment と Code Segment の結びつきは弱いので、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
351 Data Segment に余計な値がある場合、あるいは、値が足りない場合に適切な値を設定することにより、古い Code Segment を変更せずに
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
352 プロトコルを拡張できると考えている。実際、水族館の例題で、2次元と3次元版を両立させることは容易である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
353
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
354
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
355 --まとめと今後の課題
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
356
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
357 今回、Code Segment と Data Segment による並列分散フレームワークの Java による実装を示した。前の設計\cite{kono11g}と異なる部分は、
31
32b555e8fb6f minor change
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
358 実装でしか得られない知見である。
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
359
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
360 Java による実装は、ラピッドプロトタイピングとしては適切であり、例題の記述と基本性能の確認に向いている。一方で、Java が Aliceの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
361 実装に不向きであることもわかってきた。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
362 Code Segment / Data Segment を見たコンパイラ的アプローチ、あるいは実行時最適化などが有効であると思われる。
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
363 あるいは、CbC\cite{cbc-sourceforge} による実装が効果的だと考えている。
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
364
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
365 特に、今回はノード内の並列実行や GPGPU による並列実行などは考慮していないので、将来的には、それを含めた実装をしていきたい。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
366
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
367
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
368
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
369