Mercurial > hg > Papers > 2015 > yuhi-master
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<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>