view slide/s6/index.html @ 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 5352d96f5cf6
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 による文字列処理の並列処理</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>
      
        <!--

        -->
      <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>
      <p>
        -> 本研究では並列計算を Word Count で実装を行った。
      </p>
      </div>

      <div class='slide'>
    <h2>mmap の特徴</h2>

    <object data="images/cerium/blockedread.svg" type="image/svg+xml"></object><br>
    <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>
    <object data="images/vector/abab.svg" type="image/svg+xml"></object><br>
    <!--図を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>
<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> SPE_ANY は、Cerium Task Manager がそれぞれの Task に自動的に CPU を割り振ってくれる。<br>
-> I/O が連続で動作する保証がなくなってしまう。
</li>
<li> <font color=red>CPU 4 以上</font>からはほとんど同じ実行結果を示した。 </li>
<li> 実行時間のほとんどは I/O の読み込みの時間となっている。<br>
read でファイル読み込みだけの時間を測定すると、<font color=red>11.166 秒</font>となった。 </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>
<br>
<br>
<br>
</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>