Mercurial > hg > Papers > 2011 > nobu-prosym
changeset 64:743afe406e56
modify
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 29 Dec 2011 00:38:32 +0900 |
parents | 3cc4a8603489 |
children | baace77d7d30 |
files | presen/index.html |
diffstat | 1 files changed, 229 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/presen/index.html Wed Dec 28 04:53:23 2011 +0900 +++ b/presen/index.html Thu Dec 29 00:38:32 2011 +0900 @@ -5,6 +5,11 @@ <head> <style> +.src{ +overflow: scroll; +width: 90%; +height: 60%; +} .center { margin-left: auto; margin-right: auto; @@ -113,7 +118,9 @@ </ul> --> <li>Micro-C との性能比較</li> +<!-- <li>mercurial を用いたアップデートの方法</li> +--> <li>まとめ</li> <ol> </div> @@ -397,59 +404,213 @@ <li class="incremental">これでコードセグメントへの処理はjmp命令で移ることになる。</li> </div> <!-- PAGE --> +<!-- <div class="slide"> <h1>CbCの実装:環境付き継続</h1> <li>CbCにおけるCとの互換性を保つための機能。</li> <li>コードセグメントを呼び出したCの関数に戻ることができる。</li> - <li></li> + <li>論文における訂正</li> + <li>『GCC 4.6 と Lion の組合せでは Closure は正しく動作していないことが分かった.』</li> + <ul> + <li>GCC 4.6 への CbC の実装のせいでクロージャがうまくできていなかったことが判明。</li> + <li>GCC 4.6 と Lion でのクロージャは特に問題はない。</li> + </ul> + </div> +--> + <!-- PAGE --> +<!-- + <div class="slide"> + <h1>環境付き継続:論文におけるクロージャの問題の訂正</h1> + <p><small>『GCC 4.6とLionの組み合わせではclosureは正しく動作してないことが分かった。』<br> + とあるが、これはCbCの実装でTCEを強制的に立てることが原因であったことを訂正させて頂きます。</small></p> + </div> +--> + <!-- PAGE --> + <div class="slide"> + <h1>CbCの実装:環境付き継続</h1> + <li>CbCにおけるCとの互換性を保つための機能。コードセグメントを呼び出したCの関数に戻ることができる。</li> + <li>__returnキーワードを引数に渡すことで使うことができる。</li> + <li>以下の使い方の場合は1を返す。</li> + <small> + <pre> +__code c1(__code ret(int,void *),void *env) { + goto ret(1,env); +} +int main() { + goto c1(__return, __environment); +} + </pre> + </small> + <p><small>__environmentキーワードは関数の環境を保存している。</small></p> </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> + <h1>CbCの実装:環境付き継続</h1> + <h2>実際には以下のコードを生成している。</h2> + <small> + <pre> +goto c1(__return, __environment); + +goto c1( + ({ + __label__ _cbc_exit0; + static int retval; + void _cbc_internal_return(int retval_, void *_envp){ + retval = retval_; + goto _cbc_exit0; } + if (0) { _cbc_exit0: + return retval; } + _cbc_internal_return; + }), + __environment); + </pre> + <p>retval変数はint型になっているが、実際には継続を行った関数と同じ戻値の型となる。</p> + </small> + <li class="incremental">上記のコードをGCC内で生成するのが次のソースとなる。</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> + <h1>CbCの実装:環境付き継続</l> + <h2>環境付き継続の生成部分:</h2> + <div class="src"> + <small> + <pre> +{ + tree value, stmt, label, tlab, decl; + c_parser_consume_token (parser); + + stmt = c_begin_stmt_expr (); + cbc_return_f = c_parser_peek_token (parser)->value; + location_t location = c_parser_peek_token (parser)->location; + + /* create label. (__label__ _cbc_exit0;) */ + label = get_identifier ("_cbc_exit0"); + tlab = declare_label (label); + C_DECLARED_LABEL_FLAG (tlab) = 1; + add_stmt (build_stmt (location, DECL_EXPR, tlab)); + + /* declare retval. (int retval;) */ + tree decl_cond = + build_decl (location, VAR_DECL, get_identifier ("retval"), + TREE_TYPE (TREE_TYPE (current_function_decl))); + TREE_STATIC (decl_cond) = 1; + TREE_USED (decl_cond) = 1; + + /* Use thread-local */ + DECL_TLS_MODEL (decl_cond) = decl_default_tls_model (decl_cond); + DECL_NONLOCAL (decl_cond) = 1; + add_stmt (build_stmt(location, DECL_EXPR, pushdecl (decl_cond))); + + /* define nested function. */ + decl = + cbc_finish_nested_function (location, label, decl_cond); + TREE_USED(decl) = 1; + + /* define if-ed goto label and return statement. */ + cbc_finish_labeled_goto (location, label, decl_cond); + + /* get pointer to nested function. */ + value = build_addr (decl , current_function_decl); + TREE_USED (current_function_decl) = 1; + SET_EXPR_LOCATION (value, location); + add_stmt (value); + + TREE_SIDE_EFFECTS (stmt) = 1; + expr.value = c_finish_stmt_expr (location, stmt); + expr.original_code = ERROR_MARK; +} + </pre> </small> - <li></li> + </div> </div> <!-- PAGE --> <div class="slide"> - <h1>環境付き継続: setjmp での実装の問題</h1> - <li>GCC 内で setjmp を生成する関数を作る必要がある。</li> - <li>戻値の型が int </li> + <h1>CbCの実装:環境付き継続</h1> + <h2>作成されるTree</h2> + <img src="./pix/STATEMENT_LIST_1.png" style="height: 10em;"> +<!-- + <small> + <pre> + ({ + __label__ _cbc_exit0; + static int retval; + void _cbc_internal_return(int retval_, void *_envp){ + retval = retval_; + goto _cbc_exit0; } + if (0) { _cbc_exit0: + return retval; } + _cbc_internal_return; + }), + </pre> + </small> +--> + </div> + <!-- PAGE --> + <div class="slide"> + <h1>環境付き継続:実装の問題</h1> + <ul> + <li>リターンするretval変数が重要になってくる。</li> + <li>retval変数のデータをどうやって確保するか。</li> + </ul> + <li>次の方法が考えられる。</li> + <ul> + <li>クロージャでの確保</li> + <li>staticでの確保</li> + <li>static thread local storage(tls)を用いての確保</li> + </ul> + </div> + <!-- PAGE --> + <div class="slide"> + <h1>環境付き継続:実装の問題</h1> + <li>クロージャでの実装</li> <ul> - <li>構造体等ポインタの場合使えない。</li> + <li>クロージャにしてスタックに値を確保する。</li> + <li></li> + </ul> + <li>問題点</li> + <ul> + <li class="incremental">しかしCbCではスタックの値は破棄されていく。</li> + <li class="incremental">その為スタックに値を確保するのは好ましくない。</li> + </ul> + </div> + <!-- PAGE --> + <div class="slide"> + <h1>環境付き継続:実装の問題</h1> + <li>staticでの実装</li> + <ul> + <li>静的に値を確保することでスタック破棄の影響を受けない。</li> + </ul> + <li>問題点</li> + <ul> + <li class="incremental">マルチスレッドのプログラムに対応できない。</li> + <li class="incremental">値を返し切る前に別スレッドによって値が書き換えられる可能性がある。</li> </ul> - <li class="incremental">setjmp での実装はあまり実用的ではない。</li> + </div> + <!-- PAGE --> + <div class="slide"> + <h1>環境付き継続:実装の問題</h1> + <li>static tlsでの実装</li> + <ul> + <li>スレッド毎に静的に値を確保する。</li> + </ul> + <li>現在はこの方法で実装を行なっている。</li> + <li>しかし、最適化にかけると正しい値が返ってこない。 + <br>(恐らくTreeの生成の部分が間違っている。)</li> + </div> + <!-- PAGE --> + <div class="slide"> + <h1>環境付き継続:その他の実装方法</h1> + <ul> + <li>setjmpでの実装</li> + <ul> + <li>setjmpを行うTreeを生成するのが少し手間になる。</li> + <li>int型の戻値しか得られない。</li> + </ul> + <li>戻値を入れるレジスタを明示的に指定する。</li> + <ul> + <li>まだ実装を試していない。</li> + </ul> + </ul> </div> <!-- PAGE --> <div class="slide"> @@ -486,10 +647,41 @@ </div> <!-- PAGE --> <div class="slide"> + <h1>CbCの機能の拡張</h1> + <h2>selftypeの実装</h2> + <li>以下の宣言が行えるようにしたい。</li> + <small> + <pre> +typedef sturct node { + selftype *left; + selftype *right; + int num; +}*NODE + </pre> + <p>selftype は struct node を指す。</p> + </small> + <ul> + <li>上記の構文は実装を行う予定である。</li> + </ul> + </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>今回GCC版CbCコンパイラのアップデートを行った。</li> + <li>アップデートに伴いTCEの条件クリアや環境付き継続といった部分の修正と機能の拡張も行った。</li> + <li></li> + </div> + <!-- PAGE --> </div> </body> </html>