Mercurial > hg > Papers > 2014 > masakoha-sigos
view presen/s6/index.html @ 41:46dd50de6f90
fix CentOS
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 13 May 2014 20:14:16 +0900 |
parents | e47b86ad3214 |
children | 0652d8e21b4c |
line wrap: on
line source
<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <title>sigos</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 --> <!-- style sheet links --> <link rel="stylesheet/less" href="themes/blank/projection.css.less" media="screen,projection"> <link rel="stylesheet/less" href="themes/blank/screen.css.less" media="screen"> <link rel="stylesheet/less" href="themes/blank/print.css.less" media="print"> <link rel="stylesheet/less" href="themes/blank/blank.css.less" media="screen,projection"> <!-- Notes about less css support - all less stylesheets (*.css.less) need to get listed/loaded first (before the less.js script) - find more info about less.js online @ http://lesscss.org ***** NOTE: less.js browser script currently won’t work if you’re using Google Chrome and the path to your page starts with "file:///" due to a known Chrome issue. (In the developer/js console you will see: XMLHttpRequest cannot load file:///../s6/shared/projection.css.less. Cross origin requests are only supported for HTTP.) --> <!-- add js libs (less, jquery) --> <script src="js/less-1.1.4.min.js"></script> <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 src="js/jquery.slideshow.footer.js"></script> <script src="js/jquery.slideshow.autoplay.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> <!-- Better Browser Banner for Microsoft Internet Explorer (IE) --> <!--[if IE]> <script src="js/jquery.microsoft.js"></script> <![endif]--> </head> <body> <div class="layout"> <div id="header"></div> <div id="footer"> <div align="right"> <img src="images/concurrency.png" width="200"> </div> </div> </div> <div class="presentation"> <!-- add slides here; example --> <div class='slide cover'> <table width="90%" height="90%" border="0" align="center"> <tr> <td><div align="center"> <h1><font color="#808db5">Cerium による並列処理向け I/O の実装</font></h1> </div></td> </tr> <tr> <td><div align="left"> Masataka Kohagura,Shinji Kono, <script> var date = new Date(); var year = date.getFullYear(); var month = date.getMonth(); var day = date.getDate(); var monthList = new Array("January","February","March","April","May","June", "July","August","September","October","November","December"); document.write(monthList[month]+" "+day+", "+year); </script> <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:300%;height:0.2em;"> </div></td> </tr> </table> </div> <!-- 研究目的書こう アプリケーションはI/o の速度無視できない I/Oを並列処理やるとき、Cerium ではどうするか 1つ I/O と Task が同時におこるあ 2つ I/O は連続で動作する 並列処理してることによって I/O の処理をみださされることを防ぎたい --> <!-- (1) read->task (2) read task (3) mmap mmap での充分はやくなる 並列時でも充分に速くなる mmap 改良する余地がある MAX_FIXED などのオプションを変更しても速度はかわならなかった -> 実はそのオプション、最近は見ていないんじゃね?? --> <div class='slide'> <h2>はじめに</h2> <p> ファイルを読み込んで計算を行うようなアプリケーションは、I/O の速度を無視することができない。 ファイルを全て読み込んでから並列計算をすると、読み込んでいる時間がオーバーヘッドとなってしまう。 </p> <p> 本研究室では、並列プログラミングフレームワーク Cerium を使用することによって並列計算を可能にしているが、Cerium で I/O と並列計算を同時に走らせるにはどのように実装すればいいか考慮した。 </p> <ol> <li> I/O と並列計算を同時に動作させる。 </li> <li> I/O は連続で動作させる。 </li> </ol> <p> 上記 2点を実装して、I/O と並列計算が同時に実行し、なおかつ I/O の処理を乱されないようにすることによって、全体のパフォーマンスを上げたい。 </p> <p>I/O の読み込みと並列計算の方法は以下の 3 つの方法を試みた。</p> <ol> <li> mmap 後に並列計算 </li> <li> read 後に並列計算 </li> <li> read と 並列計算 が同時に実行 </li> </ol> </div> <div class='slide'> <h2>mmap の特徴</h2> <img src='images/mmap.png' style="height:300px" align="middle" > <br> <ul> <li> mmap は、仮想メモリ空間にファイルの中身を対応させ、そのメモリ空間に アクセスされたら、 OS が読み込みを行う。<br> </li> <li> code の記述はシンプルだが、スレッドが読み込み終わるまで待たされる。 <br> </li> <li> 読み込みが OS 依存となるので、環境に左右されやすく、読み込みを細かく制御することが難しい。 </li> </ul> </div> <div class='slide'> <h2>読み込みながら計算を行う</h2> <p>mmap を使用せずに、read を独立したスレッドで実行させる。そして、読み込んだ部分に対して Word Count を並列に起動する。 </p> <br> <img src='images/divide_read.png' style="height:350px" align="middle" > <!--図をUML に近いものに変更 --> <br> <ul> <li> read は全て読み込み終えるまで連続で動作しファイルを読み込む </li> <li> read の待ちは CPU を消費しない </li> <li> 読み込み終わったブロックに対して、Word Count を起動する </li> <li> WordCount Task を一度に全て生成すると、その Task でメモリを圧迫するので、 ある程度の数でまとめた Block という単位で徐々に Task を起動していく。 </li> </ul> </div> <div class='slide'> <h2>読み込みを行ってから計算を行う</h2> <br> <img src='images/read.png' style="height:350px" align="middle" > <br> <ul> <li> 読み込みを行ってから計算を行うので、読み込みの間、CPU に待ち時間が発生してオーバーヘッドとなる。 </li> </ul> </div> <div class='slide'> <h2>I/Oを含むアプリケーションの並列化</h2> <p> I/O は、ディスクからの読み込む時間がかかる。<br> -> <font color = red>I/O をどのように実装したら、並列処理とI/Oが干渉をなくして全体のパフォーマンスを上げれるか??</font><br> </p> <p> そこで本研究では、 </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> <li><font color=red>mmap と比較や、様々な実験環境で計測</font></li> </ul> <p> 以上3点を行った。 </p> </div> <div class='slide'> <h2>Cerium Task Manager の構造</h2> <p> Cerium Task Manager: <br> CellおよびLinux、 Mac OS X 上で動く並列プログラミングフレームワーク </p> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td><img src='images/ceriumtaskmanager.png' style="height:280px"></td> <td> <ol> <li>User が Taskを生成</li> <li>依存関係のチェック</li> <li>各Schedulerに Task を転送</li> </ol> </td> </tr> </tbody> </table> <p> ファイルを読みながら、Word Count や grep などを 並列実行したい。<br> -> 本研究では Word Count にて実装を行った。 </p> <p> 計算よりも読み込みを優先しなければならない。読み込みで待ちが入ってしまうので、IO Thread を追加。 </p> </div> <div class='slide'> <h2>大きなファイルに対するデータ並列</h2> <br> <img src='images/includeIOTask.png' style="height:330px" align="middle"> <ol> <li>ファイルをある一定の大きさずつ読み込む</li> <li>読み込んだテキストファイルに対して、それぞれ 並列に計算 を行う</li> <li>計算の結果を集計する</li> </ol> </div> <div class='slide'> <h2>Blocked Read の実装</h2> 読み込みながら並列計算を実行する方法を、Blocked Read と名付けた。 <br> <img src='images/blockread.png' style="height:300px"align="middle"> <!-- UML 形式にして --> <br> <ul> <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='slide'> <h2>I/O 専用 thread での Blocked Read の実装</h2> <br> <!--<img src='images/IO_0blockread.png' style="height:350px">--> <ul> <li> I/O を含むアプリケーションの実行時間は、ほとんどが I/O ネックとなることが多い。 </li> <li> 読み込みの間に Task が割り込まれると、下の図のように全体の実行速度が遅くなってしまう。 </li> <br><img src='images/read_break.png' style="height:300px"align="middle"><br> <li>Blocked Read Task に I/O 専用 thread を用意して、 Word Count とは別に Thread を割り当てることにより、Blocked Read Task 間に Word Count が割り込まれないようにした。</li> <li>Thread レベルで割り込まれないように、pthread_setschedparam にて IO_0 の priority を設定している。<br> </li> </ul> </div> <div class='slide'> <h2>実験概要</h2> <p>実験環境</p> <ul> <li>OS:MacOS 10.9.2</li> <li>CPU:2*2.66GHz 6-Core Intel Xeon</li> <li>GPU:NVIDIA Quadro K5000 4096MB</li> <li>Memory:16GB 1333MHz DDR3</li> <li>HDD : 1TB 7200 rpm SATA 3.0 Gbps </li> <li>Word Count の時間を、ファイルの読み込みから結果出力するまでを測定</li> </ul> Word Count を実行した後に、読み込むファイルをキャッシュから追い出すために、 <pre>% sudo purge </pre> を実行して繰り返し、測定を行っている。 </div> <div class='slide'> <h2>実験1: 使用 CPU 数を変更させた時の実行速度の比較</h2> <p>全ての実験のfile size は 1GB であり、表内の数値の単位は全て秒である。</p> <p> Blocked read Task 1つ当たりの読み込み量 : 16kbyte * 48 </p> <table border="2" cellpadding="0" cellspacing="0"> <tbody> <tr> <td align=center>read mode \ CPU num</td> <td></td> <td align=center>CPU 1</td> <td align=center>CPU 4</td> <td align=center>CPU 8</td> <td align=center>CPU 12</td> <td align=center>GPU(CUDA)</td> </tr> <tr> <td align=center>mmap</td> <td></td> <td>15.353</td> <td>11.287</td> <td>11.707</td> <td>11.137</td> <td><div align=right>103.410</div></td> </tr> <tr> <td align=center>read</td> <td></td> <td>16.846</td> <td>11.730</td> <td>11.487</td> <td>11.437</td> <td><div align=right>106.050</div></td> </tr> <tr> <td align=center>Blocked Read(SPE_ANY)</td> <td></td> <td>13.297</td> <td>11.984</td> <td>10.887</td> <td>11.146</td> <td><div align=right>94.626</div></td> </tr> <tr> <td align=center>Blocked Read(IO_0)</td> <td></td> <td>11.503</td> <td>11.437</td> <td>11.365</td> <td>11.412</td> <td><div align=right>94.496</div></td> <!-- <td bgcolor="#ffffcc">Blocked Read(IO_0)</td> <td bgcolor="#ffffcc">99.2</td> --> </tr> </tbody> </table> <ul> <li> <font color=red>CPU 4 以上</font>からはほとんど同じ実行結果を示した。 </li> <li> 実行時間のほとんどは I/O の読み込みの時間となっている。<br> read だけの時間を測定すると、11.166 秒となった。 </li> <li> GPU を使用した場合、並列計算と I/O を分離させたほうが <font color=red>10%</font> ほど速くなった。 </li> </ul> <p> ファイルがキャッシュに入った時の実行速度は以下のようになった。 </p> <table border="2" cellpadding="0" cellspacing="0"> <tbody> <tr> <td align=center>read mode \ CPU num</td> <td></td> <td align=center>CPU 12</td> <td align=center>GPU</td> </tr> <tr> <td align=center>mmap</td> <td></td> <td><div align=right>0.854</div></td> <td><div align=right>94.479</div></td> </tr> <tr> <td align=center>read</td> <td></td> <td><div align=right>1.487</div></td> <td><div align=right>94.614</div></td> </tr> <tr> <td align=center>Blocked Read(SPE_ANY)</td> <td></td> <td><div align=right>0.847</div></td> <td><div align=right>93.920</div></td> </tr> <tr> <td align=center>Blocked Read(IO_0)</td> <td></td> <td><div align=right>0.866</div></td> <td><div align=right>93.912</div></td> </tr> </tbody> </table> <ul> </ul> </div> <!-- 1度に読み込む量を書かないといけない --> <!-- bldsv 12 ssd あるってよ--> <div class='slide'> <h2>実験2: Blocked Read size を変更してみる</h2> <p> filesize : 1GB </p> <p> Blocked read Task 1つ当たりの読み込み量 : <font color=red>128 kbyte </font>* 48 </p> <table border="2" cellpadding="0" cellspacing="0"> <tbody> <tr> <td align=center>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 align=center>mmap</td> <td></td> <td>20.179</td> <td>22.861</td> <td>22.789</td> <td>22.713</td> </tr> <tr> <td align=center>read</td> <td></td> <td>21.351</td> <td>15.737</td> <td>14.785</td> <td>12.520</td> </tr> <tr> <td align=center>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 align=center>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> <p> 実験1との比較<br> Blocked read Task 1つ当たりの読み込み量 : <font color=red>16 kbyte </font>* 48 </p> <table border="2" cellpadding="0" cellspacing="0"> <tbody> <tr> <td align=center>read mode \ CPU num</td> <td></td> <td align=center>CPU 1</td> <td align=center>CPU 4</td> <td align=center>CPU 8</td> <td align=center>CPU 12</td> </tr> <tr> <td align=center>mmap</td> <td></td> <td>15.353</td> <td>11.287</td> <td>11.707</td> <td>11.137</td> </tr> <tr> <td align=center>read</td> <td></td> <td>16.846</td> <td>11.730</td> <td>11.487</td> <td>11.437</td> </tr> <tr> <td align=center>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 align=center>Blocked Read(IO_0)</td> <td></td> <td>11.503</td> <td>11.437</td> <td>11.365</td> <td>11.412</td> </tr> </tbody> </table> <ul> <li> Blocked Read size を大きくすると、mmap は遅くなってしまう。 </li> <li> <font color=red>Blocked Read(IO_0) かつ、CPU 12 の時、最速となった。</font> </li> </ul> </div> <div class='slide'> <h2>実験3: CPU 数を固定して、Blocked Read size を変更してみる</h2> <p> word count task 1つ当たりの処理量を 4kbyte ~ 256kbyte で変化させてみた。 </p> <p> CPU 12 で全て測定している。 </p> <table border="2" cellpadding="0" cellspacing="0"> <tbody> <tr> <td align=center>read mode \ Blocled Read size</td> <td></td> <td align=center> 4k * 48 </td> <td align=center> 8k * 48 </td> <td align=center> 16k * 48 </td> <td align=center> 32k * 48 </td> <td align=center> 64k * 48 </td> <td align=center> 128k * 48 </td> <td align=center> 256k * 48 </td> </tr> <tr> <td align=center>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 align=center>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 align=center>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 align=center>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> <ul> <li> Blocked Read size を大きくすればするほど、mmap は遅くなる。 </li> <li> どの大きさでも Blocked Read(IO_0) は安定した速度がでる。 </li> </ul> </div> <div class='slide'> <h2>実験4: mmap 後に madvise で読み込み方法を設定する</h2> <p> Blocked read Task 1つ当たりの読み込み量 : 16 kbyte * 48 </p> <table border="2" cellpadding="0" cellspacing="0"> <tbody> <tr align="center"> <td>madvise flag </td> <td></td> <td>time(s)</td> </tr> <tr> <td>MADV_NORMAL(default)</td> <td></td> <td><div align=right>11.841</div></td> </tr> <tr> <td>MADV_RANDOM</td> <td></td> <td><div align=right>42.891</div></td> </tr> <tr> <td>MADV_SEQENTIAL</td> <td></td> <td><div align=right>38.935</div></td> </tr> <tr> <td>MADV_WILLNEED</td> <td></td> <td><div align=right>10.916</div></td> </tr> <tr> <td>MADV_DONTNEED</td> <td></td> <td><div align=right>17.506</div></td> </tr> <tr> <td>MADV_FREE</td> <td></td> <td><div align=right>16.863</div></td> </tr> </tbody> </table> <ul> <li> madvise はマッピングされたメモリに対してどのように処理を行うか指定することができる。kernel はそれに応じて読み込みを行う。 </li> <li> kernel に読み込みを任せたほうが速い。 </li> </ul> </div> <div class='slide'> <h2>実験5: 別のコンピュータにて測定</h2> <ul> <li>OS : <font color=red>CentOS 6.5</font></li> <li>CPU : Core i7-3770 3.40GHz</li> <li>Memory : 16GB</li> <li>HDD : 2TB 7200 rpm SATA <font color=red>6.0 Gbps</font> </li> </ul> <p> ファイルをキャッシュから追い出すために、以下のコマンドを実行した。 <pre>% sysctl -w vm.drop_caches=3</pre> <p> Blocked read Task 1つ当たりの読み込み量 : 16 kbyte * 48 </p> <table border="2" cellpadding="0" cellspacing="0"> <tbody> <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>CPU 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> <p> 実験1の測定結果 </p> <table border="2" cellpadding="0" cellspacing="0"> <tbody> <tr> <td align=center>read mode \ CPU num</td> <td></td> <td align=center>CPU 1</td> <td align=center>CPU 4</td> <td align=center>CPU 8</td> <td align=center>CPU 12</td> </tr> <tr> <td align=center>mmap</td> <td></td> <td>15.353</td> <td>11.287</td> <td>11.707</td> <td>11.137</td> </tr> <tr> <td align=center>read</td> <td></td> <td>16.846</td> <td>11.730</td> <td>11.487</td> <td>11.437</td> </tr> <tr> <td align=center>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 align=center>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> </div> <div class='slide'> <h2>考察</h2> <p> mmap での実行時は、Blocked Read size を小さくしたほうが速度が向上した。これは、まとめと読み込むサイズが小さくなればなるほど、sequential access に近い動作になるからであると考えられる。 </p> <p> I/O の読み込みと並列計算を分離して、同時に処理させたほうが、全体的に安定した速度がでるが、mmapだと一度に読み込む大きさが小さければ速い。 </p> <p> mmapは読み込みの大きさによって全体の速度が変わってしまうが、どんな大きさでも安定した速度で改良する余地があると思われる。 </p> <p> </p> </div> <div class='slide'> <h2>まとめ</h2> <ul> <li> I/O と Task を分離し、同時に動くように改良し、どの環境でも安定した速度が出た。 </li> <li> I/O 専用の Thread の追加 </li> <li> mmap でも一度に読み込む大きさを小さくすれば、Blocked Read とほぼ同じ速度が出る。 </li> </ul> <h2 class="yellow">今後の課題</h2> <ul> <li> Cerium の API として実装 </li> <li> 様々な実装の試み<br>(I/O threads を 2つ使用したプログラム、分割 mmap) </li> <li> 様々な環境での測定 </li> <li> grepの実装 </li> </ul> </div> </div> <!-- presentation --> </body> </html>