Mercurial > hg > Papers > 2014 > masakoha-sigos
view slide/index.html @ 32:a33defe57134
add result
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 08 May 2014 19:43:00 +0900 |
parents | 9b043cb87ee9 |
children | cd6450a37edf |
line wrap: on
line source
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>slide</title> <!-- Notes on CSS media types used: 1) projection -> slideshow mode (display one slide at-a-time; hide all others) 2) screen -> outline mode (display all slides-at-once on screen) 3) print -> print (and print preview) Note: toggle between projection/screen (that is, slideshow/outline) mode using t-key Questions, comments? - send them along to the mailinglist/forum online @ http://groups.google.com/group/webslideshow --> <!-- styles --> <style media="screen,projection"> html, body, .presentation { margin: 0; padding: 0; } .slide { display: none; position: absolute; top: 0; left: 0; margin: 0; border: none; padding: 2% 4% 0% 4%; /* css note: order is => top right bottom left */ -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; width: 100%; height: 100%; /* css note: lets use border-box; no need to add padding+border to get to 100% */ overflow-x: hidden; overflow-y: auto; z-index: 2; } .slide.current { display: block; } /* only display current slide in projection mode */ .slide .stepcurrent { color: black; } .slide .step { color: silver; } /* or hide next steps e.g. .step { visibility: hidden; } */ .slide { /* background-image: -webkit-linear-gradient(top, blue, aqua, blue, aqua); background-image: -moz-linear-gradient(top, blue, aqua, blue, aqua); */ } </style> <style media="screen"> .slide { border-top: 1px solid #888; } .slide:first-child { border: none; } </style> <style media="print"> .slide { page-break-inside: avoid; } .slide h1 { page-break-after: avoid; } .slide ul { page-break-inside: avoid; } </style> <!-- add js lib (jquery) --> <script src="js/jquery-1.7.min.js"></script> <!-- S6 JS --> <script src="js/jquery.slideshow.js"></script> <script src="js/jquery.slideshow.counter.js"></script> <script src="js/jquery.slideshow.controls.js"></script> <script> $(document).ready( function() { Slideshow.init(); // Example 2: Start Off in Outline Mode // Slideshow.init( { mode: 'outline' } ); // Example 3: Use Custom Transition // Slideshow.transition = transitionScrollUp; // Slideshow.init(); // Example 4: Start Off in Autoplay Mode with Custom Transition // Slideshow.transition = transitionScrollUp; // Slideshow.init( { mode: 'autoplay' } ); } ); </script> </head> <body> <div class="presentation"> <div class='slide cover'> <table width="90%" height="90%" border="0" align="center"> <tr> <td><div align="center"> <h1>Cerium による並列処理向け I/O の実装</h1> </div> </td> </tr> <tr> <td><div align="right"> <name>古波倉 正隆,河野 真治</name> </div></td> </tr> </tr> </table> </div> <div id="cover"> <h3>I/Oを含むアプリケーションの並列化</h3> ファイル内の文字列検索を行うようなプログラムを走らせたとき、 <font color = red>文字列検索よりもファイルの読み込みに時間がかかる</font>ことが多い。 I/O は、ディスクからの読み込む時間がかかる。<br> -> <font color = red>I/O をどうにか速くできないか?</font> <p> Cerium : <br> CellおよびLinux、 Mac OS X 上で動く並列プログラミングフレームワーク </p> <img src='images/resources.png' style="height:170px" align="middle"> <ul> <li><font color=red>ファイル読み込みとアプリケーションの分離</font> </li> <li><font color=red>I/O専用の Threadを追加</font></li> </ul> mmap 実装と比較して1.5倍の速度を得た </div> <div id="cover"> <h3>Cerium Task Manager の構造</h3> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td><img src='images/ceriumtaskmanager.png' style="height:280px"></td> <td> <ol> <li>Taskを生成</li> <li>依存関係のチェック</li> <li>Schedulerに転送</li> <li>並列実行</li> </ol> </td> </tr> </tbody> </table> <p> ファイルを読みながら、Word Count や grep などを 並列実行したい。<br> -> 本研究では Word Count にて実装を行った。 </p> <p> 計算よりも読み込みを優先しなければならない。読み込みで待ちが入ってしまうので、IO Thread を追加。 </p> </div> <div class='cover'> <h3>Block 単位の読み込みと並列計算</h3> <br> <img src='images/includeIOTask.png' style="height:270px" align="middle"> <ol> <li>ファイルをある一定の大きさずつ読み込む</li> <li>読み込んだテキストファイルに対して、それぞれ WordCount を行う</li> <li>WordCount の結果を集計する</li> </ol> </div> <div class='cover'> <h3>mmap の特徴</h3> <img src='images/mmap.png' style="height:250px" align="middle" > <br> <ul> <li> mmap は、仮想メモリ空間にファイルの中身を対応させ、そのメモリ空間に アクセスされたら、 OS が読み込みを行う。<br> </li> <li> code の記述はシンプルだが、スレッドが読み込み終わるまで待たされる。 <br> </li> <li> 読み込みが OS 依存となるので、環境に左右されやすく、読み込みを細かく制御することが難しい。 </li> </ul> </div> <div class='cover'> <h3>読み込みながら計算を行う</h3> <p>mmap を使用せずに、read を独立したスレッドで実行させる。そして、読み込んだ部分に対して Word Count を並列に起動する。 </p> <br> <img src='images/divide_read.png' style="height:250px" align="middle" > <br> <ul> <li> read は全て読み込み終えるまで連続で動作しファイルを読み込む </li> <li> read の待ちは CPU を消費しない </li> <li> 読み込み終わったブロックに対して、Word Count を起動する </li> </ul> </div> <div class='cover'> <h3>Blocked Read の実装</h3> <br> <img src='images/blockread.png' style="height:250px"align="middle"> <br> <ul> <li> WordCount Task を一度に全て生成すると、その Task でメモリを圧迫する。 </li> <li> ある程度の数でまとめた Block という単位で徐々に Task を起動していく。 </li> <li> 読み込んでいない部分に Word Count が走らないように、Blocked Read Task が読み込み終わるまで、Task Blockを待たせる。 </li> <li> 待ち合わせには Cerium の wait for を使用する。 </li> <li> Word Count Task 1つで処理するファイルの大きさを L<br> Task Block 1つ当たりに含まれている Word Count Task の数を n<br> とすると、Blocked Read Task 1つ当たりの読み込み量は L * n となる。 </li> </ul> </div> <!-- <div class="cover"> <h3>I/O 専用 thread の実装前</h3> <br> <img src='images/SPE_ANYblockread.png' style="height:300px"> <ul> <li> Cerium では、各種 Task にデバイスの設定をすることができる。 </li> <li> デバイスの設定を SPE_ANY で行うと、Cerium Task Manager 側で自動的に CPU を割り振ってくれる。 </li> <li> 自動的に割り振ってしまうと、 Blocked Read の隙間に Word Count が割り込んでしまい、読み込みの時間が伸びてしまう。 <font color=red>-> 自動的に割り振られないように、I/O専用 Thread を用意した。</font> </li> </ul> </div> --> <div class='cover'> <h3>I/O 専用 thread での Blocked Read の実装</h3> <br> <img src='images/IO_0blockread.png' style="height:300px"> <ul> <li>Word Count とは別に Thread を割り当てているので、Blocked Read Task 間に Word Count が割り込まれることがない。</li> <li>Thread レベルで割り込まれないように、pthread_setschedparam にて IO_0 の priority を設定している。<br> </li> </ul> </div> <div class='cover'> <h3>実験概要</h3> <p>実験環境</p> <ul> <li> Mac OS X 10.9.1</li> <li> 2*2.66 GHz 6-Core Intel Xeon</li> <li> Memory 16GB</li> <li> HDD 1TB 7200 rpm SATA 3.0 Gbps </li> <li> ファイルに Word Count をかける</li> <li> ファイルの読み込みから結果までを測定</li> </ul> </div> <div class='cover'> <h3>実験 : CPU 数での比較</h3> <p>file size 1GB</p> <p>表内の数値の単位は全て秒である。</p> <!-- 1度に読み込む量を書かないといけない --> <!-- bldsv 12 ssd あるってよ--> Blocked read Task 1つ当たりの読み込み量は 128kbyte * 48 で設定している。 <table border="2" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>read mode \ CPU num</td> <td></td> <td>CPU 1</td> <td>CPU 4</td> <td>CPU 8</td> <td>CPU 12</td> </tr> <tr> <td>mmap</td> <td></td> <td>20.179</td> <td>22.861</td> <td>22.789</td> <td>22.713</td> </tr> <tr> <td>read</td> <td></td> <td>21.351</td> <td>15.737</td> <td>14.785</td> <td>12.520</td> </tr> <tr> <td>Blocked Read(SPE_ANY)</td> <td></td> <td>18.531</td> <td>15.646</td> <td>15.287</td> <td>14.028</td> </tr> <tr> <td>Blocked Read(IO_0)</td> <td></td> <td>13.930</td> <td>14.634</td> <td>14.774</td> <td>10.295</td> <!-- <td bgcolor="#ffffcc">Blocked Read(IO_0)</td> <td bgcolor="#ffffcc">99.2</td> --> </tr> </tbody> </table> <!-- <ul> <li> CPU 12 のとき、Blocked Read(IO_0) が mmap より<font color=red>2.21倍</font> 速度が向上した。<br> </li> <li> Blocked Read を IO 専用 thread で実装すると、<font color=red>1.36 倍</font> の改善が見られた。<br> </li> <li> mmap で並列の Task で走らせると 1つ1つの Task がファイルを読み込み、ランダムアクセスとなって<br>しまうため速度が遅くなってしまう。</li> </ul> --> <h3>実験 : Blocked Read size を変更してみる</h3> Blocked read Task 1つ当たりの読み込み量は <font color=red>16kbyte </font>* 48 で設定している。 <table border="2" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>read mode \ CPU num</td> <td></td> <td>CPU 1</td> <td>CPU 4</td> <td>CPU 8</td> <td>CPU 12</td> </tr> <tr> <td>mmap</td> <td></td> <td>15.353</td> <td>11.287</td> <td>11.707</td> <td>11.137</td> </tr> <tr> <td>read</td> <td></td> <td>16.846</td> <td>11.730</td> <td>11.487</td> <td>11.437</td> </tr> <tr> <td>Blocked Read(SPE_ANY)</td> <td></td> <td>13.297</td> <td>11.984</td> <td>10.887</td> <td>11.146</td> </tr> <tr> <td>Blocked Read(IO_0)</td> <td></td> <td>11.503</td> <td>11.437</td> <td>11.365</td> <td>11.412</td> <!-- <td bgcolor="#ffffcc">Blocked Read(IO_0)</td> <td bgcolor="#ffffcc">99.2</td> --> </tr> </tbody> </table> <!-- <ul> <li>CPU 4つ以上からは、読み込み方法を変えても結果がほとんど同じとなった。</li> <li>mmap はコードがシンプルでもかなり速く動作するが、チューニング次第で Blocked Read のほうが速く動作する。</li> </ul> --> <!-- Blocked read Task をそれぞれ変更してみる。<br> CPU 12 --> <h3>実験 : CPU 数を固定して、Blocked Read size を変更してみる</h3> Word Count Task 1つ当たりの処理量を 4kByte ~ 256kByte で変化させてみた。 <table border="2" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>read mode \ Blocled Read size</td> <td></td> <td> 4k * 48 </td> <td> 8k * 48 </td> <td> 16k * 48 </td> <td> 32k * 48 </td> <td> 64k * 48 </td> <td> 128k * 48 </td> <td> 256k * 48 </td> </tr> <tr> <td>mmap</td> <td></td> <td><div align=right>11.867</div></td> <td><div align=right>10.570</div></td> <td><div align=right>11.803</div></td> <td><div align=right>14.915</div></td> <td><div align=right>16.626</div></td> <td><div align=right>16.923</div></td> <td><div align=right>18.474</div></td> </tr> <tr> <td>read</td> <td></td> <td><div align=right>12.020</div></td> <td><div align=right>11.585</div></td> <td><div align=right>11.729</div></td> <td><div align=right>11.661</div></td> <td><div align=right>12.497</div></td> <td><div align=right>11.347</div></td> <td><div align=right>11.658</div></td> </tr> <tr> <td>Blocked Read(SPE_ANY)</td> <td></td> <td><div align=right>11.508</div></td> <td><div align=right>15.932</div></td> <td><div align=right>11.407</div></td> <td><div align=right>12.816</div></td> <td><div align=right>12.454</div></td> <td><div align=right>12.891</div></td> <td><div align=right>11.962</div></td> </tr> <tr> <td>Blocked Read(IO_0)</td> <td></td> <td><div align=right>11.342</div></td> <td><div align=right>12.242</div></td> <td><div align=right>11.636</div></td> <td><div align=right>12.331</div></td> <td><div align=right>10.870</div></td> <td><div align=right>11.295</div></td> <td><div align=right>11.723</div></td> <!-- <td bgcolor="#ffffcc">Blocked Read(IO_0)</td> <td bgcolor="#ffffcc">99.2</td> --> </tr> </tbody> </table> </div> <!-- --> <div class='cover'> <h3>実験 : OS とコンピュータを変更してみる</h3> <p>実験環境</p> <ul> <li> Cent OS 6.5</li> <li> Core i7-3770 3.40GHz</li> <li> Memory 16GB</li> <li> HDD 2TB 7200 rpm SATA 6.0 Gbps </li> <li> file size 1GB </li> </ul> <table border="2" cellpadding="0" cellspacing="0"> <tbody> <!-- align = right 寄ってくれない(´;ω;`)ウッ…--> <tr align="right"> <td>read mode \ CPU num</td> <td></td> <td>CPU 1</td> <td>CPU 2</td> <td>CPU 3</td> <td>CPU 4</td> <td>Thread 8</td> </tr> <tr> <td>mmap</td> <td></td> <td><div align=right>6.852</div></td> <td><div align=right>6.765</div></td> <td><div align=right>7.632</div></td> <td><div align=right>12.504</div></td> <td><div align=right>7.649</div></td> </tr> <tr> <td>read</td> <td></td> <td><div align=right>10.545</div></td> <td><div align=right>8.699</div></td> <td><div align=right>8.667</div></td> <td><div align=right>8.152</div></td> <td><div align=right>7.607</div></td> </tr> <tr> <td>Blocked Read(SPE_ANY)</td> <td></td> <td><div align=right>8.686</div></td> <td><div align=right>10.606</div></td> <td><div align=right>12.995</div></td> <td><div align=right>11.799</div></td> <td><div align=right>14.723</div></td> </tr> <tr> <td>Blocked Read(IO_0)</td> <td></td> <td><div align=right>6.751</div></td> <td><div align=right>6.800</div></td> <td><div align=right>7.311</div></td> <td><div align=right>7.016</div></td> <td><div align=right>6.755</div></td> <!-- <td bgcolor="#ffffcc">Blocked Read(IO_0)</td> <td bgcolor="#ffffcc">99.2</td> --> </tr> </tbody> </table> <!-- size が小さくなると、シーケンシャルの読み込みに近いので、ランダムだと mmap が遅くなってしまう。 stream 演算 I/O の ぷらいおりてぃ 上げないでどうなるかどうか division size = 64k 256k --> </div> <div class='cover'> <h3>まとめ</h3> <ul> <li> I/O と Task を分離し、同時に動くように改良した。 </li> <li> I/O 専用の Thread の追加 </li> <li> I/O を含む Task をで並列実装するときに mmap では不向きであり、 Blocked Read で読み込みを制御したほうが効果的。 </li> </ul> <h3 class="yellow">今後の課題</h3> <ul> <li> Cerium の API として実装 </li> <li> 様々な実装の試み<br>(I/O threads を 2つ、分割 mmap・・・) </li> <li> grepの実装 </li> </ul> </div> <div class="cover"> </div> <div class='cover'> </div> </div> <!-- presentation --> </body> </html>