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>