Mercurial > hg > Papers > 2014 > masakoha-thesis > final
annotate slide/index.html @ 86:ae8b239b527c default tip
add some pictures
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 10 Jun 2015 23:39:09 +0900 |
parents | 9df55a8255f2 |
children |
rev | line source |
---|---|
13 | 1 <!DOCTYPE html> |
2 | |
3 <html> | |
78 | 4 <head> |
13 | 5 <title>Presentation</title> |
6 <meta charset='utf-8'> | |
78 | 7 <script src='./slides.js'></script> |
8 </head> | |
13 | 9 |
78 | 10 <style> |
11 /* Your individual styles here, or just use inline styles if that’s | |
12 what you want. */ | |
13 | 13 |
78 | 14 </style> |
13 | 15 |
78 | 16 <body style='display: none'> |
17 <section class='slides layout-regular template-default'> | |
13 | 18 |
78 | 19 <!-- |
20 Your slides (<article>s) go here. Delete or comment out the | |
21 slides below. | |
22 --> | |
23 <article> | |
24 <h1>Cerium による並列処理向け I/O の設計と実装</h1> | |
25 <h3 class="title">Masataka Kohagura 27th, February</h3> | |
26 <div align="right">担当教官 : 河野 真治</div> | |
27 </article> | |
19
36958c5e0b90
add slide pages 8-17
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
18
diff
changeset
|
28 |
78 | 29 <article> |
79 | 30 <h3>I/Oを含むアプリケーションの並列化</h3> |
83 | 31 I/O を含む Task は ディスクかの読み込む時間がかかる。<br> |
32 -> <font color = red>I/O をどうにか速くできないか?</font> | |
78 | 33 <p> |
80 | 34 Cerium : <br> |
35 CellおよびLinux、 Mac OS X 上で動く並列プログラミングフレームワーク | |
78 | 36 </p> |
37 <img src='images/resources.png' style="height:170px" align="middle"> | |
38 <ul> | |
79 | 39 <li><font color=red>ファイル読み込みとアプリケーションの分離</font> </li> |
78 | 40 <li><font color=red>I/O専用の Threadを追加</font></li> |
41 </ul> | |
79 | 42 mmap 実装と比較して1.5倍の速度を得た |
78 | 43 </article> |
14 | 44 |
27 | 45 |
78 | 46 <article> |
79 | 47 <h3>Cerium Task Manager の構造</h3> |
78 | 48 <table border="0" cellpadding="0" cellspacing="0"> |
49 <tbody> | |
76 | 50 <tr> |
78 | 51 <td><img src='images/ceriumtaskmanager.png' style="height:280px"></td> |
52 <td> | |
76 | 53 <ol> |
78 | 54 <li>Taskを生成</li> |
55 <li>依存関係のチェック</li> | |
56 <li>Schedulerに転送</li> | |
57 <li>並列実行</li> | |
76 | 58 </ol> |
78 | 59 </td> |
76 | 60 </tr> |
78 | 61 </tbody> |
62 </table> | |
63 <p> | |
84 | 64 ファイルを読みながら、Word Count や grep などを<br> |
65 並列実行したい | |
83 | 66 </p> |
67 <p> | |
84 | 68 計算よりも読み込みを優先しなければならない。読み込みで待ちが入ってしまうので、IO Thread を追加 |
78 | 69 </p> |
70 </article> | |
71 | |
72 <article> | |
79 | 73 <h3>Block 単位の読み込みと並列計算</h3> |
78 | 74 <br> |
75 <img src='images/includeIOTask.png' style="height:270px" align="middle"> | |
76 <ol> | |
84 | 77 <li>ファイルをある一定の大きさで読み込む</li> |
78 <li>読み込んだテキストファイルに対して、それぞれ計算を行う</li> | |
78 | 79 <li>計算した結果を集計する</li> |
80 </ol> | |
81 </article> | |
15
9b071b32e3de
add some files and write slide
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
14
diff
changeset
|
82 |
78 | 83 <article> |
84 <h3>mmap の特徴</h3> | |
79 | 85 従来では mmap を使って読み込んでいた |
78 | 86 <table border="0" cellpadding="0" cellspacing="0"> |
87 <tbody> | |
23
a452d8f104bd
divede read rename to Block Read
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
88 <tr> |
78 | 89 <td><img src='images/mmap.png' style="height:350px" align="middle"></td> |
90 <td> | |
91 <ul> | |
92 <font size = 5> | |
93 <li> | |
79 | 94 mmap は、ファイルを直接メモリ空間に map する。<br> |
95 アクセスされたメモリ部分を OS が自動的に読み込む。<br> | |
78 | 96 </li> |
97 <li> | |
79 | 98 code がシンプルだが、読み込み終わるまで待たされる。 <br> |
78 | 99 </li> |
100 </font> | |
101 </ul> | |
102 </td> | |
23
a452d8f104bd
divede read rename to Block Read
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
103 </tr> |
78 | 104 </tbody> |
105 </table> | |
106 </article> | |
107 | |
16
56cd6800acb5
write slide No.11 & add images
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
108 |
78 | 109 <article> |
79 | 110 <h3>読み込みながら計算を行う</h3> |
78 | 111 <br> |
112 <img src='images/divide_read.png' style="height:250px" align="middle" > | |
113 <br> | |
16
56cd6800acb5
write slide No.11 & add images
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
114 |
78 | 115 <ul> |
79 | 116 <li> Read は 連続で動作しファイルを読み込む </li> |
117 <li> Read の待ちは CPU を消費しない </li> | |
118 <li> 読み込み終わったブロックに対して、<br>並列 Task を起動する </li> | |
78 | 119 </ul> |
120 </article> | |
121 | |
122 <article> | |
123 <h3>Blocked Read の実装</h3> | |
124 <br> | |
125 <img src='images/blockread.png' style="height:250px"align="middle"> | |
126 <br> | |
127 | |
128 <ul> | |
33 | 129 <li> |
79 | 130 Task を一度に生成するとメモリを圧迫する。<br> |
131 Block 単位で徐々に起動していく。 | |
33 | 132 </li> |
133 <li> | |
78 | 134 Blocked Read Task が読み込み終わるまで、<br>Task Blockを待たせる |
33 | 135 </li> |
79 | 136 <li> |
137 待ち合わせには Cerium の wait for を使用する。 | |
138 </li> | |
78 | 139 </ul> |
140 </article> | |
23
a452d8f104bd
divede read rename to Block Read
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
141 |
76 | 142 <!-- |
78 | 143 <article class = 'smaller'> |
144 <h3>I/O 専用の therad を追加 (1/2)</h3> | |
145 <br> | |
146 <img src='images/SPE_ANYblockread.png' style="height:350px"align="middle"> | |
147 <ul> | |
148 <li> | |
149 Task 単位で使用するデバイスをセットすることができる。 | |
150 </li> | |
151 <li> | |
152 SPE_ANY でセットすると、Cerium Task Manager 側で自動的に CPU を割り振る。 | |
153 </li> | |
154 <li> | |
155 自動的に割り振るので、Blocked Read に 他のTask が割り込むおそれがある。 | |
156 </li> | |
157 </ul> | |
158 </article> | |
76 | 159 --> |
31 | 160 |
161 | |
78 | 162 <article> |
79 | 163 <h3>I/O 専用 thread での Blocked Read の実装</h3> |
78 | 164 <br> |
165 <img src='images/IO_0blockread.png' style="height:350px"> | |
166 <ul> | |
80 | 167 <li>priority が最優先されるので、Blocked Read Task に割り込みが行われなくなる<br> |
168 <li>pthread_setschedparam にて実装<br> | |
78 | 169 </li> |
170 </ul> | |
171 </article> | |
28 | 172 |
78 | 173 <article> |
174 <h3>I/O 専用の thread を使用しない場合</h3> | |
175 <br> | |
176 <img src='images/SPE_ANYblockread.png' style="height:350px"> | |
177 <ul> | |
178 <li>Blocked Read は連続で行われなければならない。<br>しかし、Task が割り振られてしまう可能性がある。 </li> | |
179 </ul> | |
180 </article> | |
77 | 181 |
78 | 182 <article> |
183 <h3>実験環境</h3> | |
184 <br> | |
185 <ul> | |
186 <li> Mac OS X 10.9.1</li> | |
187 <li> 2*2.66 GHz 6-Core Intel Xeon</li> | |
188 <li> Memory 16GB 1333MHz DDR3</li> | |
189 <li> HHD 1TB</li> | |
190 <li> file size : 約 10 GB</li> | |
191 <li> ファイルに対して Boyer-Moore String Seaech で文字列検索をかける </li> | |
192 <li> ファイルの読み込みから結果までを測定</li> | |
193 </ul> | |
194 </article> | |
19
36958c5e0b90
add slide pages 8-17
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
18
diff
changeset
|
195 |
78 | 196 <article> |
197 <h3>実験結果</h3> | |
198 <table border="2" cellpadding="0" cellspacing="0"> | |
199 <tbody> | |
200 <tr> | |
201 <td>read mode</td> | |
202 <td>CPU num</td> | |
203 <td>ave time(s)</td> | |
204 </tr> | |
205 <tr> | |
206 <td>mmap</td> | |
207 <td>2</td> | |
208 <td>106.2</td> | |
209 </tr> | |
210 <tr> | |
211 <td bgcolor="#ffffcc">mmap</td> | |
212 <td bgcolor="#ffffcc">12</td> | |
213 <td bgcolor="#ffffcc">154.6</td> | |
214 </tr> | |
215 <tr> | |
216 <td>一括Read</td> | |
217 <td>12</td> | |
218 <td>114.9</td> | |
219 </tr> | |
220 <tr> | |
221 <td>Blocked Read(SPE_ANY)</td> | |
222 <td>12</td> | |
223 <td>106.0</td> | |
224 </tr> | |
225 <tr> | |
226 <td bgcolor="#ffffcc">Blocked Read(IO_0)</td> | |
83 | 227 <td bgcolor="#ffffcc">(IO) 1 + (Task) 11</td> |
78 | 228 <td bgcolor="#ffffcc">99.2</td> |
229 </tr> | |
230 </tbody> | |
231 </table> | |
26
54591c145fec
add experiment result
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
25
diff
changeset
|
232 |
78 | 233 <ul> |
83 | 234 <li> Blocked Read & IO_0 が mmap より<font color=red>1.55倍</font>速度が向上<br> </li> |
84 | 235 <li> Blocked Read を IO 専用 thread で実装すると、<font color=red>6%</font>改善<br> </li> |
83 | 236 <!-- |
237 <li> mmap では 1つ1つの Task がファイルの読み込みを行ってしまうため、読み込み回数が多くなり実行速度が遅くなったと考えられる。 </li> | |
238 | |
80 | 239 --> |
83 | 240 <li> mmap で並列の Task で走らせると 1つ1つの Task がファイルを読み込み、ランダムアクセスとなって<br>しまうため速度が遅くなってしまう。</li> |
78 | 241 </ul> |
242 </article> | |
28 | 243 |
78 | 244 <article> |
245 <h3>まとめ</h3> | |
246 <ul> | |
247 <li> I/O と Task を分離し、同時に動くように改良した。 </li> | |
248 <li> I/O 専用の Thread の追加 </li> | |
249 <li> | |
250 I/O を含む Task をで並列実装するときに mmap では不向きであり、 | |
251 Blocked Read で読み込みを制御したほうが効果的。 | |
252 </li> | |
253 </ul> | |
254 <h3 class="yellow">今後の課題</h3> | |
255 <ul> | |
256 <li> Cerium の API として実装 </li> | |
257 <li> | |
258 様々な実装の試み<br>(I/O threads を 2つ、分割 mmap・・・) | |
259 </li> | |
79 | 260 <li> |
261 grepの実装 | |
262 </li> | |
78 | 263 </ul> |
264 </article> | |
34 | 265 |
78 | 266 <article> |
267 <h3>Cerium Task の生成の例(1)</h3> | |
268 <p>(例題) multiply : 2つの数を掛け算するプログラム</p> | |
269 <h3 class="yellow">main.cc の記述</h3> | |
270 <pre> | |
28 | 271 float* A, B, C; |
272 // Task の宣言 | |
273 HTaskPtr multiply = manager->create_task(MULTIPLY_TASK); | |
274 // Task を実行する デバイスの設定 | |
275 multiply->set_cpu(SPE_ANY); | |
276 // Task に入力データのアドレスを追加 | |
277 multiply->set_inData(0, (memaddr)A, sizeof(float)*length); | |
278 multiply->set_inData(1, (memaddr)B, sizeof(float)*length); | |
279 // Task に出力データのアドレスを追加 | |
280 multiply->set_outData(0, (memaddr)C, sizeof(float)*length); | |
281 // Task へ値を1つだけ渡す | |
282 multiply->set_param(0,length); | |
283 // Task を TaskList に set する | |
78 | 284 multiply->spawn(); |
285 </pre> | |
286 </article> | |
28 | 287 |
78 | 288 <article> |
289 <h3> Cerium Task の生成(2)</h3> | |
290 <br> | |
291 <h3 class="yellow">Task の記述</h3> | |
292 <pre> | |
28 | 293 static int |
294 multiply(SchedTask *s,void *rbuf, void *wbuf) | |
295 { | |
296 float *A,*B,*C | |
78 | 297 // 登録した inData を取得 |
298 A = (float*)s->get_input(rbuf,0); | |
28 | 299 B = (float*)s->get_input(rbuf,1); |
300 // 登録した outData を取得 | |
301 C = (float*)s->get_output(wbuf,0); | |
302 // 登録した param を取得 | |
303 long length=(long)s->get_param(0); | |
304 for (int i=0;i < length;i++) { | |
305 C[i] = A[i] * B[i]; | |
306 } | |
307 return 0; | |
78 | 308 } |
309 </pre> | |
310 </article> | |
28 | 311 |
78 | 312 <article> |
313 <h3>mmap での I/O の実装</h3> | |
314 <br> | |
315 <h3 class="yellow">mmap の記述</h3> | |
316 <pre> | |
28 | 317 mmap(SchedTask *s, void *in, void *out) |
318 { | |
319 // FileReadPtr : File情報などを格納している構造体 | |
320 FileReadPtr fr = (FileReadPtr)in; | |
321 int map = MAP_PRIVATE; | |
322 | |
323 fr->read_text = | |
324 (char*)mmap(NULL,fr->filesize,PROT_READ,map,fr->fd,(off_t)0); | |
325 } | |
78 | 326 </pre> |
28 | 327 |
78 | 328 <ul> |
329 <li> PROT_READ : 読み込み可 </li> | |
330 <li> MAP_PRIVATE : 読み込んだ領域に対して書き込みが起こると複製し、複製した領域に対して書き込みを行う </li> | |
331 </ul> | |
332 </article> | |
333 | |
334 <article class='smaller'> | |
79 | 335 <h3>Block Read の実装(1/2)</h3> |
336 <br> | |
337 <h3 class="yellow">Block Read の実装</h3> | |
338 <pre> | |
28 | 339 HTaskPtr t_read = manager->create_task(READ_TASK); |
340 t_read->set_cpu(read_spe_cpu); | |
341 // 読み出すファイルの格納場所を設定 | |
342 t_read->set_outData(0, | |
78 | 343 w->file_mmap + w->task_spawned * w->division_size, |
344 w->task_blocks * w->division_size); | |
28 | 345 // ファイルディスクリプタの受け渡し |
346 t_read->set_param(0,w->fd); | |
347 // ファイル読み込みの始点 | |
348 t_read->set_param(1,w->task_spawned*w->division_size); | |
349 | |
350 // run_tasks(manager,w, w->task_blocks, t_read, t_next, w->division_size + w->extra_len); | |
351 // ここで、ファイルに対して何らかの計算を掛けるような Task を設定する | |
352 run_tasks(manager,w, w->task_blocks,・・・ ); | |
353 | |
354 // ファイル読み込みの終点 | |
355 t_read->set_param(2,w->task_spawned*w->division_size + w->extra_len); | |
356 | |
357 t_read->spawn(); | |
358 | |
79 | 359 </pre> |
78 | 360 </article> |
28 | 361 |
78 | 362 <article> |
79 | 363 <h3>Block Read の実装(2/2)</h3> |
364 <br> | |
365 <h3 class="yellow"> Block Read の記述</h3> | |
366 <pre> | |
78 | 367 static int |
28 | 368 read_task(SchedTask *s, void *rbuf, void *wbuf) |
369 { | |
370 long fd = (long)s->get_param(0); | |
371 long start_read_position = (long)s->get_param(1); | |
372 long end_read_position = (long)s->get_param(2); | |
373 char *read_text = (char*)s->get_output(wbuf,0); | |
374 long read_size = end_read_position - start_read_position; | |
375 | |
376 pread(fd, read_text, read_size , start_read_position); | |
377 return 0; | |
378 } | |
79 | 379 </pre> |
78 | 380 </article> |
28 | 381 |
19
36958c5e0b90
add slide pages 8-17
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
18
diff
changeset
|
382 |
78 | 383 </body> |
13 | 384 </html> |