view slide/blank.html @ 61:1eea0dd50676

create index
author Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
date Tue, 17 Feb 2015 19:03:05 +0900
parents 0690afa10eb7
children 3a35d13818e5
line wrap: on
line source

<!DOCTYPE html>
<html>
  <head>
    <meta charset='utf-8'>
    <title>Seminar</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="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">マルチプラットフォーム対応<br>並列プログラミングフレームワーク</font></h1>
            </div></td>
          </tr>
          <tr>
            <td><div align="left">
                Yuhi TOMARI
                <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>マルチプラットフォームなフレームワークにおける並列プログラミング 1/2</h2>
        <p>プログラムが PC に要求する処理性能は上がってきているが、
          消費電力や発熱、クロックの限界といった問題から CPU の性能を上げることによる処理性能の向上は難しい。</p>
        <p>プロセッサメーカーはマルチコア CPU や、GPU を含んだヘテロジニアス構成の路線を打ち出している。
          クロックの性能を上げるのではなく、コア数を増やす事でパフォーマンスを向上させている。
        </p>
        <p>
          マルチコア CPU や GPU といった<font color="red">マルチコアプラットフォーム</font>なアーキテクチャ上で
          リソースを有効活用するには、それぞれのプラットフォームに最適な形でプログラムを並列に動作させる必要がある。
          ここでいう最適な形とは、実行の順番やどのリソース上で Task を実行するかといった、
          Scheduling を含めたチューニングのことである。
        </p>
        <p>しかしこれらのチューニングは複雑で、コーディング時に毎回行うと複雑さや拡張性の問題がある。</p>
      </div>


      <div class='slide'>
        <h2>マルチプラットフォームなフレームワークにおける並列プログラミング 2/2</h2>
        <p>
          そういった問題を解決するため、本研究では並列プログラミングフレームワーク、 Cerium の開発を行った。
          異なるプラットフォーム上で最適なチューニングを行うため、以下の実装を行った。
        </p>
        <ul>
          <li>パイプライニングによる Task の並列実行</li>
          <li>OpenCL、CUDA を用いた GPGPU 対応</li>
          <li>データ並列実行</li>
          <li>並列処理むけのI/O</li>
        </ul>
        <p>
          Sort、WordCount、FFT といった例題を元に、これら Cerium の並列実行機構が
          マルチプラットフォームにおける並列プログラミングで有効に作用することを示す。
        </p>
      </div>

      <div class='slide'>
        <h2>並列プログラミングフレームワーク Cerium</h2>
        <p>
          Cerium は Linux、MacOSX 上で動作する汎用計算用の並列プログラミングフレームワークである。
        </p>
        <img src="./images/cerium_image.png" width="700">
        <p>Cerium を用いることでマルチコア CPU と GPU において Scheduling を含めたプログラミングを可能となる。</p>
      </div>

      <div class='slide'>
        <h2>Cerium における Task の生成</h2>
        
        <p>
          Cerium TaskManager では処理の単位を Task としてプログラムを記述していく。
          関数やサブルーチンを Task として扱い、Task に各種パラメタを設定した後に並列実行される。
          Input データの各要素同士を乗算し、 Output に格納する Multiply という例題がある。
          Multiply の例題を元に Cerium で Task が生成される様子を以下に示す。
        </p>
        <pre class="code">
void
multiply_init(TaskManager *manager, float *i_data1,
float *i_data2, float *o_data) {

    // create task
    HTask* multiply = manager->create_task(MULTIPLY_TASK);
    multiply->set_cpu(spe_cpu);

    // set indata
    multiply->set_inData(0, i_data1, sizeof(float) * length);
    multiply->set_inData(1, i_data2, sizeof(float) * length);

    // set outdata
    multiply->set_outData(0, o_data, sizeof(float) * length);

    // set parameter
    multiply−>set_param(0,(long)length);

    // set device
    multiply->set_cpu(SPE_ANY);

    // spawn task
    multiply−>spawn();
}
        </pre>
      </div>
      
      <div class='slide'>
        <h2>Cerium における Task の記述</h2>
        <p>Device 側で実行される Task の記述を示す。</p>
        <pre class="code">
