Mercurial > hg > Papers > 2016 > masa-master
changeset 59:4d42d11ebed6
add
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 14 Feb 2016 03:53:50 +0900 |
parents | 69467f538e4e |
children | d6bdf7a93205 |
files | slide/s6/index.html |
diffstat | 1 files changed, 3 insertions(+), 581 deletions(-) [+] |
line wrap: on
line diff
--- a/slide/s6/index.html Sun Feb 14 02:56:09 2016 +0900 +++ b/slide/s6/index.html Sun Feb 14 03:53:50 2016 +0900 @@ -87,7 +87,7 @@ <table width="90%" height="90%" border="0" align="center"> <tr> <td><div align="center"> - <h1><font color="#808db5">Cerium による並列処理向け I/O の実装</font></h1> + <h1><font color="#808db5">Cerium による文字列処理の並列処理</font></h1> </div></td> </tr> <tr> @@ -112,34 +112,8 @@ </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> @@ -182,7 +156,7 @@ <div class='slide'> <h2>mmap の特徴</h2> - <img src='images/mmap.png' style="height:400px" align="middle" > + <object data="images/cerium/blockedread.svg" type="image/svg+xml"></object><br> <br> <ul> @@ -204,7 +178,7 @@ <p>mmap を使用せずに、read を独立したスレッドで実行させる。そして、読み込んだ部分に対して Word Count を並列に起動する。 </p> <br> - <img src='images/divide_read.png' style="height:350px" align="middle" > + <object data="images/vector/abab.svg" type="image/svg+xml"></object><br> <!--図をUML に近いものに変更 --> <br> @@ -220,133 +194,6 @@ </div> <div class='slide'> - <h2>読み込みを行ってから計算を行う</h2> - <br> - <img src='images/read.png' style="height:450px" 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:350px"></td> - <td> - <ol> - <li>User が Taskを生成</li> - <li>依存関係のチェック</li> - <li>各Schedulerに Task を転送</li> - </ol> - </td> - </tr> - </tbody> - </table> - <p> - User が Word Count などの Task を生成して、それらを GPU や CPU などに計算させるように User 自身で設定することができる。 - </p> - <p> - ファイルを読みながら、Word Count や grep などを 並列実行したい。<br> - </p> - <p> - 計算よりも読み込みを優先しなければならない。読み込みで待ちが入ってしまうので、IO Thread を追加。 - </p> - </div> - - <div class='slide'> - <h2>大きなファイルに対するデータ並列</h2> - <br> - <img src='images/includeIOTask.png' style="height:450px" align="middle"> - <ol> - <li>ファイルをある一定の大きさずつ読み込む</li> - <li>読み込んだテキストファイルに対して、それぞれ 並列に計算 を行う</li> - <li>計算の結果を集計する</li> - </ol> - </div> - - <div class='slide'> - <h2>Blocked Read の実装</h2> - <p> - 読み込みながら並列計算を実行する方法を、Blocked Read と名付けた。 - </p> - <br> - <img src='images/blockread.png' style="height:400px"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> - Blocked Read の実装だけでは、Blocked Read Task 間に Task が割り込まれてしまう可能性がある。 - </li> - <li> - I/O を含むアプリケーションの実行時間のほとんどが I/O の時間になることが多い。 - </li> - <li> - 読み込みの間に Task が割り込まれると、下の図のように全体の実行速度が遅くなってしまう。 - </li> - <br><img src='images/read_break.png' style="height:350px"align="middle"><br> - <li>Blocked Read Task に I/O 専用 thread を用意して、 Word Count とは別に Thread を割り当てることにより、Blocked Read Task 間に Task が割り込まれないようにした。</li> - <li>Thread レベルで割り込まれないように、pthread_setschedparam にて IO_0 の priority を設定している。<br> - </li> - </ul> - </div> - - <div class='slide'> <h2>実験概要</h2> <p>実験環境</p> <ul> @@ -482,431 +329,6 @@ <br> </div> -<div> - <h2>実験1: 使用 CPU 数を変更させた時の実行速度の比較</h2> - <img src='images/cpu_var.png' style="height:800px"align="middle"><br> -</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 bgcolor="#ffffcc">10.295</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> - <font color=red>本研究ではI/O をBlocked Read(IO_0)で実装してなおかつ、CPU 12 の時、最速となった。</font> - </li> - </ul> -<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> - </div> - -<div> - <h2>実験2: Blocked Read size を変更してみる</h2> - <img src='images/128cpu_var.png' style="height:800px"align="middle"><br> -</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> - どの大きさでも read と Blocked Read(IO_0) は安定した速度がでる。 - </li> - </ul> - </div> - -<div> - <h2>実験3: CPU 数を固定して、Blocked Read size を変更してみる</h2> - <img src='images/brsize_ver.png' style="height:800px"align="middle"><br> -</div> - - <div class='slide'> -<h2>実験4: mmap 後に madvise で読み込み方法を設定する</h2> - -<p> -Blocked read Task 1つ当たりの読み込み量 : 16 kbyte * 48 -</p> -<p> -OS : Mac OS 10.9.2 -</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 bgcolor="#ffffcc"><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> - <li> - mmap でファイルの読み込みを行うときは、madvise で MADV_WILLNEED(先読みしておいたほうがよい) で設定すると最も速くなった。 - </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> -<ul> -<li> - read だけの時間を測定すると、<font color=red>6.742 秒</font>となった。 -</li> -<li> - Mac OS X のときとほとんど同じ傾向を示しているが、Blocked Read(SPE_ANY)のときだけ極端に遅くなった。 -</li> -</ul> -<p> -実験1の測定結果(Mac OS X) -</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> -<h2>実験5: 別のコンピュータにて測定</h2> - <img src='images/CentOS_cpu_var.png' style="height:800px"align="middle"><br> -</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>