# HG changeset patch # User Nobuyasu Oshiro # Date 1325015603 -32400 # Node ID 3cc4a8603489846fd33fe7e95f00dce8253b0d24 # Parent 7087484574b0b6b3a9c9eaa5767e2a08ed43dadf modify explanation of TCE diff -r 7087484574b0 -r 3cc4a8603489 presen/index.html --- a/presen/index.html Mon Dec 26 11:23:23 2011 +0900 +++ b/presen/index.html Wed Dec 28 04:53:23 2011 +0900 @@ -87,13 +87,13 @@

目的と背景(1)

  • 当研究室ではコードセグメント単位で記述するプログラミング言語Continuation based C (以下CbC)という言語を開発している。
  • コードセグメントは並列実行の単位として使うことができ、プログラムの正しさを示す単位としても使用することができる。
  • -
  • Many Core での並列実行を高い性能と高い信頼性で実現することができると考える。
  • +
  • Many Core での並列実行を高い性能と高い信頼性で実現することができると考えている。
  • 目的と背景(2)

    -
  • CbC のコンパイラは2001年に Micro-C 版、2008年には GCC 4.4 をベースとしたコンパイラが開発された。
  • -
  • GCC をベースとした CbC コンパイラは、修正・追加された最適化の機能を使用する為に、 GCC のアップデートに合わせ変更する必要がある。
  • +
  • CbC のコンパイラは2001年に Micro-C 版、2008年には GCC 4.2 をベースとしたコンパイラが開発された。
  • +
  • GCC をベースとした CbC コンパイラは、修正・追加されていく最適化の機能を使用する為に、 GCC のアップデートに合わせ変更する必要がある。
  • 本研究ではCbC コンパイラを GCC-4.6 へとアップデートを行った。
  • @@ -121,8 +121,11 @@

    Continuation based C

    コードセグメント単位での記述と継続を基本としたプログラミング言語。

    + +
    +

    コードセグメント

  • goto によるコードセグメントへの継続
  • 追加したgotoシンタックスの実際のソースは次のようになる。
  • @@ -247,25 +250,25 @@ { location_t loc = c_parser_peek_token (parser)->location; cbc_replace_arguments (loc, expr.value); - TREE_TYPE(expr.value) = void_type_node; - /*tree env = NULL_TREE;**/ CbC_IS_CbC_GOTO (expr.value) = 1; CALL_EXPR_TAILCALL (expr.value) = 1; add_stmt(expr.value); - stmt = c_finish_return(loc, NULL_TREE, NULL_TREE); /* stmt = c_finish_return (0); */ + stmt = c_finish_return(loc, NULL_TREE, NULL_TREE); } -
  • CALL_EXPR_TAILCALLマクロにより tail call フラグを立てている。
  • -
  • cbc_replace_arguments関数は引数のデータを一時的な変数へと代入させる関数
  • + +
  • CALL_EXPR_TAILCALLマクロでtail callフラグを立て。
  • +
  • cbc_replace_arguments関数は引数のデータを一時的な変数へ避難させる。
  • 最後にc_finish_return関数によりreturn文を生成している。
  • +

    CbCの実装:シンタックスの追加

    gotoシンタックスの追加

    -
  • 最後にリターン文を生成することにより、次へと制御を映させず。また末尾最適化がかかるようになる。
  • +
  • 最後にリターン文を生成することにより、次へと制御を移させず。また末尾最適化がかかるようになる。
  • @@ -292,17 +295,21 @@

    CbCの実装:引数渡し

    -
  • 当初、GCCを使ってコンパイルしたCbCのプログラムはMicro-C版に速度面で勝てなかった。
  • +
  • GCC版コンパイラー開発当初、コンパイルしたCbCのプログラムはMicro-C版に速度面で勝てなかった。
    • -
    • Micro-Cでは関数呼び出しの際にできるだけレジスタを使うようにしていたため。
    • +
    • Micro-Cでは関数呼び出しの際にできるだけレジスタを使うようにしていた。
    -
  • そこで、GCC版CbCコンパイラの引数渡しもできるだけレジスタで行うことに
  • +
  • そこで、GCC版CbCコンパイラの引数渡しもできるだけレジスタで行うことに。
  • CbCの実装:引数渡し(fastcall)

    -
  • i386 において関数呼び出しの際、引数渡しをできるだけレジスタを用いるGCCの拡張機能。
  • -
  • __code で宣言された関数は自動でfastcall属性が付与される。
  • +

    fastcall

    +
      +
    • i386 において関数呼び出しの際、引数渡しをできるだけレジスタを用いるGCCの拡張機能。
    • +
    • 関数に『__attribute__ ((fastcall))』をつけることで使えるようになる。
    • +
    +
  • __code で宣言された関数は自動でfastcall属性が付与されるように。
  •  if(!TARGET_64BIT) {
    @@ -315,20 +322,83 @@
           
    +

    CbCの実装:引数渡し

    +
    + + + + + + + + + + + + + + + + + + + +
    引数渡しに使われるレジスタの数(gcc)
    archint(整数型)float(浮動小数点型)double(浮動小数点型)
    i38620
    (stackを使用)
    0
    (stackを使用)
    x86_64688
    +
    + +

    CbCの実装:TCE

    Tail Call Elimination(TCE):末尾除去

  • 関数呼び出しをcallではなくjmp命令で行ことでreturnを1度で済ませる最適化。
  • -
  • CbCにおけるコードセグメントへの継続はこのTCEにより実装されている。
  • +
  • CbCにおけるコードセグメントへの継続はこのTCEを用いて実装されている。
  • +
    + +
    +

    CbCの実装:TCE

    +
  • TCEにより関数へjmp命令で処理を移すことを利用。
  • +
  • TCEにかかることで、コードセグメントへの継続はjmp命令で行われている。
  • +
    +

    具体的な実装内容

    +
      +
    • try_tail_call(変数名)フラグを立てる。
    • +
    • try_tail_callフラグを落とさせない。
    • +
    +
  • TCEにかかるにはtry_tail_callフラグ次第
  • CbCの実装:TCE

    -
  • +
  • try_tail_callフラグはexpand_call関数で落とされる。
  • +
      +
    • expand_call関数
    • +
        +
      • Treeで表された関数からRTLを生成する関数
      • +
      +
    +
  • 次の条件を満たしていないとtry_tail_callフラグを落とす。
  • +
      +
    • caller側とcallee側の戻値の型の一致している。
    • +
    • 関数呼び出しがリターン直前に行われている。
    • +
    • 呼出先関数の引数に用いられるスタックサイズが呼出元のそれより少ない。
    • +
    • 引数の並びのコピーに上書きがない。
    • +
    -

    環境付き継続

    +

    CbCの実装:TCE

    +
  • フラグを落とされない為にコードセグメントは次の条件で作成する。
  • +
      +
    • void型で統一。
    • +
    • gotoの直後にreturnを置く。
    • +
    • スタックサイズは固定。
    • +
    • 引数は一旦、一時変数にコピーする。
    • +
    +
  • これでコードセグメントへの処理はjmp命令で移ることになる。
  • +
    + +
    +

    CbCの実装:環境付き継続

  • CbCにおけるCとの互換性を保つための機能。
  • コードセグメントを呼び出したCの関数に戻ることができる。