static int
run(SchedTask ∗s) {
    float ∗i_data1 = (float∗)s−>get_input(0); // get input
    float ∗i_data2 = (float∗)s−>get_input(1); // get output
    float ∗o_data  = (float∗)s−>get_output(0); // get parameter
    long length    = (long)s−>get_param(0);

    // calculate
    for (int i=0; i&lt;length; i++) {
        o_data[i] = i_data1[i] ∗ i_data2[i];
    }
    return 0; 
}
        </pre>
        <p>Host 側では Task を生成する際に様々なパラメタを設定しており、
          Task にはそれを取得する API が用意されている。</p>
        <table border="0" >
          <tr bgcolor="palegreen">
            <th align="center">API</th><th align="center">content</th>
          </tr>

          <tr bgcolor="dbffa3">
            <th align="left" >get_input</th><th align="left">入力データのアドレスを取得</th>
          </tr>
          <tr bgcolor="palegreen">
            <th align="left">get_output</th><th align="left">出力先データのアドレスを取得</th>
          </tr>
          <tr bgcolor="dbffa3">
            <th align="left">get_param</th><th align="left">パラメータを取得</th>
          </tr>
        </table>
      </div>

      <div class='slide'>
        <h2>TaskManager の構成</h2>
        <div align="center">
          <img src='images/createtask.png' width="700">
        </div>
        <ul>
          <li>TaskManagerと各Threadsの間には Syncronized な Mail Queueがある。
          <li>依存関係の解決された Task は TaskManager から Mail Queue に送られる。
          <li>Task に設定された CPUType に対応した Threads が Mail Queue から Task を取得し、並列実行していく。
        </ul>
      </div>

      <div class='slide'>
        <h2>マルチコア CPU 上での並列実行</h2>
        <div align="center">
          <img src="images/pipeline.png" width="600">
        </div>
        <p>
          Cerium は Cell 上で動作するフレームワークであったが MacOSX、Linux 上での並列実行に対応させた。
        </p>
        <p>
          マルチコア CPU 上での並列実行は、Synchronized Queue とパイプラインによって実現されている。
          TaskManager で依存関係を解決された Task は Scheduler に送信され、
          Scheduler が持っているパイプラインの機構に沿って並列に実行する。
        </p>
      </div>

      <div class='slide'>
        <h2>マルチコア CPU におけるパイプラインの実装</h2>
        <table>
          <tr>
            <th>
              <pre class="code" align="left">void
Scheduler::run(SchedTaskBase* task1) {
    SchedTaskBase* task2 = new SchedNop();
    SchedTaskBase* task3 = new SchedNop();

    // main loop
    do {

        task1->read();
        task2->exec();
        task3->write();

        delete task3;

        task3 = task2;
        task2 = task1;
        task1 = task1->next(this, 0);

    } while (task1);

    delete task3;
    delete task2;
}</pre>
            </th>
            <th  align="left">
              <p>
                Cerium の Task は SchedTask と呼ばれるデータ構造で表現されている。
                SchedTask は read/exec/write のメソッドを持っており、
                パイプラインの各ステージで段階的に実行される。
              </p>
              <p>
                引数として TaskList を受け取り、List 内の Task をパイプライン実行する。
                task3 が write を担当しており、write が終わった Task は終了となる。
              </p>
              <p>
                終了した task は delete して良い。
                task3=task2、task2=task1 と SchedTask をずらして行き、TaskList から 次の Task を読み込む。
              </p>
            </th>
          </tr>
        </table>
      </div>
      
      <div class='slide'>
        <h2>DMA の prefetch を用いた改良</h2>
        
      </div>

      <div class='slide'>
        <h2>マルチコア CPU におけるデータ並列</h2>
      </div>

      <div class='slide'>
        <h2>GPU 上での並列実行</h2>
      </div>
      
      <div class='slide'>
        <h2>GPGPU におけるパイプラインの実装</h2>
      </div>

      <div class='slide'>
        <h2>GPGPU におけるデータ並列</h2>
      </div>

      <div class='slide'>
        <h2>Cerium の I/O(mmap による読み込み)</h2>
      </div>

      <div class='slide'>
        <h2>BlockedRead による I/O の並列化</h2>
      </div>

      <div class='slide'>
        <h2>I/O 専用のThread</h2>
      </div>

      <div class='slide'>
        <h2>実験に利用する例題-Sort-</h2>
      </div>

      <div class='slide'>
        <h2>実験に利用する例題-WordCount-</h2>
      </div>
      
      <div class='slide'>
        <h2>実験に利用する例題-FFT-</h2>
      </div>

      <div class='slide'>
        <h2>実験環境</h2>
      </div>

      <div class='slide'>
        <h2>マルチコア CPU による並列実行のベンチマーク</h2>
      </div>

      <div class='slide'>
        <h2>DMA の prefecth に関するベンチマーク </h2>
      </div>

      <div class='slide'>
        <h2>GPGPU のベンチマーク</h2>
      </div>

      <div class='slide'>
        <h2>データ並列実行のベンチマーク</h2>
      </div>

      <div class='slide'>
        <h2>GPGPU のベンチマーク</h2>
      </div>
      
      <div class='slide'>
        <h2>FFT による GPGPU のベンチマーク</h2>
      </div>

      <div class='slide'>
        <h2>BlockedRead による並列 I/O のベンチマーク</h2>
      </div>

      <div class='slide'>
        <h2>まとめ</h2>
      </div>

      <div class='slide'>
        <h2>今後の課題</h2>
      </div>

    </div> <!-- presentation -->
  </bodypp>
</html>