comparison Paper/sugi-prosym.tex @ 9:25a3002cb1e6

add image and source files
author e095732 <e095732@ie.u-ryukyu.ac.jp>
date Tue, 20 Nov 2012 18:32:20 +0900
parents 5a5db338e71c
children 5818128d5630
comparison
equal deleted inserted replaced
8:602cf60d3c55 9:25a3002cb1e6
1 \documentclass[private]{ipsjpapers} 1 \documentclass[private]{ipsjpapers}
2 \usepackage{listings} 2 \usepackage{listings}
3 \usepackage{graphicx}
4
3 % 巻数,号数などの設定 5 % 巻数,号数などの設定
4 %\setcounter{巻数}{41} 6 %\setcounter{巻数}{41}
5 %\setcounter{号数}{6} 7 %\setcounter{号数}{6}
6 %\setcounter{volpageoffset}{1234} 8 %\setcounter{volpageoffset}{1234}
7 %\受付{12}{2}{4} 9 %\受付{12}{2}{4}
26 \let\endQuote\endlist 28 \let\endQuote\endlist
27 \def\TT{\if@LaTeX@e\tt\fi} 29 \def\TT{\if@LaTeX@e\tt\fi}
28 \def\CS#1{\if@LaTeX@e\tt\expandafter\string\csname#1\endcsname\else 30 \def\CS#1{\if@LaTeX@e\tt\expandafter\string\csname#1\endcsname\else
29 $\backslash$#1\fi} 31 $\backslash$#1\fi}
30 32
31 %\checklines % 行送りを確認する時に使用 33 %style
32 \begin{document}%{
33 % 和文表題
34 \title[Code Segment と Data Segment によるプログラミング手法]%
35 {Code Segment と Data Segment によるプログラミング手法 }
36 % 英文表題
37 \etitle{How to Programming with Code Segment and Data Segment}
38 % 所属ラベルの定義
39 \affilabel{URYUKYU}{琉球大学\\University of the Ryukyu}
40 % 和文著者名
41 \author{河野 真治\affiref{URYUKYU}\member{19841765}\and
42 杉本 優\affiref{URYUKYU}\nomember}
43
44
45 % 英文著者名
46 \eauthor{Shinji Kono\affiref{URYUKYU}\and
47 Yu Sugimoto\affiref{URYUKYU}}
48
49
50 % 連絡先(投稿時に必要.製版用では無視される.)
51 \contact{杉本 優\\
52 〒903-0213 沖縄県中頭郡西原町字千原1番地\\
53 琉球大学 情報工学科\\
54 TEL: (098)895-8723\qquad FAX: (098)895-8727\\
55 email: sugi@cr.ie.u-ryukyu.ac.jp}
56
57 % 和文概要
58 \begin{abstract}
59 本研究室では分散プログラミングにおいて、データをData Segment、タスクをCode Segmentという単位に分割して記述する方法を提唱している。
60 しかし、前述した方法をプログラマーが一から記述することは大変である。そこで、本研究室で分散ネットフレームワーク Alice を作成した。本論文では実際にAliceを用いてCode Segment と Data Segment によるプログラミング手法の例を示す。
61 \end{abstract}
62 % 英文概要
63 \begin{eabstract}
64 \end{eabstract}
65
66 % 表題などの出力
67 \maketitle
68
69 % }{
70
71 % 本文はここから始まる
72 \section{歴史的経緯}
73 本研究室では、並列タスク管理フレームワークCeriumの管理を行なっているが、その設計と実装を行うにあたり、並列プログラミングと分散プログラミング
74 は本質的には同じことを行なっていることが分かった。特にヘテロジーニアスマルチコアであり、ローカルストアをそれぞれのコアが持っているというCell の特異な環境は、分散プログラミング環境と告示している。それらを踏まえて、Ceriumのタスク管理手法を分散に応用できないかと考えた。
75
76
77 Ceriumに置いても、タスクとそれの入出力データの取り扱いは難しい課題である。データを操作するAPIを考えて、タスクを自然に記述し、効率良く実行する方法を考えてきた。そこで考えられた手法が、データをDataSegment、タスクをCodeSegmentという単位に分割して記述する方法である。
78 % }{
79
80 \section{分散ネットフレームワークAlice}\label{sec:ITEM}
81 \subsection{Aliceとは}
82 Aliceは本研究室の卒業生である赤嶺一樹氏が、本研究室で開発を行なっている並列タスク管理フレームワーク Cerium と先行研究である Federated Linda の開発を通して得られた知見を生かされている。
83 Federated Linda の設計はシングルスレッドで行われている。しかし、近年ではマルチコアのマシンが主流となっている。将来的にはメニーコアのマシンが主流になってくると考えられるそのような背景を踏まえてAliceはマルチスレッド向けに設計されている。
84
85 AliceはData SegmentとCode Segmentという単位でデータと処理を細かく分割し、それぞれの依存関係を記述して分散プログラムを作成する。また、他のマシンとの接続トポロジーの構成の機能も有しているのでユーザーはトポロジー構成後の処理を記述するだけでよい。
86 % }{
87 \subsection{Data Segment}
88 AliceではData Semgnetをデータベースとして利用している。KeyValueStoreで実装されており、キーごとにリストを持っている。Data Segment APIを用いることで、リストにデータを追加、削除を適宜行うことができる。
89
90 \subsubsection{Data Segment Manager}
91 大量のData Segmentを管理するのがData Segment Managerである。Data Segment Managerは文字列のキーでData Segmentを整理する。各キーごとにキュー構造を持っている。それらをData Segment APIを用いて操作する。
92 データの読み出し("peek" または "take")時に、希望のデータがなかった場合、ブロッキングを行う機能を持つ。
93 しかし、ブロッキングといってもそこで同期するわけではない。
94 非同期でデータを通信する。
95 そのため、 "peek" と "take" は他の API とは違い、レスポンスが発生する。
96 \subsubsection{Data Segment API}
97 表番号)が用意されているData Segment APIである。これらを用いてデータの送受信を行う。
98 \begin{itemize}
99 \item {\ttfamily void put(String key, Value val)}
100 \item {\ttfamily void update(String key, Value val)}
101 \item {\ttfamily void peek(Receiver receiver, String key, int id)}
102 \item {\ttfamily void take(Receiver receiver, String key, int id)}
103 \end{itemize}
104
105 \subsubsection*{"put"}
106 "put" はデータを追加するための API である。
107
108 "put" は受け取ったデータ val を Data Segment 内のキューに対してエンキューする。
109 この時、キーごとに重複しない連番の ID を受け取った順に振る。
110
111 %(図 \ref{fig:put})
112 \subsubsection*{"update"}
113 "update" はデータを置き換えるための API である。
114
115 "update" はキューの先頭にあるデータをひとつだけ削除する。
116 その後は "put" と同じく、 受け取ったデータ val を Data Segment 内のキューに対してエンキューする。
117 この時、キーごとに重複しない連番の ID を受け取った順に振る。
118 %(図 \ref{fig:update})
119 \subsubsection*{"peek"}
120 "peek" はデータを読み込むための API である。
121
122 "peek" は前回読み込んだデータの id を引数で指定する。省略した場合は、 0 が id として渡される。
123 id よりも値の大きい id のデータがキューに含まれていれば、そのデータを receiver に返す。
124 もし id 以下のデータしか無いならば、データの更新が前回の "peek" 発行時から更新が無いものと考え、リストに格納されて保留される。
125 %(図 \ref{fig:peek})
126
127 "take" や "update" によりデータの更新があれば、 "peek" が直ちに実行される。
128 \subsubsection*{"take"}
129 "take" もデータを読み込むための API である。
130 基本的な id に関する部分は "peek" と同じである。
131
132 "peek" との決定的な違いは、読み込まれたデータは Data Segment 内のキューから取り除かれるということである。
133 %(図 \ref{fig:take})
134
135 %after
136 \lstset{ 34 \lstset{
137 language={java}, 35 language={java},
138 basicstyle={\small}, 36 basicstyle={\small},
139 identifierstyle={\small}, 37 identifierstyle={\small},
140 commentstyle={\small\itshape}, 38 commentstyle={\small\itshape},
151 stepnumber=1, 49 stepnumber=1,
152 numbersep=1zw, 50 numbersep=1zw,
153 lineskip=-0.5ex 51 lineskip=-0.5ex
154 } 52 }
155 53
156 54 %\checklines % 行送りを確認する時に使用
55 \begin{document}%{
56 % 和文表題
57 \title[Code Segment と Data Segment によるプログラミング手法]%
58 {Code Segment と Data Segment によるプログラミング手法 }
59 % 英文表題
60 \etitle{How to Programming with Code Segment and Data Segment}
61 % 所属ラベルの定義
62 \affilabel{URYUKYU}{琉球大学\\University of the Ryukyu}
63 % 和文著者名
64 \author{河野 真治\affiref{URYUKYU}\member{19841765}\and
65 杉本 優\affiref{URYUKYU}\nomember}
66
67
68 % 英文著者名
69 \eauthor{Shinji Kono\affiref{URYUKYU}\and
70 Yu Sugimoto\affiref{URYUKYU}}
71
72
73 % 連絡先(投稿時に必要.製版用では無視される.)
74 \contact{杉本 優\\
75 〒903-0213 沖縄県中頭郡西原町字千原1番地\\
76 琉球大学 情報工学科\\
77 TEL: (098)895-8723\qquad FAX: (098)895-8727\\
78 email: sugi@cr.ie.u-ryukyu.ac.jp}
79
80 % 和文概要
81 \begin{abstract}
82 本研究室では分散プログラミングにおいて、データをData Segment、タスクをCode Segmentという単位に分割して記述する方法を提唱している。
83 しかし、前述した方法をプログラマーが一から記述することは大変である。そこで、本研究室で分散ネットフレームワーク Alice を作成した。本論文では実際にAliceを用いてCode Segment と Data Segment によるプログラミング手法の例を示す。
84 \end{abstract}
85 % 英文概要
86 \begin{eabstract}
87 We suggest that programmers develop a distributed program with splitting data as Data Segment and processing as Code Segment.
88 But it is difficult for programmers to develop on that way from scratch. So We developed distributed network framework 'Alice'.
89 We show example how to programming with Code Segment and Data Segment on this paper.
90 \end{eabstract}
91
92 % 表題などの出力
93 \maketitle
94
95 % 本文はここから始まる
96 \section{歴史的経緯}
97 本研究室では、並列タスク管理フレームワークCeriumの管理を行なっているが、その設計と実装を行うにあたり、並列プログラミングと分散プログラミング
98 は本質的には同じことを行なっていることが分かった。特にヘテロジーニアスマルチコアであり、ローカルストアをそれぞれのコアが持っているというCell の特異な環境は、分散プログラミング環境と告示している。それらを踏まえて、Ceriumのタスク管理手法を分散に応用できないかと考えた。
99
100
101 Ceriumに置いても、タスクとそれの入出力データの取り扱いは難しい課題である。データを操作するAPIを考えて、タスクを自然に記述し、効率良く実行する方法を考えてきた。そこで考えられた手法が、データをDataSegment、タスクをCodeSegmentという単位に分割して記述する方法である。
102
103
104 \section{分散ネットフレームワークAlice}\label{sec:ITEM}
105 \subsection{Aliceとは}
106 Aliceは本研究室の卒業生である赤嶺一樹氏が、本研究室で開発を行なっている並列タスク管理フレームワーク Cerium と先行研究である Federated Linda の開発を通して得られた知見を生かされている。
107 Federated Linda の設計はシングルスレッドで行われている。しかし、近年ではマルチコアのマシンが主流となっている。将来的にはメニーコアのマシンが主流になってくると考えられるそのような背景を踏まえてAliceはマルチスレッド向けに設計されている。
108
109 AliceはData SegmentとCode Segmentという単位でデータと処理を細かく分割し、それぞれの依存関係を記述して分散プログラムを作成する。また、他のマシンとの接続トポロジーの構成の機能も有しているのでユーザーはトポロジー構成後の処理を記述するだけでよい。
110 また、AliceはJavaで実装されている。
111 \subsection{Data Segment}
112 AliceではData Semgnetをデータベースとして利用している。KeyValueStoreで実装されており、キーごとにリストを持っている。Data Segment APIを用いることで、リストにデータを追加、削除を適宜行うことができる。
113
114
115 \subsubsection{Data Segment Manager}
116 大量のData Segmentを管理するのがData Segment Managerである。
117 Data Segment Managerは文字列のキーでData Segmentを整理する。また、各キーごとにキュー構造を持っている。それらをData Segment APIを用いて操作する。
118 データの読み出し("peek" または "take")時に、希望のデータがなかった場合、ブロッキングを行う機能を持つ。
119 しかし、ブロッキングといってもそこで同期するわけではない。
120 非同期でデータを通信する。
121 そのため、データの読み出し時には他の API とは違い、レスポンスが発生する。
122
123 \subsubsection{Data Segment API}
124 以下が用意されているData Segment APIである。これらを用いてデータの送受信を行う。
125 \begin{itemize}
126 \item {\ttfamily void put(String key, Value val)}
127 \item {\ttfamily void update(String key, Value val)}
128 \item {\ttfamily void peek(Receiver receiver, String key,\\ int id)}
129 \item {\ttfamily void take(Receiver receiver, String key,\\ int id)}
130 \end{itemize}
131
132 \subsubsection*{"put"}
133 "put" はデータを追加するための API である。
134 "put" は受け取ったデータ val を Data Segment 内のキューに対してエンキューする。
135 この時、キーごとに重複しない連番の ID を受け取った順に振る。(図 \ref{fig:put})
136
137
138 \begin{figure}[tb]
139 %\begin{center}
140 \scalebox{0.6}{\includegraphics{images/put.eps}}
141 %\end{center}
142 \caption{"put"は重複しないIDを振りながらデータを追加する}
143 \label{fig:put}
144 \end{figure}
145
146 \subsubsection*{"update"}
147 "update" はデータを置き換えるための API である。
148
149 "update" はキューの先頭にあるデータをひとつだけ削除する。
150 その後は "put" と同じく、 受け取ったデータ val を Data Segment 内のキューに対してエンキューする。
151 この時、キーごとに重複しない連番の ID を受け取った順に振る。(図 \ref{fig:update})
152
153
154 \begin{figure}[tb]
155 \begin{center}
156 \scalebox{0.6}{\includegraphics{images/update.eps}}
157 \end{center}
158 \caption{"update"は先頭データを取り除き、重複しないIDを振りながらデータを追加する}
159 \label{fig:update}
160 \end{figure}
161
162 \subsubsection*{"peek"}
163 "peek" はデータを読み込むための API である。
164
165 "peek" は前回読み込んだデータの id を引数で指定する。省略した場合は、 0 が id として渡される。
166 id よりも値の大きい id のデータがキューに含まれていれば、そのデータを receiver に返す。(図 \ref{fig:peek})
167
168 \begin{figure}[tb]
169 \begin{center}
170 \scalebox{0.6}{\includegraphics{images/peek.eps}}
171 \end{center}
172 \caption{"peek"はデータをreceiverに読み込む}
173 \label{fig:peek}
174 \end{figure}
175
176 もし id 以下のデータしか無いならば、データの更新が前回の "peek" 発行時から更新が無いものと考え、リストに格納されて保留される。
177 (図 \ref{fig:no_peek})
178
179 \begin{figure}[tb]
180 \begin{center}
181 \scalebox{0.6}{\includegraphics{images/peek1.eps}}
182 \end{center}
183 \caption{希望のデータが無いときは保留する}
184 \label{fig:no_peek}
185 \end{figure}
186
187 "take" や "update" によりデータの更新があれば、 "peek" が直ちに実行される。
188
189 \subsubsection*{"take"}
190 "take" もデータを読み込むための API である。
191 基本的な id に関する部分は "peek" と同じである。
192
193 "peek" との決定的な違いは、読み込まれたデータは Data Segment 内のキューから取り除かれるということである。
194 (図 \ref{fig:take})
195
196
197 \begin{figure}[tp]
198 \begin{center}
199 \scalebox{0.6}{\includegraphics{images/take.eps}}
200 \end{center}
201 \caption{"peek"はデータをreceiverに読み込む。希望のデータが無いときは保留する。}
202 \label{fig:take}
203 \end{figure}
204
205 \subsubsection{Data Segmentの表現}
206 Data Segmentのデータの表現にはMessagePackを利用している。
207 MessagePackに関してJavaにおけるデータ表現は以下の3段階あり、これらのデータ表現は制限を伴うが互いに変換かのである。
208
209 \begin{itemize}
210 \item {\ttfamily 一般的なJavaのクラスオブジェクト}
211 \item {\ttfamily MessagePack for JavaのValueオブジェクト)}
212 \item {\ttfamily byte[]で表現されたバイナリ}
213 \end{itemize}
214
215 DataSegment APIでは、このMessagePack for JavaのValueオブジェクトを用いてデータが表現されている。
216 MessagePackはJavaのように静的に型付けされたオブジェクトではなく、自己記述なデータ形式である。MessagePack for JavaのValueオブジェクトはMessagePackのバイナリにシリアライズできる型のみで構成されたJavaのオブジェクトである。そのため、Valueも自己記述式のデータ形式になっている。
217
218
219 Valueオブジェクトは通信に関わるときには、シリアライズ・デシリアライズを高速に行うことができる。
220 また、ユーザーはメソッドを用いてオブジェクト内部のデータを閲覧、編集することができる。
221
222
223 ユーザーが一般的なクラスをIDL(Interface Definition Language)のように用いてデータを表現することができる。
224 この場合、クラス宣言時に@Messageというアノテーションをつける必要がある。(ソースコード \ref{fig:MessagePackTest})もちろん、MessagePackで扱うことのできるデータのみをフィールドに入れなければならない。
225 \begin{table}[htbp]
226 \lstinputlisting[label=MessagePackTest, caption=一般的なクラスをIDLのように使用]{source/MessagePackTest.java}
227 \end{table}
157 228
158 \subsection{Code Segment} 229 \subsection{Code Segment}
159 Code Segmentはタスクのことである。Code Segmentをユーザーが記述するときに、Code Segment 内で使用するData Segment を記述し、依存関係を作る。依存関係により、実行される順番が一意に決まる。実際に使用するData Segment はCode Segmentの入出力に相当する。それぞれ、Input Data Segment、Output Data Segmentとする。 230 Code Segmentはタスクのことである。Code Segmentをユーザーが記述するときに、Code Segment 内で使用するData Segment を記述し、依存関係を作る。依存関係により、実行される順番が一意に決まる。実際に使用するData Segment はCode Segmentの入出力に相当する。それぞれ、Input Data Segment、Output Data Segmentとする。
160 \subsubsection{Code Segmentの実行方法} 231 \subsubsection{Code Segmentの実行方法}
161 Code Semgnetを実行するためにはStart Code SegmentというCode Segmentを実行させる必要がある。 232 Code Semgnetを実行するためにはStart Code Segment (ソースコード \ref{fig:StartCodeSegment})というCode Segmentを実行させる必要がある。
162 Start Code SegmentはどのData Segmentにも依存しない。つまりInput Data Segmentを持たない。このCode Segmentをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。 233 Start Code SegmentはどのData Segmentにも依存しない。つまりInput Data Segmentを持たない。このCode Segmentをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。(ソースコード \ref{fig:TestLocalAlice})
234
235
163 \begin{table}[tb] 236 \begin{table}[tb]
164 \lstinputlisting[label=StartCodeSegment, caption=StartCodeSegment]{source/StartCodeSegment.java} 237 \lstinputlisting[label=TestLocalAlice, caption=Start Code Segmentを実行させる方法]{source/TestLocalAlice.java}
165 \end{table} 238 \end{table}
166 239
167 \subsubsection{Code Segmentの記述方法} 240 \subsubsection{Code Segmentの記述方法}
168 Code Segmentをユーザーが記述する際にはCodeSegmentを継承して記述する。そのCodeSegmentはInputDataSegmentManagerとOutputDataSegmentManagerを利用することができる。 241 Code Segmentをユーザーが記述する際にはCodeSegmentを継承して記述する。(ソースコード \ref{fig:CodeSegment})そのCodeSegmentはInputDataSegmentManagerとOutputDataSegmentManagerを利用することができる。
242
243 \begin{table}[tb]
244 \lstinputlisting[label=StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java}
245 \end{table}
246
247 \begin{table}[tb]
248 \lstinputlisting[label=CodeSegment, caption=CodeSegmentの例]{source/TestCodeSegment.java}
249 \end{table}
169 \subsubsection*{InputDataSegmentManager} 250 \subsubsection*{InputDataSegmentManager}
170 InputDataSegmentManagerはCode Segmentのidsというフィールドを用いてアクセスする。 251 InputDataSegmentManagerはCode Segmentのidsというフィールドを用いてアクセスする。
171 \begin{itemize} 252 \begin{itemize}
172 \item {\ttfamily Receiver create(CommandType type)} 253 \item {\ttfamily Receiver create(CommandType type)}
173 \end{itemize} 254 \end{itemize}
194 DOT Languageとはプレーンテキストを用いて、データ構造としてのグラフを表現するための、データ記述言語の一種である。このDOT Languageのグラフを利用して、クライアント間の接続を表現する。DOT Languageファイルはdotコマンドを用いて、グラフの画像ファイルを出力することができるので、記述したトポロジーが正しいことを可視化して確認することができる。 275 DOT Languageとはプレーンテキストを用いて、データ構造としてのグラフを表現するための、データ記述言語の一種である。このDOT Languageのグラフを利用して、クライアント間の接続を表現する。DOT Languageファイルはdotコマンドを用いて、グラフの画像ファイルを出力することができるので、記述したトポロジーが正しいことを可視化して確認することができる。
195 276
196 クライアント間の接続にはlabelを用いて名前が割り振られており、この接続名を用いてユーザーはData Segment Managerにアクセスすることができる。 277 クライアント間の接続にはlabelを用いて名前が割り振られており、この接続名を用いてユーザーはData Segment Managerにアクセスすることができる。
197 前述したReceiver にsetKeyを行う際、odsでputまたはupdateする際の引数のmanagerKeyがこれにあたる。 278 前述したReceiver にsetKeyを行う際、odsでputまたはupdateする際の引数のmanagerKeyがこれにあたる。
198 279
280 \begin{table}[tb]
281 \lstinputlisting[label=ring, caption=3台でリングを組んだ時の例]{source/ring.dot}
282 \end{table}
283
284
285
286 \begin{figure}[tb]
287 \begin{itemize}
288 \item {\ttfamily dot -T png ring.dot -o ring.png}
289 \end{itemize}
290
291 \begin{center}
292 \scalebox{0.6}{\includegraphics{images/ring.eps}}
293 \end{center}
294 \caption{dotコマンドで作成された3台で構成されたリングのグラフ}
295 \label{fig:take}
296 \end{figure}
297
298
199 \subsection{Topology Managerの使用方法} 299 \subsection{Topology Managerの使用方法}
200 Topology Nodeを起動する際にコマンドライン引数としてTopology ManagerのIPアドレスとポート番号を指定をする。 300 Topology Nodeを起動する際にコマンドライン引数としてTopology ManagerのIPアドレスとポート番号を指定をする。
201 そしてmain関数内でTopologyNodeをnewを行えば良い。 301 そしてmain関数内でTopologyNodeをnewを行えば良い。
202 TopologyNodeの第一引数は Alice デーモンの設定オブジェクト、第二引数はStart Code Segmentである。 302 TopologyNodeの第一引数は Alice デーモンの設定オブジェクト、第二引数はStart Code Segmentである。
203 ここで指定した、Start Code Segmentがトポロジーが完成した後実行される。 303 ここで指定した、Start Code Segmentがトポロジーが完成した後実行される。
204 304
205 % }{ 305
206 \section{ゲームの例題}\label{sec:Enum}\label{sec:item} 306 \section{ゲームの例題}
207 \subsection{水族館} 307 \subsection{水族館}
208 今回作成した例題は水族館である。複数のクライアントのディスプレイを複数の魚が移動していくものである。魚は画面の端まで移動すると自分の画面上からは消え、別のクライアントの画面の端から魚が出てくる。また、魚のうち一匹はクライアントが直接操作することができる。トポロジーはTopologyManagerによりツリー状に構成してある。 308 今回作成した例題は水族館である。複数のクライアントのディスプレイを複数の魚が移動していくものである。魚は画面の端まで移動すると自分の画面上からは消え、別のクライアントの画面の端から魚が出てくる。また、魚のうち一匹はクライアントが直接操作することができる。トポロジーはTopologyManagerによりツリー状に構成してある。
209 \subsection{データの伝搬} 309 \subsection{データの伝搬}
210 310
211 \begin{enumerate} 311 \begin{enumerate}