0
|
1 <!DOCTYPE html>
|
|
2 <html>
|
|
3 <head>
|
|
4 <meta charset='utf-8'>
|
|
5 <title>sigos</title>
|
|
6
|
|
7 <!--
|
|
8 Notes on CSS media types used:
|
|
9
|
|
10 1) projection -> slideshow mode (display one slide at-a-time; hide all others)
|
|
11 2) screen -> outline mode (display all slides-at-once on screen)
|
|
12 3) print -> print (and print preview)
|
|
13
|
|
14 Note: toggle between projection/screen (that is, slideshow/outline) mode using t-key
|
|
15
|
|
16 Questions, comments?
|
|
17 - send them along to the mailinglist/forum online @ http://groups.google.com/group/webslideshow
|
|
18 -->
|
|
19
|
|
20 <!-- style sheet links -->
|
|
21 <link rel="stylesheet/less" href="themes/blank/projection.css.less" media="screen,projection">
|
|
22 <link rel="stylesheet/less" href="themes/blank/screen.css.less" media="screen">
|
|
23 <link rel="stylesheet/less" href="themes/blank/print.css.less" media="print">
|
|
24
|
|
25 <link rel="stylesheet/less" href="themes/blank/blank.css.less" media="screen,projection">
|
|
26
|
|
27 <!-- Notes about less css support
|
|
28 - all less stylesheets (*.css.less) need to get listed/loaded first (before the less.js script)
|
|
29 - find more info about less.js online @ http://lesscss.org
|
|
30
|
|
31 ***** NOTE:
|
|
32 less.js browser script currently won’t work if you’re using Google Chrome
|
|
33 and the path to your page starts with "file:///" due to a known Chrome issue.
|
|
34 (In the developer/js console you will see:
|
|
35 XMLHttpRequest cannot load file:///../s6/shared/projection.css.less.
|
|
36 Cross origin requests are only supported for HTTP.)
|
|
37 -->
|
|
38
|
|
39 <!-- add js libs (less, jquery) -->
|
|
40 <script src="js/less-1.1.4.min.js"></script>
|
|
41 <script src="js/jquery-1.7.min.js"></script>
|
|
42
|
|
43 <!-- S6 JS -->
|
|
44 <script src="js/jquery.slideshow.js"></script>
|
|
45 <script src="js/jquery.slideshow.counter.js"></script>
|
|
46 <script src="js/jquery.slideshow.controls.js"></script>
|
|
47 <script src="js/jquery.slideshow.footer.js"></script>
|
|
48 <script src="js/jquery.slideshow.autoplay.js"></script>
|
|
49 <script>
|
|
50 $(document).ready( function() {
|
|
51 Slideshow.init();
|
|
52
|
|
53 // Example 2: Start Off in Outline Mode
|
|
54 // Slideshow.init( { mode: 'outline' } );
|
|
55
|
|
56 // Example 3: Use Custom Transition
|
|
57 // Slideshow.transition = transitionScrollUp;
|
|
58 // Slideshow.init();
|
|
59
|
|
60 // Example 4: Start Off in Autoplay Mode with Custom Transition
|
|
61 // Slideshow.transition = transitionScrollUp;
|
|
62 // Slideshow.init( { mode: 'autoplay' } );
|
|
63 } );
|
|
64 </script>
|
|
65
|
|
66 <!-- Better Browser Banner for Microsoft Internet Explorer (IE) -->
|
|
67 <!--[if IE]>
|
|
68 <script src="js/jquery.microsoft.js"></script>
|
|
69 <![endif]-->
|
|
70
|
|
71 </head>
|
|
72 <body>
|
|
73 <div class="layout">
|
|
74 <div id="header"></div>
|
|
75 <div id="footer">
|
|
76 <div align="right">
|
|
77 <img src="images/concurrency.png" width="200">
|
|
78 </div>
|
|
79 </div>
|
|
80 </div>
|
|
81
|
|
82 <div class="presentation">
|
|
83
|
|
84 <!-- add slides here; example -->
|
|
85
|
|
86 <div class='slide cover'>
|
|
87 <table width="90%" height="90%" border="0" align="center">
|
|
88 <tr>
|
|
89 <td><div align="center">
|
|
90 <h1><font color="#808db5">Cerium による並列処理向け I/O の実装</font></h1>
|
|
91 </div></td>
|
|
92 </tr>
|
|
93 <tr>
|
|
94 <td><div align="left">
|
|
95 Masataka Kohagura,Shinji Kono,
|
|
96 <script>
|
|
97 var date = new Date();
|
|
98 var year = date.getFullYear();
|
|
99 var month = date.getMonth();
|
|
100 var day = date.getDate();
|
|
101
|
|
102 var monthList = new Array("January","February","March","April","May","June",
|
|
103 "July","August","September","October","November","December");
|
|
104
|
|
105 document.write(monthList[month]+" "+day+", "+year);
|
|
106
|
|
107 </script>
|
|
108 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:300%;height:0.2em;">
|
|
109 </div></td>
|
|
110 </tr>
|
|
111 </table>
|
|
112 </div>
|
|
113
|
|
114 <!--
|
|
115 研究目的書こう
|
|
116 アプリケーションはI/o の速度無視できない
|
|
117 I/Oを並列処理やるとき、Cerium ではどうするか
|
|
118 1つ I/O と Task が同時におこるあ
|
|
119 2つ I/O は連続で動作する
|
|
120 並列処理してることによって I/O の処理をみださされることを防ぎたい
|
|
121
|
|
122 -->
|
|
123
|
|
124 <!--
|
|
125 (1)
|
|
126 read->task
|
|
127
|
|
128 (2)
|
|
129 read
|
|
130 task
|
|
131
|
|
132 (3)
|
|
133 mmap
|
|
134
|
|
135 mmap での充分はやくなる
|
|
136 並列時でも充分に速くなる
|
|
137
|
|
138
|
|
139 mmap 改良する余地がある
|
|
140 MAX_FIXED などのオプションを変更しても速度はかわならなかった
|
|
141 -> 実はそのオプション、最近は見ていないんじゃね??
|
|
142 -->
|
|
143 <div class='slide'>
|
|
144 <h2>はじめに</h2>
|
|
145 <p>
|
|
146 ファイルを読み込んで計算を行うようなアプリケーションは、I/O の速度を無視することができない。
|
|
147 ファイルを全て読み込んでから並列計算をすると、読み込んでいる時間がオーバーヘッドとなってしまう。
|
|
148 </p>
|
|
149 <p>
|
|
150 本研究室では、並列プログラミングフレームワーク Cerium を使用することによって並列計算を可能にしているが、Cerium で I/O と並列計算を同時に走らせるにはどのように実装すればいいか考慮した。
|
|
151 </p>
|
|
152 <ol>
|
|
153 <li>
|
|
154 I/O と並列計算を同時に動作させる。
|
|
155 </li>
|
|
156 <li>
|
|
157 I/O は連続で動作させる。
|
|
158 </li>
|
|
159 </ol>
|
|
160
|
|
161 <p>
|
|
162 上記 2点を実装して、I/O と並列計算が同時に実行し、なおかつ I/O の処理を乱されないようにすることによって、全体のパフォーマンスを上げたい。
|
|
163 </p>
|
|
164
|
|
165 <p>I/O の読み込みと並列計算の方法は以下の 3 つの方法を試みた。</p>
|
|
166 <ol>
|
|
167 <li>
|
|
168 mmap 後に並列計算
|
|
169 </li>
|
|
170 <li>
|
|
171 read 後に並列計算
|
|
172 </li>
|
|
173 <li>
|
|
174 read と 並列計算 が同時に実行
|
|
175 </li>
|
|
176 </ol>
|
|
177 <p>
|
|
178 -> 本研究では並列計算を Word Count で実装を行った。
|
|
179 </p>
|
|
180 </div>
|
|
181
|
|
182 <div class='slide'>
|
|
183 <h2>mmap の特徴</h2>
|
|
184
|
|
185 <img src='images/mmap.png' style="height:400px" align="middle" >
|
|
186 <br>
|
|
187
|
|
188 <ul>
|
|
189 <li>
|
|
190 mmap は、仮想メモリ空間にファイルの中身を対応させ、そのメモリ空間に
|
|
191 アクセスされたら、 OS が読み込みを行う。<br>
|
|
192 </li>
|
|
193 <li>
|
|
194 code の記述はシンプルだが、スレッドが読み込み終わるまで待たされる。 <br>
|
|
195 </li>
|
|
196 <li>
|
|
197 読み込みが OS 依存となるので、環境に左右されやすく、読み込みを細かく制御することが難しい。
|
|
198 </li>
|
|
199 </ul>
|
|
200 </div>
|
|
201
|
|
202 <div class='slide'>
|
|
203 <h2>読み込みながら計算を行う</h2>
|
|
204 <p>mmap を使用せずに、read を独立したスレッドで実行させる。そして、読み込んだ部分に対して Word Count を並列に起動する。
|
|
205 </p>
|
|
206 <br>
|
|
207 <img src='images/divide_read.png' style="height:350px" align="middle" >
|
|
208 <!--図をUML に近いものに変更 -->
|
|
209 <br>
|
|
210
|
|
211 <ul>
|
|
212 <li> read は全て読み込み終えるまで連続で動作しファイルを読み込む </li>
|
|
213 <li> read の待ちは CPU を消費しない </li>
|
|
214 <li> 読み込み終わったブロックに対して、Word Count を起動する </li>
|
|
215 <li>
|
|
216 WordCount Task を一度に全て生成すると、その Task でメモリを圧迫するので、
|
|
217 ある程度の数でまとめた Block という単位で徐々に Task を起動していく。
|
|
218 </li>
|
|
219 </ul>
|
|
220 </div>
|
|
221
|
|
222 <div class='slide'>
|
|
223 <h2>読み込みを行ってから計算を行う</h2>
|
|
224 <br>
|
|
225 <img src='images/read.png' style="height:450px" align="middle" >
|
|
226 <br>
|
|
227
|
|
228 <ul>
|
|
229 <li> 読み込みを行ってから計算を行うので、読み込みの間、CPU に待ち時間が発生してオーバーヘッドとなる。 </li>
|
|
230 </ul>
|
|
231 </div>
|
|
232
|
|
233 <div class='slide'>
|
|
234 <h2>I/Oを含むアプリケーションの並列化</h2>
|
|
235
|
|
236 <p>
|
|
237 I/O は、ディスクからの読み込む時間がかかる。<br>
|
|
238 -> <font color = red>I/O をどのように実装したら、並列処理とI/Oが干渉をなくして全体のパフォーマンスを上げれるか??</font><br>
|
|
239 </p>
|
|
240
|
|
241 <p>
|
|
242 そこで本研究では、
|
|
243 </p>
|
|
244
|
|
245 <img src='images/resources.png' style="height:170px" align="middle">
|
|
246 <ul>
|
|
247 <li><font color=red>ファイル読み込みとアプリケーションの分離するための実装法</font> </li>
|
|
248 <li><font color=red>I/O専用の Threadを追加</font></li>
|
|
249 <li><font color=red>mmap と比較や、様々な実験環境で計測</font></li>
|
|
250 </ul>
|
|
251 <p>
|
|
252 以上3点を行った。
|
|
253 </p>
|
|
254 </div>
|
|
255
|
|
256
|
|
257 <div class='slide'>
|
|
258 <h2>Cerium Task Manager の構造</h2>
|
|
259 <p>
|
|
260 Cerium Task Manager: <br>
|
|
261 CellおよびLinux、 Mac OS X 上で動く並列プログラミングフレームワーク
|
|
262 </p>
|
|
263 <table border="0" cellpadding="0" cellspacing="0">
|
|
264 <tbody>
|
|
265 <tr>
|
|
266 <td><img src='images/ceriumtaskmanager.png' style="height:350px"></td>
|
|
267 <td>
|
|
268 <ol>
|
|
269 <li>User が Taskを生成</li>
|
|
270 <li>依存関係のチェック</li>
|
|
271 <li>各Schedulerに Task を転送</li>
|
|
272 </ol>
|
|
273 </td>
|
|
274 </tr>
|
|
275 </tbody>
|
|
276 </table>
|
|
277 <p>
|
|
278 User が Word Count などの Task を生成して、それらを GPU や CPU などに計算させるように User 自身で設定することができる。
|
|
279 </p>
|
|
280 <p>
|
|
281 ファイルを読みながら、Word Count や grep などを 並列実行したい。<br>
|
|
282 </p>
|
|
283 <p>
|
|
284 計算よりも読み込みを優先しなければならない。読み込みで待ちが入ってしまうので、IO Thread を追加。
|
|
285 </p>
|
|
286 </div>
|
|
287
|
|
288 <div class='slide'>
|
|
289 <h2>大きなファイルに対するデータ並列</h2>
|
|
290 <br>
|
|
291 <img src='images/includeIOTask.png' style="height:450px" align="middle">
|
|
292 <ol>
|
|
293 <li>ファイルをある一定の大きさずつ読み込む</li>
|
|
294 <li>読み込んだテキストファイルに対して、それぞれ 並列に計算 を行う</li>
|
|
295 <li>計算の結果を集計する</li>
|
|
296 </ol>
|
|
297 </div>
|
|
298
|
|
299 <div class='slide'>
|
|
300 <h2>Blocked Read の実装</h2>
|
|
301 <p>
|
|
302 読み込みながら並列計算を実行する方法を、Blocked Read と名付けた。
|
|
303 </p>
|
|
304 <br>
|
|
305 <img src='images/blockread.png' style="height:400px"align="middle">
|
|
306 <!-- UML 形式にして -->
|
|
307 <br>
|
|
308
|
|
309 <ul>
|
|
310 <li>
|
|
311 読み込んでいない部分に Word Count が走らないように、Blocked Read Task が読み込み終わるまで、Task Blockを待たせる。
|
|
312 </li>
|
|
313 <!--
|
|
314 <li>
|
|
315 待ち合わせには Cerium の wait for を使用する。
|
|
316 </li>
|
|
317 -->
|
|
318 <li>
|
|
319 Word Count Task 1つで処理するファイルの大きさを L<br>
|
|
320 Task Block 1つ当たりに含まれている Word Count Task の数を n<br>
|
|
321 とすると、Blocked Read Task 1つ当たりの読み込み量は L * n となる。
|
|
322 </li>
|
|
323
|
|
324 </ul>
|
|
325 </div>
|
|
326
|
|
327
|
|
328 <div class='slide'>
|
|
329 <h2>I/O 専用 thread での Blocked Read の実装</h2>
|
|
330 <br>
|
|
331 <!--<img src='images/IO_0blockread.png' style="height:350px">-->
|
|
332 <ul>
|
|
333 <li>
|
|
334 Blocked Read の実装だけでは、Blocked Read Task 間に Task が割り込まれてしまう可能性がある。
|
|
335 </li>
|
|
336 <li>
|
|
337 I/O を含むアプリケーションの実行時間のほとんどが I/O の時間になることが多い。
|
|
338 </li>
|
|
339 <li>
|
|
340 読み込みの間に Task が割り込まれると、下の図のように全体の実行速度が遅くなってしまう。
|
|
341 </li>
|
|
342 <br><img src='images/read_break.png' style="height:350px"align="middle"><br>
|
|
343 <li>Blocked Read Task に I/O 専用 thread を用意して、 Word Count とは別に Thread を割り当てることにより、Blocked Read Task 間に Task が割り込まれないようにした。</li>
|
|
344 <li>Thread レベルで割り込まれないように、pthread_setschedparam にて IO_0 の priority を設定している。<br>
|
|
345 </li>
|
|
346 </ul>
|
|
347 </div>
|
|
348
|
|
349 <div class='slide'>
|
|
350 <h2>実験概要</h2>
|
|
351 <p>実験環境</p>
|
|
352 <ul>
|
|
353 <li>OS:MacOS 10.9.2</li>
|
|
354 <li>CPU:2*2.66GHz 6-Core Intel Xeon</li>
|
|
355 <li>GPU:NVIDIA Quadro K5000 4096MB</li>
|
|
356 <li>Memory:16GB 1333MHz DDR3</li>
|
|
357 <li>HDD : 1TB 7200 rpm SATA 3.0 Gbps </li>
|
|
358 <li>Word Count の時間を、ファイルの読み込みから結果出力するまでを測定</li>
|
|
359 </ul>
|
|
360
|
|
361 Word Count を実行した後に、読み込むファイルをキャッシュから追い出すために、
|
|
362 <pre>% sudo purge </pre>
|
|
363 を実行して繰り返し、測定を行っている。
|
|
364 </div>
|
|
365
|
|
366 <div class='slide'>
|
|
367 <h2>実験1: 使用 CPU 数を変更させた時の実行速度の比較</h2>
|
|
368 <p>全ての実験のfile size は 1GB であり、表内の数値の単位は全て秒である。</p>
|
|
369 <p>
|
|
370 Blocked read Task 1つ当たりの読み込み量 : 16kbyte * 48
|
|
371 </p>
|
|
372 <table border="2" cellpadding="0" cellspacing="0">
|
|
373 <tbody>
|
|
374 <tr>
|
|
375 <td align=center>read mode \ CPU num</td>
|
|
376 <td></td>
|
|
377 <td align=center>CPU 1</td>
|
|
378 <td align=center>CPU 4</td>
|
|
379 <td align=center>CPU 8</td>
|
|
380 <td align=center>CPU 12</td>
|
|
381 <td align=center>GPU(CUDA)</td>
|
|
382 </tr>
|
|
383 <tr>
|
|
384 <td align=center>mmap</td>
|
|
385 <td></td>
|
|
386 <td>15.353</td>
|
|
387 <td>11.287</td>
|
|
388 <td>11.707</td>
|
|
389 <td>11.137</td>
|
|
390 <td><div align=right>103.410</div></td>
|
|
391 </tr>
|
|
392 <tr>
|
|
393 <td align=center>read</td>
|
|
394 <td></td>
|
|
395 <td>16.846</td>
|
|
396 <td>11.730</td>
|
|
397 <td>11.487</td>
|
|
398 <td>11.437</td>
|
|
399 <td><div align=right>106.050</div></td>
|
|
400 </tr>
|
|
401 <tr>
|
|
402 <td align=center>Blocked Read(SPE_ANY)</td>
|
|
403 <td></td>
|
|
404 <td>13.297</td>
|
|
405 <td>11.984</td>
|
|
406 <td>10.887</td>
|
|
407 <td>11.146</td>
|
|
408 <td><div align=right>94.626</div></td>
|
|
409 </tr>
|
|
410 <tr>
|
|
411 <td align=center>Blocked Read(IO_0)</td>
|
|
412 <td></td>
|
|
413 <td>11.503</td>
|
|
414 <td>11.437</td>
|
|
415 <td>11.365</td>
|
|
416 <td>11.412</td>
|
|
417 <td><div align=right>94.496</div></td>
|
|
418 <!--
|
|
419 <td bgcolor="#ffffcc">Blocked Read(IO_0)</td>
|
|
420 <td bgcolor="#ffffcc">99.2</td>
|
|
421 -->
|
|
422 </tr>
|
|
423 </tbody>
|
|
424 </table>
|
|
425
|
|
426
|
|
427 <ul>
|
|
428 <li> SPE_ANY は、Cerium Task Manager がそれぞれの Task に自動的に CPU を割り振ってくれる。<br>
|
|
429 -> I/O が連続で動作する保証がなくなってしまう。
|
|
430 </li>
|
|
431 <li> <font color=red>CPU 4 以上</font>からはほとんど同じ実行結果を示した。 </li>
|
|
432 <li> 実行時間のほとんどは I/O の読み込みの時間となっている。<br>
|
|
433 read でファイル読み込みだけの時間を測定すると、<font color=red>11.166 秒</font>となった。 </li>
|
|
434 <li>
|
|
435 GPU を使用した場合、並列計算と I/O を分離させたほうが <font color=red>10%</font> ほど速くなった。
|
|
436 </li>
|
|
437 </ul>
|
|
438
|
|
439 <p>
|
|
440 ファイルがキャッシュに入った時の実行速度は以下のようになった。
|
|
441 </p>
|
|
442
|
|
443 <table border="2" cellpadding="0" cellspacing="0">
|
|
444 <tbody>
|
|
445 <tr>
|
|
446 <td align=center>read mode \ CPU num</td>
|
|
447 <td></td>
|
|
448 <td align=center>CPU 12</td>
|
|
449 <td align=center>GPU</td>
|
|
450 </tr>
|
|
451 <tr>
|
|
452 <td align=center>mmap</td>
|
|
453 <td></td>
|
|
454 <td><div align=right>0.854</div></td>
|
|
455 <td><div align=right>94.479</div></td>
|
|
456 </tr>
|
|
457 <tr>
|
|
458 <td align=center>read</td>
|
|
459 <td></td>
|
|
460 <td><div align=right>1.487</div></td>
|
|
461 <td><div align=right>94.614</div></td>
|
|
462 </tr>
|
|
463 <tr>
|
|
464 <td align=center>Blocked Read(SPE_ANY)</td>
|
|
465 <td></td>
|
|
466 <td><div align=right>0.847</div></td>
|
|
467 <td><div align=right>93.920</div></td>
|
|
468 </tr>
|
|
469 <tr>
|
|
470 <td align=center>Blocked Read(IO_0)</td>
|
|
471 <td></td>
|
|
472 <td><div align=right>0.866</div></td>
|
|
473 <td><div align=right>93.912</div></td>
|
|
474 </tr>
|
|
475 </tbody>
|
|
476 </table>
|
|
477 <ul>
|
|
478
|
|
479 </ul>
|
|
480 <br>
|
|
481 <br>
|
|
482 <br>
|
|
483 </div>
|
|
484
|
|
485 <div>
|
|
486 <h2>実験1: 使用 CPU 数を変更させた時の実行速度の比較</h2>
|
|
487 <img src='images/cpu_var.png' style="height:800px"align="middle"><br>
|
|
488 </div>
|
|
489 <!-- 1度に読み込む量を書かないといけない -->
|
|
490 <!-- bldsv 12 ssd あるってよ-->
|
|
491 <div class='slide'>
|
|
492 <h2>実験2: Blocked Read size を変更してみる</h2>
|
|
493 <p>
|
|
494 filesize : 1GB
|
|
495 </p>
|
|
496 <p>
|
|
497 Blocked read Task 1つ当たりの読み込み量 : <font color=red>128 kbyte </font>* 48
|
|
498 </p>
|
|
499 <table border="2" cellpadding="0" cellspacing="0">
|
|
500 <tbody>
|
|
501 <tr>
|
|
502 <td align=center>read mode \ CPU num</td>
|
|
503 <td></td>
|
|
504 <td>CPU 1</td>
|
|
505 <td>CPU 4</td>
|
|
506 <td>CPU 8</td>
|
|
507 <td>CPU 12</td>
|
|
508 </tr>
|
|
509 <tr>
|
|
510 <td align=center>mmap</td>
|
|
511 <td></td>
|
|
512 <td>20.179</td>
|
|
513 <td>22.861</td>
|
|
514 <td>22.789</td>
|
|
515 <td>22.713</td>
|
|
516 </tr>
|
|
517 <tr>
|
|
518 <td align=center>read</td>
|
|
519 <td></td>
|
|
520 <td>21.351</td>
|
|
521 <td>15.737</td>
|
|
522 <td>14.785</td>
|
|
523 <td>12.520</td>
|
|
524 </tr>
|
|
525 <tr>
|
|
526 <td align=center>Blocked Read(SPE_ANY)</td>
|
|
527 <td></td>
|
|
528 <td>18.531</td>
|
|
529 <td>15.646</td>
|
|
530 <td>15.287</td>
|
|
531 <td>14.028</td>
|
|
532 </tr>
|
|
533 <tr>
|
|
534 <td align=center>Blocked Read(IO_0)</td>
|
|
535 <td></td>
|
|
536 <td>13.930</td>
|
|
537 <td>14.634</td>
|
|
538 <td>14.774</td>
|
|
539 <td bgcolor="#ffffcc">10.295</td>
|
|
540 <!--
|
|
541 <td bgcolor="#ffffcc">Blocked Read(IO_0)</td>
|
|
542 <td bgcolor="#ffffcc">99.2</td>
|
|
543 -->
|
|
544 </tr>
|
|
545 </tbody>
|
|
546 </table>
|
|
547
|
|
548 <ul>
|
|
549 <li>
|
|
550 Blocked Read size を大きくすると、mmap は遅くなってしまう。
|
|
551 </li>
|
|
552 <li>
|
|
553 <font color=red>本研究ではI/O をBlocked Read(IO_0)で実装してなおかつ、CPU 12 の時、最速となった。</font>
|
|
554 </li>
|
|
555 </ul>
|
|
556 <p>
|
|
557 実験1との比較<br>
|
|
558 Blocked read Task 1つ当たりの読み込み量 : <font color=red>16 kbyte </font>* 48
|
|
559 </p>
|
|
560 <table border="2" cellpadding="0" cellspacing="0">
|
|
561 <tbody>
|
|
562 <tr>
|
|
563 <td align=center>read mode \ CPU num</td>
|
|
564 <td></td>
|
|
565 <td align=center>CPU 1</td>
|
|
566 <td align=center>CPU 4</td>
|
|
567 <td align=center>CPU 8</td>
|
|
568 <td align=center>CPU 12</td>
|
|
569 </tr>
|
|
570 <tr>
|
|
571 <td align=center>mmap</td>
|
|
572 <td></td>
|
|
573 <td>15.353</td>
|
|
574 <td>11.287</td>
|
|
575 <td>11.707</td>
|
|
576 <td>11.137</td>
|
|
577 </tr>
|
|
578 <tr>
|
|
579 <td align=center>read</td>
|
|
580 <td></td>
|
|
581 <td>16.846</td>
|
|
582 <td>11.730</td>
|
|
583 <td>11.487</td>
|
|
584 <td>11.437</td>
|
|
585 </tr>
|
|
586 <tr>
|
|
587 <td align=center>Blocked Read(SPE_ANY)</td>
|
|
588 <td></td>
|
|
589 <td>13.297</td>
|
|
590 <td>11.984</td>
|
|
591 <td>10.887</td>
|
|
592 <td>11.146</td>
|
|
593 </tr>
|
|
594 <tr>
|
|
595 <td align=center>Blocked Read(IO_0)</td>
|
|
596 <td></td>
|
|
597 <td>11.503</td>
|
|
598 <td>11.437</td>
|
|
599 <td>11.365</td>
|
|
600 <td>11.412</td>
|
|
601 </tr>
|
|
602 </tbody>
|
|
603 </table>
|
|
604 </div>
|
|
605
|
|
606 <div>
|
|
607 <h2>実験2: Blocked Read size を変更してみる</h2>
|
|
608 <img src='images/128cpu_var.png' style="height:800px"align="middle"><br>
|
|
609 </div>
|
|
610
|
|
611 <div class='slide'>
|
|
612 <h2>実験3: CPU 数を固定して、Blocked Read size を変更してみる</h2>
|
|
613 <p>
|
|
614 word count task 1つ当たりの処理量を 4kbyte ~ 256kbyte で変化させてみた。
|
|
615 </p>
|
|
616 <p>
|
|
617 CPU 12 で全て測定している。
|
|
618 </p>
|
|
619 <table border="2" cellpadding="0" cellspacing="0">
|
|
620 <tbody>
|
|
621 <tr>
|
|
622 <td align=center>read mode \ Blocled Read size</td>
|
|
623 <td></td>
|
|
624 <td align=center> 4k * 48 </td>
|
|
625 <td align=center> 8k * 48 </td>
|
|
626 <td align=center> 16k * 48 </td>
|
|
627 <td align=center> 32k * 48 </td>
|
|
628 <td align=center> 64k * 48 </td>
|
|
629 <td align=center> 128k * 48 </td>
|
|
630 <td align=center> 256k * 48 </td>
|
|
631 </tr>
|
|
632 <tr>
|
|
633 <td align=center>mmap</td>
|
|
634 <td></td>
|
|
635 <td><div align=right>11.867</div></td>
|
|
636 <td><div align=right>10.570</div></td>
|
|
637 <td><div align=right>11.803</div></td>
|
|
638 <td><div align=right>14.915</div></td>
|
|
639 <td><div align=right>16.626</div></td>
|
|
640 <td><div align=right>16.923</div></td>
|
|
641 <td><div align=right>18.474</div></td>
|
|
642 </tr>
|
|
643 <tr>
|
|
644 <td align=center>read</td>
|
|
645 <td></td>
|
|
646 <td><div align=right>12.020</div></td>
|
|
647 <td><div align=right>11.585</div></td>
|
|
648 <td><div align=right>11.729</div></td>
|
|
649 <td><div align=right>11.661</div></td>
|
|
650 <td><div align=right>12.497</div></td>
|
|
651 <td><div align=right>11.347</div></td>
|
|
652 <td><div align=right>11.658</div></td>
|
|
653 </tr>
|
|
654 <tr>
|
|
655 <td align=center>Blocked Read(SPE_ANY)</td>
|
|
656 <td></td>
|
|
657 <td><div align=right>11.508</div></td>
|
|
658 <td><div align=right>15.932</div></td>
|
|
659 <td><div align=right>11.407</div></td>
|
|
660 <td><div align=right>12.816</div></td>
|
|
661 <td><div align=right>12.454</div></td>
|
|
662 <td><div align=right>12.891</div></td>
|
|
663 <td><div align=right>11.962</div></td>
|
|
664 </tr>
|
|
665 <tr>
|
|
666 <td align=center>Blocked Read(IO_0)</td>
|
|
667 <td></td>
|
|
668 <td><div align=right>11.342</div></td>
|
|
669 <td><div align=right>12.242</div></td>
|
|
670 <td><div align=right>11.636</div></td>
|
|
671 <td><div align=right>12.331</div></td>
|
|
672 <td><div align=right>10.870</div></td>
|
|
673 <td><div align=right>11.295</div></td>
|
|
674 <td><div align=right>11.723</div></td>
|
|
675 <!--
|
|
676 <td bgcolor="#ffffcc">Blocked Read(IO_0)</td>
|
|
677 <td bgcolor="#ffffcc">99.2</td>
|
|
678 -->
|
|
679 </tr>
|
|
680 </tbody>
|
|
681 </table>
|
|
682 <ul>
|
|
683 <li>
|
|
684 Blocked Read size を大きくすればするほど、mmap は遅くなる。
|
|
685 </li>
|
|
686 <li>
|
|
687 どの大きさでも read と Blocked Read(IO_0) は安定した速度がでる。
|
|
688 </li>
|
|
689 </ul>
|
|
690 </div>
|
|
691
|
|
692 <div>
|
|
693 <h2>実験3: CPU 数を固定して、Blocked Read size を変更してみる</h2>
|
|
694 <img src='images/brsize_ver.png' style="height:800px"align="middle"><br>
|
|
695 </div>
|
|
696
|
|
697 <div class='slide'>
|
|
698 <h2>実験4: mmap 後に madvise で読み込み方法を設定する</h2>
|
|
699
|
|
700 <p>
|
|
701 Blocked read Task 1つ当たりの読み込み量 : 16 kbyte * 48
|
|
702 </p>
|
|
703 <p>
|
|
704 OS : Mac OS 10.9.2
|
|
705 </p>
|
|
706 <table border="2" cellpadding="0" cellspacing="0">
|
|
707 <tbody>
|
|
708 <tr align="center">
|
|
709 <td>madvise flag </td>
|
|
710 <td></td>
|
|
711 <td>time(s)</td>
|
|
712 </tr>
|
|
713 <tr>
|
|
714 <td>MADV_NORMAL(default)</td>
|
|
715 <td></td>
|
|
716 <td><div align=right>11.841</div></td>
|
|
717 </tr>
|
|
718 <tr>
|
|
719 <td>MADV_RANDOM</td>
|
|
720 <td></td>
|
|
721 <td><div align=right>42.891</div></td>
|
|
722 </tr>
|
|
723 <tr>
|
|
724 <td>MADV_SEQENTIAL</td>
|
|
725 <td></td>
|
|
726 <td><div align=right>38.935</div></td>
|
|
727 </tr>
|
|
728 <tr>
|
|
729 <td>MADV_WILLNEED</td>
|
|
730 <td></td>
|
|
731 <td bgcolor="#ffffcc"><div align=right>10.916</div></td>
|
|
732 </tr>
|
|
733 <tr>
|
|
734 <td>MADV_DONTNEED</td>
|
|
735 <td></td>
|
|
736 <td><div align=right>17.506</div></td>
|
|
737 </tr>
|
|
738 <tr>
|
|
739 <td>MADV_FREE</td>
|
|
740 <td></td>
|
|
741 <td><div align=right>16.863</div></td>
|
|
742 </tr>
|
|
743 </tbody>
|
|
744 </table>
|
|
745
|
|
746 <ul>
|
|
747 <li>
|
|
748 madvise はマッピングされたメモリに対してどのように処理を行うか指定することができる。kernel はそれに応じて読み込みを行う。
|
|
749 </li>
|
|
750 <li>
|
|
751 kernel に読み込みを任せたほうが速い。
|
|
752 </li>
|
|
753 <li>
|
|
754 mmap でファイルの読み込みを行うときは、madvise で MADV_WILLNEED(先読みしておいたほうがよい) で設定すると最も速くなった。
|
|
755 </li>
|
|
756 </ul>
|
|
757 </div>
|
|
758
|
|
759
|
|
760
|
|
761 <div class='slide'>
|
|
762 <h2>実験5: 別のコンピュータにて測定</h2>
|
|
763 <ul>
|
|
764 <li>OS : <font color=red>CentOS 6.5</font></li>
|
|
765 <li>CPU : Core i7-3770 3.40GHz</li>
|
|
766 <li>Memory : 16GB</li>
|
|
767 <li>HDD : 2TB 7200 rpm SATA <font color=red>6.0 Gbps</font> </li>
|
|
768 </ul>
|
|
769 <p>
|
|
770 ファイルをキャッシュから追い出すために、以下のコマンドを実行した。
|
|
771 <pre>% sysctl -w vm.drop_caches=3</pre>
|
|
772 <p>
|
|
773 Blocked read Task 1つ当たりの読み込み量 : 16 kbyte * 48
|
|
774 </p>
|
|
775 <table border="2" cellpadding="0" cellspacing="0">
|
|
776 <tbody>
|
|
777 <tr align="right">
|
|
778 <td>read mode \ CPU num</td>
|
|
779 <td></td>
|
|
780 <td>CPU 1</td>
|
|
781 <td>CPU 2</td>
|
|
782 <td>CPU 3</td>
|
|
783 <td>CPU 4</td>
|
|
784 <td>CPU 8</td>
|
|
785 </tr>
|
|
786 <tr>
|
|
787 <td>mmap</td>
|
|
788 <td></td>
|
|
789 <td><div align=right>6.852</div></td>
|
|
790 <td><div align=right>6.765</div></td>
|
|
791 <td><div align=right>7.632</div></td>
|
|
792 <td><div align=right>12.504</div></td>
|
|
793 <td><div align=right>7.649</div></td>
|
|
794 </tr>
|
|
795 <tr>
|
|
796 <td>read</td>
|
|
797 <td></td>
|
|
798 <td><div align=right>10.545</div></td>
|
|
799 <td><div align=right>8.699</div></td>
|
|
800 <td><div align=right>8.667</div></td>
|
|
801 <td><div align=right>8.152</div></td>
|
|
802 <td><div align=right>7.607</div></td>
|
|
803 </tr>
|
|
804 <tr>
|
|
805 <td>Blocked Read(SPE_ANY)</td>
|
|
806 <td></td>
|
|
807 <td><div align=right>8.686</div></td>
|
|
808 <td><div align=right>10.606</div></td>
|
|
809 <td><div align=right>12.995</div></td>
|
|
810 <td><div align=right>11.799</div></td>
|
|
811 <td><div align=right>14.723</div></td>
|
|
812 </tr>
|
|
813 <tr>
|
|
814 <td>Blocked Read(IO_0)</td>
|
|
815 <td></td>
|
|
816 <td><div align=right>6.751</div></td>
|
|
817 <td><div align=right>6.800</div></td>
|
|
818 <td><div align=right>7.311</div></td>
|
|
819 <td><div align=right>7.016</div></td>
|
|
820 <td><div align=right>6.755</div></td>
|
|
821 <!--
|
|
822 <td bgcolor="#ffffcc">Blocked Read(IO_0)</td>
|
|
823 <td bgcolor="#ffffcc">99.2</td>
|
|
824 -->
|
|
825 </tr>
|
|
826 </tbody>
|
|
827 </table>
|
|
828 <ul>
|
|
829 <li>
|
|
830 read だけの時間を測定すると、<font color=red>6.742 秒</font>となった。
|
|
831 </li>
|
|
832 <li>
|
|
833 Mac OS X のときとほとんど同じ傾向を示しているが、Blocked Read(SPE_ANY)のときだけ極端に遅くなった。
|
|
834 </li>
|
|
835 </ul>
|
|
836 <p>
|
|
837 実験1の測定結果(Mac OS X)
|
|
838 </p>
|
|
839 <table border="2" cellpadding="0" cellspacing="0">
|
|
840 <tbody>
|
|
841 <tr>
|
|
842 <td align=center>read mode \ CPU num</td>
|
|
843 <td></td>
|
|
844 <td align=center>CPU 1</td>
|
|
845 <td align=center>CPU 4</td>
|
|
846 <td align=center>CPU 8</td>
|
|
847 <td align=center>CPU 12</td>
|
|
848 </tr>
|
|
849 <tr>
|
|
850 <td align=center>mmap</td>
|
|
851 <td></td>
|
|
852 <td>15.353</td>
|
|
853 <td>11.287</td>
|
|
854 <td>11.707</td>
|
|
855 <td>11.137</td>
|
|
856 </tr>
|
|
857 <tr>
|
|
858 <td align=center>read</td>
|
|
859 <td></td>
|
|
860 <td>16.846</td>
|
|
861 <td>11.730</td>
|
|
862 <td>11.487</td>
|
|
863 <td>11.437</td>
|
|
864 </tr>
|
|
865 <tr>
|
|
866 <td align=center>Blocked Read(SPE_ANY)</td>
|
|
867 <td></td>
|
|
868 <td>13.297</td>
|
|
869 <td>11.984</td>
|
|
870 <td>10.887</td>
|
|
871 <td>11.146</td>
|
|
872 </tr>
|
|
873 <tr>
|
|
874 <td align=center>Blocked Read(IO_0)</td>
|
|
875 <td></td>
|
|
876 <td>11.503</td>
|
|
877 <td>11.437</td>
|
|
878 <td>11.365</td>
|
|
879 <td>11.412</td>
|
|
880 <!--
|
|
881 <td bgcolor="#ffffcc">Blocked Read(IO_0)</td>
|
|
882 <td bgcolor="#ffffcc">99.2</td>
|
|
883 -->
|
|
884 </tr>
|
|
885 </tbody>
|
|
886 </table>
|
|
887 </div>
|
|
888
|
|
889 <div>
|
|
890 <h2>実験5: 別のコンピュータにて測定</h2>
|
|
891 <img src='images/CentOS_cpu_var.png' style="height:800px"align="middle"><br>
|
|
892 </div>
|
|
893
|
|
894 <div class='slide'>
|
|
895 <h2>考察</h2>
|
|
896 <p>
|
|
897 mmap での実行時は、Blocked Read size を小さくしたほうが速度が向上した。これは、まとめと読み込むサイズが小さくなればなるほど、sequential access に近い動作になるからであると考えられる。
|
|
898 </p>
|
|
899 <p>
|
|
900 I/O の読み込みと並列計算を分離して、同時に処理させたほうが、全体的に安定した速度がでるが、mmapだと一度に読み込む大きさが小さければ速い。
|
|
901 </p>
|
|
902 <p>
|
|
903 mmapは読み込みの大きさによって全体の速度が変わってしまうが、どんな大きさでも安定した速度で改良する余地があると思われる。
|
|
904 </p>
|
|
905 <p>
|
|
906
|
|
907 </p>
|
|
908 </div>
|
|
909
|
|
910 <div class='slide'>
|
|
911 <h2>まとめ</h2>
|
|
912 <ul>
|
|
913 <li> I/O と Task を分離し、同時に動くように改良し、どの環境でも安定した速度が出た。 </li>
|
|
914 <li> I/O 専用の Thread の追加 </li>
|
|
915 <li>
|
|
916 mmap でも一度に読み込む大きさを小さくすれば、Blocked Read とほぼ同じ速度が出る。
|
|
917 </li>
|
|
918 </ul>
|
|
919 <h2 class="yellow">今後の課題</h2>
|
|
920 <ul>
|
|
921 <li> Cerium の API として実装 </li>
|
|
922 <li>
|
|
923 様々な実装の試み<br>(I/O threads を 2つ使用したプログラム、分割 mmap)
|
|
924 </li>
|
|
925 <li>
|
|
926 様々な環境での測定
|
|
927 </li>
|
|
928 <li>
|
|
929 grepの実装
|
|
930 </li>
|
|
931 </ul>
|
|
932 </div>
|
|
933
|
|
934 </div> <!-- presentation -->
|
|
935 </body>
|
|
936 </html>
|