Mercurial > hg > Papers > 2011 > nobu-prosym
view presen/index.html @ 56:46cc88d1051c
add presen/advice.txt
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 24 Dec 2011 20:58:48 +0900 |
parents | 06ce8fb8e278 |
children | ce844f6c504d |
line wrap: on
line source
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <style> .center { margin-left: auto; margin-right: auto; text-align: center; } .textcenter { text-align: center; } .taninaritop { margin: auto; width: 95%; font-weight: bold; } </style> <title>2012/ 1/ 7</title> <!-- metadata --> <meta name="generator" content="S5" /> <meta name="version" content="S5 1.1" /> <meta name="presdate" content="20120107" /> <meta name="author" content="Nobuyasu Oshiro" /> <meta name="company" content="University of the Ryukyu" /> <!-- meta temporary --> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <!-- configuration parameters --> <meta name="defaultView" content="slideshow" /> <meta name="controlVis" content="hidden" /> <!-- configuration extensions --> <meta name="tranSitions" content="true" /> <meta name="fadeDuration" content="500" /> <meta name="incrDuration" content="250" /> <!-- configuration autoplay extension --> <meta name="autoMatic" content="false" /> <meta name="playLoop" content="true" /> <meta name="playDelay" content="10" /> <!-- configuration audio extension --> <meta name="audioSupport" content="false" /> <meta name="audioVolume" content="100" /> <meta name="audioError" content="false" /> <!-- configuration audio debug --> <meta name="audioDebug" content="false" /> <!-- style sheet links --> <link rel="stylesheet" href="ui/default_utf/slides.css" type="text/css" media="projection" id="slideProj" /> <link rel="stylesheet" href="ui/default_utf/outline.css" type="text/css" media="screen" id="outlineStyle" /> <link rel="stylesheet" href="ui/default_utf/print.css" type="text/css" media="print" id="slidePrint" /> <link rel="stylesheet" href="ui/default_utf/opera.css" type="text/css" media="projection" id="operaFix" /> <!-- embedded styles --> <style type="text/css" media="all"> .imgcon {width: 100%; margin: 0 auto; padding: 0; text-align: center;} #anim {width: 33%; height: 320px; position: relative;} #anim img {position: absolute; top: 0px; left: 0px;} </style> <!-- S5 JS --> <script src="ui/default_utf/slides.js" type="text/javascript"></script> </head> <body> <div class="layout"> <div id="controls"><!-- DO NOT EDIT --></div> <div id="currentSlide"><!-- DO NOT EDIT --></div> <div id="header"></div> <div id="footer"> <h1>プログラミングシンポジウム: 2012/ 1/ 7</h1> <h2>並列信頼研</h2> </div> </div> <div class="presentation"> <div class="slide"> <h1>Continuation based Cの GCC 4.6 上の実装について</li> <h3></h3> <li>大城 信康</li> <h4><a href="http://ie.u-ryukyu.ac.jp/" rel="external">琉球大学 並列信頼研究室</a></h4> <div class="handout"></div> </div> <!-- PAGE --> <div class="slide"> <h1>目的と背景(1)</h1> <li>当研究室ではコードセグメント単位で記述するプログラミング言語Continuation based C (以下CbC)という言語を開発している。</li> <li>コードセグメントは並列実行の単位として使うことができ、プログラムの正しさを示す単位としても使用することができる。</li> <li class="incremental">コードセグメントにより Many Core での並列実行を高い性能と高い信頼性で実現することができると考える。</li> </div> <!-- PAGE --> <div class="slide"> <h1>目的と背景(2)</h1> <li>CbC のコンパイラは2008年に GCC 4.4 をベースとしたコンパイラが開発された。</li> <li>GCC をベースとした CbC コンパイラは、修正・追加された最適化の機能を使用する為に、 GCC のアップデートに合わせ変更する必要がある。</li> <li class="incremental">本研究ではCbC コンパイラを GCC-4.6 へとアップデートを行い、Intel64 への対応するとともに CbC の拡張を行う。 </li> </div> <!-- PAGE --> <div class="slide"> <h1>発表内容</h1> <ol> <li>CbC の紹介</li> <li>GCC でのコンパイルの流れ</li> <li>CbC の実装</li> <!-- <ul> <li>Tail Call Elimination</li> <li>goto シンタックスの追加</li> <li>環境付き継続</li> </ul> --> <li>Micro-C との性能比較</li> <li>mercurial を用いたアップデートの方法</li> <li>まとめ</li> <ol> </div> <!-- PAGE --> <div class="slide"> <h1>Continuation based C </h1> <h2>コードセグメント単位での記述と継続を基本としたプログラミング言語。</h2> <li>プログラムの記述は C の構文と同じだが、ループ制御や関数コールが取り除かれる。</li> <li>コードセグメント</li> <ul> <li>C の関数よりも細かい単位。</li> <li>コードセグメントの処理は最後に別のコードセグメントへ継続(goto)することで続いていく。</li> </ul> </div> <!-- PAGE --> <div class="slide"> <h1>Continuation based C </h1> <small> <table width=100% > <tr> <caption>階乗を求めるCbCのプログラム</caption> <td width=50%> <pre> __code print_factorial(int prod) { printf("factorial = %d\n",prod); exit(0); } __code factorial0(int prod, int x) { if ( x >= 1) { goto factorial0(prod*x, x-1); }else{ goto print_factorial(prod); } } </pre> </td> <td> <pre> __code factorial(int x) { goto factorial0(1, x); } int main(int argc, char **argv) { int i; i = atoi(argv[1]); goto factorial(i); return 0; } </pre> </td> </tr> </table> </small> </div> <!-- PAGE --> <div class="slide"> <h1>Continuation Based C (軽量継続)</h1> <li>関数コールが無い -> 呼び出し元への復帰がない</li> <li>継続の際にスタックに載せるデータはコードセグメントへの引数だけとなる(軽量継続)。</li> <!-- <li>スタックポインタの位置を変えずにすむ。</li> --> <p style=" margin-right:auto; margin-left:auto;"> <img class="scale" src="./pix/cs_stack.png" style="height: 7em;"> </p> <li class="incremental">より高度に最適化されたプログラミングが可能になる。</li> </div> <!-- PAGE --> <div class="slide"> <h1>Continuation Based C</h1> <li></li> </div> <!-- PAGE --> <div class="slide"> <h1>GCC によるコンパイル</h1> <li>GCC についての簡単な説明を行う...</li> <img src="./pix/ir.png" style="height: 6em;"> <li>CbCの実装は主に Parser の部分と RTL を生成する部分に行われる。</li> </div> <!-- PAGE --> <div class="slide"> <h1>CbC の実装</h1> <ul> <li>シンタックスの追加</li> <li>fastcall属性の付与</li> <li>Tail Call Elimination</li> <li>環境付き継続</li> </ul> </div> <!-- PAGE --> <div class="slide"> <h1>シンタックスの追加</h1> <ul> <li>__code でコードセグメントの宣言</li> <li>goto にコードセグメントへの継続処理を追加</li> </ul> <li></li> </div> <!-- PAGE --> <div class="slide"> <h1>シンタックスの追加</h1> <h2>__code でコードセグメントの宣言</h2> <ul> <li>__code 用idとkeywordを作成。</li> <li>戻り値が無い為、コードセグメントは void 型の関数で作成される木と同じ木が作られる。</li> </ul> </div> <!-- PAGE --> <div class="slide"> <h1>シンタックスの追加</h1> <h2>goto シンタックスの追加</h2> <ul> <li>通常の goto に加え、コードセグメントを呼び出す処理を追加。</li> <li>コードセグメントへのgoto後は、 return の処理を自動で追加。</li> </ul> <table border=1 width=100%> <tr class="center"> <small> <td>実際のコード </td> <td>GCC 内で処理されるコード</td> </small> </tr> <tr style="margin-top: auto;"> <td> <pre> goto factorial0(1, x); </pre> </td> <td> <pre> goto factorial0(1, x); return; </pre> </td> </tr> </table> </div> <!-- PAGE --> <div class="slide"> <h1>fastcall属性の付与</h1> <li>i386 において関数呼び出しの際、引数渡しをできるだけレジスタを用いるGCCの拡張機能。</li> <li>コードセグメントは処理が細かい為、継続の回数が多くなる。引数をレジスタ渡しにすることで速度向上を狙う。</li> <pre> if(!TARGET_64BIT) { attrs = build_tree_list (get_identifier("fastcall"), NULL_TREE); declspecs_add_attrs(specs, attrs); } </pre> <li>Intel64 に対してはfastcallは標準でつくようになっている。</li> </div> <!-- PAGE --> <div class="slide"> <h1></h1> <li></li> </div> <!-- PAGE --> <div class="slide"> <h1></h1> <li></li> </div> <!-- PAGE --> <div class="slide"> <h1>環境付き継続とは</h1> <li>コードセグメントを呼び出した C の関数に戻る機能</li> <li></li> </div> <!-- PAGE --> <div class="slide"> <h1>環境付き継続:クロージャでの実装について</h1> <li>『GCC 4.6 と Lion の組合せでは Closure は正しく動作していないことが分かった.』<br>間違い</li> <li>訂正</li> <ul> <li class="incremental">GCC 4.6 への CbC の実装のせいでクロージャがうまくできていなかったことが判明。</li> <li class="incremental">GCC 4.6 と Lion でのクロージャは特に問題はない。</li> </ul> </div> <!-- PAGE --> <div class="slide"> <h1>環境付き継続:クロージャでの実装の問題点</h1> <li></li> <li></li> </div> <!-- PAGE --> <div class="slide"> <h1>環境付き継続: setjmp での実装</h1> <li>setjmp での実装</li> <small> <pre> ({ int a = setjmp(env); int retval; void _cbc_internal_return(int retval_, jmp_buf _envp){ retval = retval_; longjmp(_envp, retval); } if (a) { return retval; } _cbc_internal_return; }) </pre> </small> <li></li> </div> <!-- PAGE --> <div class="slide"> <h1>環境付き継続: setjmp での実装の問題</h1> <li>GCC 内で setjmp を生成する関数を作る必要がある。</li> <li>戻値の型が int </li> <ul> <li>構造体等ポインタの場合使えない。</li> </ul> <li class="incremental">setjmp での実装はあまり実用的ではない。</li> </div> <!-- PAGE --> <div class="slide"> <h1></h1> <li></li> </div> <!-- PAGE --> <div class="slide"> <h1></h1> <li></li> </div> <!-- PAGE --> <div class="slide"> <h1></h1> <li></li> </div> <!-- PAGE --> <div class="slide"> <h1></h1> <li></li> </div> <!-- PAGE --> </div> </body> </html>