Mercurial > hg > Papers > 2015 > kkb-sigos
comparison presen/index.md @ 19:40686d8028c5
edit
author | Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 26 May 2015 03:46:51 +0900 |
parents | |
children | bb2bf03f09b4 |
comparison
equal
deleted
inserted
replaced
18:9159562b324c | 19:40686d8028c5 |
---|---|
1 title: Monad に基づくメタ計算を基本とする Gears OS の設計 | |
2 author: 小久保翔平 | |
3 profile: 琉球大学大学院修士2年 | |
4 | |
5 # Gears OS の並列性 | |
6 処理とデータの単位として Code Gear, Data Gear を用いる | |
7 | |
8 並列実行の単位となる | |
9 | |
10 処理とデータの関係から依存関係を決定 | |
11 | |
12 Many Core CPU, GPU, Xeon Phi などを有効に利用するためにはそれぞれのアーキテクチャに合わせた記述が必要 | |
13 | |
14 Gears OS では Gear を用いて並列実行環境に合わせた設計・実装を行う | |
15 | |
16 # Gears OS の柔軟性 | |
17 Gear を追加することでデータ拡張や機能の追加が可能 | |
18 | |
19 バージョンが異なる Gears OS でもの Gear 共通部分を用いて通信を行う | |
20 | |
21 # Gears OS の信頼性 | |
22 Code/Data Gear にはメタ計算に必要な情報として Meta Code/Data Gear が付属されている | |
23 | |
24 関数型言語における Monad に相当 | |
25 | |
26 プログラムに対してメタレベルで Model Checking する | |
27 | |
28 元のプログラムに影響を与えない | |
29 | |
30 並列実行時のデッドロック検出 | |
31 | |
32 Code Gear 間での型検査 | |
33 | |
34 # Cerium | |
35 Cerium では Task という分割された処理を依存関係に沿って並列実行する | |
36 | |
37 Task 同士の依存関係はプログラマ自身が記述する | |
38 | |
39 Task の種類が増えるほど記述が複雑になる | |
40 | |
41 Task 間の依存関係にのみ着目 | |
42 | |
43 データの依存関係を正しく保証しない | |
44 | |
45 Task が取り扱うデータに型情報がない | |
46 | |
47 汎用ポインタを型変換して利用 | |
48 | |
49 型検査できない | |
50 | |
51 # Alice | |
52 Alice では処理とデータの単位として Code Segment, Data Segment を用いる | |
53 | |
54 処理とデータの関係から Code Segment 間の依存関係が決定 | |
55 | |
56 Data Segment を待ち合わせて Code Segment を実行することを Computaion と定義 | |
57 | |
58 Computaion を実現する Computaion を Meta Computaion と定義 | |
59 | |
60 切断や再接続時の処理、データの圧縮の機能などが相当 | |
61 | |
62 通常の Computaion に影響しない | |
63 | |
64 Meta Computaion 自体は Alice で記述されていない | |
65 | |
66 Data Segment にアクセスする API が設計上の問題で複雑化している | |
67 | |
68 # Code/Data Gear | |
69 通常レベルとして Code/Data Gear を用いる | |
70 | |
71 ポインタを扱わない | |
72 | |
73 Code Gear は処理そのもの | |
74 | |
75 OpenCL/CUDA の kernel に相当 | |
76 | |
77 接続された複数の Input Data Gear を参照 | |
78 | |
79 単一または複数の Output Data Gear に書き出す | |
80 | |
81 自分が知らない Code/Data Gear は名前で指し示す | |
82 | |
83 Data Gear はデータそのもの | |
84 | |
85 C の構造体で表現 | |
86 | |
87 Primitive Data Type を格納 | |
88 | |
89 # Meta Code/Data Gear | |
90 メタレベルとして Meta Code/Data Gear を用いる | |
91 | |
92 ポインタを扱う | |
93 | |
94 各 Gear の関連付け | |
95 | |
96 Model Checking | |
97 | |
98 平行制御 | |
99 | |
100 # Gear を用いた List の表現 | |
101 通常 List は要素と次へのポインタを持つ構造体で表現する | |
102 | |
103 Gears OS では任意の要素を持つ Data Gear と次へのポインタを持つ Meta Data Gear の組によって List を表現する | |
104 | |
105 ![List](pictures/List.svg){: style="width: 70%"} | |
106 | |
107 # Code/Data Gear の性質 | |
108 ポインタの使用を通常レベルとメタレベルで分離 | |
109 | |
110 ポインタ関連のセキュリティフローを防止 | |
111 | |
112 処理が Code/Data Gear に閉じている | |
113 | |
114 接続された Gear のみに干渉できる | |
115 | |
116 処理の実行時間、メモリ使用量が予測可能 | |
117 | |
118 # Gears OS における Meta Computation | |
119 関数型言語における Monad に基づいて Meta Computation を行う | |
120 | |
121 Monad を用いる手法は Moggi らが提案 | |
122 | |
123 Gears OS の Meta Computation は Meta Code/Data Gear を用いる | |
124 | |
125 # 実装言語 | |
126 本研究室で開発している Continuation based C(CbC) で実装 | |
127 | |
128 LLVM をバックエンドした CbC コンパイラを用いる | |
129 | |
130 CbC ではプログラムを Code Segment, Data Segment という単位で記述 | |
131 | |
132 | |
133 Code Segment 間の処理の移動は goto を用いた軽量継続 | |
134 | |
135 末尾最適化を強制 | |
136 | |
137 # Context | |
138 実行に必要な情報をまとめた Context を生成 | |
139 | |
140 OS の Process, Thread に相当 | |
141 | |
142 メタレベル | |
143 | |
144 Code Gear の名前とポインタの対応 | |
145 | |
146 Data Gear を Allocate するための情報 | |
147 | |
148 Code Gear が参照する Data Gear へのポインタ | |
149 | |
150 Data Gear に格納される Data Type の情報 | |
151 | |
152 ![arch](pictures/GearsOS_arch.svg){: style="width: 50%"} | |
153 | |
154 # Context | |
155 ``` | |
156 /* Context definition */ | |
157 enum Code { | |
158 Code1, | |
159 Code2, | |
160 Allocator, | |
161 }; | |
162 ``` | |
163 | |
164 実行可能な Code Gear の名前を enum Code で宣言 | |
165 | |
166 初期化時に名前と関数ポインタを対応付ける | |
167 | |
168 # Context | |
169 ``` | |
170 enum UniqueData { | |
171 Allocate, | |
172 Tree, | |
173 }; | |
174 ``` | |
175 | |
176 初期化時に確保する Data Gear を enum UniqueData で宣言 | |
177 | |
178 # Context | |
179 ``` | |
180 struct Context { | |
181 int codeNum; | |
182 __code (**code) (struct Context *); | |
183 void* heap_start; | |
184 void* heap; | |
185 long dataSize; | |
186 int dataNum; | |
187 union Data **data; | |
188 }; | |
189 ``` | |
190 | |
191 実行可能な Code Gear の数を示す codeNum | |
192 | |
193 実行可能な Code Gear へのポインタ code | |
194 | |
195 Data Gear の Allocate 用のポインタ heap_start, heap, dataSize | |
196 | |
197 Data Gear の数を示す dataNum | |
198 | |
199 Data Gear へのポインタ data | |
200 | |
201 # Data Gear | |
202 ``` | |
203 union Data { | |
204 struct Tree { | |
205 // Tree member definition | |
206 } tree; | |
207 struct Node { | |
208 // Node member definition | |
209 } node; | |
210 struct Allocate { | |
211 long size; | |
212 enum Code next; | |
213 } allocate; | |
214 }; | |
215 ``` | |
216 | |
217 Data Gear は C の共用体と構造体を用いた表現する | |
218 | |
219 # Persistent Data Gear | |
220 Data Gear の管理には木構造を用いる | |
221 | |
222 非破壊で構成する | |
223 | |
224 平行して読み書き・参照を行うことが可能 | |
225 | |
226 変更前の木構造をすべて保持しているので過去のデータにアクセス可能 | |
227 | |
228 ![arch](pictures/GearsOS_arch.svg){: style="width: 50%"} | |
229 | |
230 # Worker | |
231 Worker は Synchronized Queue から実行する Code Gear を取得 | |
232 | |
233 実行に必要な Data Gear は Persistent Data Gear から読み込む | |
234 | |
235 処理が完了したら Persistent Data Gear に書き込む | |
236 | |
237 ![arch](pictures/GearsOS_arch.svg){: style="width: 50%"} | |
238 | |
239 # Synchronized Queue | |
240 List を表現する Code/Data Gear に CAS(Compare and Swap) を行う Meta Code/Data Gear を接続することで Synchronized Queue を実現する | |
241 | |
242 Gears OS の機能は状態遷移図とクラスダイアグラムを組み合わせた GearBox という図で表現する | |
243 | |
244 M:receiver/sender が CAS を行う Meta Code Gear となる | |
245 | |
246 ![sync](pictures/synchronizedQueue.svg){: style="width: 80%"} | |
247 | |
248 # Code Gear の例 | |
249 ``` | |
250 // Code Gear | |
251 __code code1(struct Context* context) { | |
252 context->data[Allocate]->allocate.size = sizeof(struct Node); | |
253 context->data[Allocate]->allocate.next = Code2; | |
254 goto meta(context, Allocate); | |
255 } | |
256 ``` | |
257 | |
258 必要な情報を Data Gear に書き込み Allocate を行う Code Gear に接続する Code Gear | |
259 | |
260 ポインタを扱っており設計思想と異なる | |
261 | |
262 # Code Gear の例 | |
263 ``` | |
264 // Code Gear | |
265 __code code1(Allocate allocate) { | |
266 allocate.size = sizeof(long); | |
267 allocate.next = Code2; | |
268 goto Allocate(allocate); // goes through meta | |
269 } | |
270 ``` | |
271 | |
272 前の Code Gear として解釈するように CbC コンパイラを改良する | |
273 | |
274 # 比較 | |
275 Code Gear | |
276 | |
277 Cerium の Task | |
278 | |
279 Alice の Code Segment | |
280 | |
281 OpenCL/CUDA の kernel | |
282 | |
283 Data Gear | |
284 | |
285 Alice の Data Segment | |
286 | |
287 Ceirum, OpenCL/CUDA には同等のものはない | |
288 | |
289 Gears OS は Alice と同様に処理とデータの関係から依存関係を決定 | |
290 | |
291 Cerium, OpenCL/CUDA では処理同士の依存関係を記述する | |
292 | |
293 データの依存関係を保証できない | |
294 | |
295 # 今後の課題 | |
296 Cerium と同様の例題を動かし比較・評価 | |
297 | |
298 Sort | |
299 | |
300 Word Count | |
301 | |
302 FFT | |
303 | |
304 GPGPU のサポート | |
305 | |
306 # まとめ | |
307 処理とデータの関係から処理同士の依存関係を解決し、並列実行するように設計を行なった | |
308 | |
309 Gear という単位を用いて記述することでプログラムを柔軟に変更することを可能とした | |
310 | |
311 Meta Code/Data Gear を用いて Meta Computation を実現する | |
312 | |
313 Meta Computation の一つとして Model Checking を行う |