# HG changeset patch # User Nobuyasu Oshiro # Date 1330319500 -32400 # Node ID 24ef9b9127392f7f275de2a6859342d22f825f2d # Parent 1ff691fb558e81e5de2d024126a6b4bfa44ab33f modify diff -r 1ff691fb558e -r 24ef9b912739 presen/cbc.md --- a/presen/cbc.md Mon Feb 27 04:04:02 2012 +0900 +++ b/presen/cbc.md Mon Feb 27 14:11:40 2012 +0900 @@ -156,7 +156,7 @@ Tail Call Elimination ---------
  • 関数呼び出しを call ではなく jmp 命令で行う最適化
  • -
  • 例えば, 如何の場合関数 f は jmp 命令で処理が移る
  • +
  • 例えば, 如何の場合関数 g は jmp 命令で関数 f へと処理が移る
  • @@ -220,7 +220,7 @@ - この専用関数は元々ある GCC コードを元に作成している為, アップデートに合わせて修正していく 必要があった。 - しかし, 今回の実装でその関数を無くし, Tail Call Elimination のフラグを強制的に立たせる実装に変更。 -- 専用関数がなくなったことでより今後より楽なアップデートを行なっていくことができるようになった。 +- 専用関数がなくなったことで今後より楽なアップデートを行なっていくことができるようになった。 --- @@ -230,7 +230,7 @@ 性能評価 ======== -
  • conv1:演算と継続を交互に繰り返すプログラム
  • +
  • conv1: 演算と継続を交互に繰り返すプログラム
  • @@ -242,21 +242,16 @@
    各コンパイラにより生成されたコードの速度比較
    -
  • 引数 2,3 の結果はほぼ同じだが, 引数 1 の結果には差がでている.
  • - -引数 1 の時のプログラム ---------- -
  • 引数が 1 の時は, 関数ポインタとして構造体に保存していたコードセグメントへと継続を行なっている
  • - +
  • 引数 2、3 の結果はほぼ同じ
  • +
  • 引数 1 の結果では 32bit, 64bit 共に GCC-4.6 の方が 1.5倍以上早
  • --- - 最適化の比較 ======== - + @@ -282,89 +277,39 @@ --- -最適化の比較 + +GCC の最適化 ======== -
    それぞれの最適化にかかったプログラムの挙動それぞれの最適化にかかった conv1プログラムの挙動(引数 1)
    最適化 状態遷移
    - - - - - - - - - - - - -
    それぞれの最適化により吐かれたアセンブラコード
    CbC-GCC-4.5CbC-GCC-4.6
    -
    -main:
    -	call    f
    -	:
    -	jmp     f_g0
    -	:
    -	movq    $f_g1, -24(%rdx)
    -	addl    $10, %edi
    -	movq    $g_h1, -48(%rdx)
    -	jmp     g_h1
    -	:
    -	movq    24(%rsi), %rdx
    -	movq    %rax, %rsi
    -	:
    -	jmp     *%rdx
    -	:
    -	movq    24(%rsi), %rdx
    -	:
    -	jmp     *%rdx
    -      
    -
    -
    -main:
    -	movq    $f_g1, main_stack+2000(%rip)
    -	:
    -	call    g_h1
    -	:
    -	movq    24(%rax), %rdx
    -	:
    -	jmp     *%rdx
    -	:
    -	movq    24(%rax), %rdx
    -	:
    -	jmp     *%rdx
    -      
    -
    -
  • 関数を展開してその場で計算する『インライン展開』がより強力になっているのが確認できる
  • - - ---- +- 最適化無しに比べると GCC-4.5、 GGC-4.6 共にコードセグメントの数が減っている。 +- これは、最適化の 1 つ『インライン展開』により各コードセグメントの計算がまとめて行われる為、 +継続する数を減らすことができるから。 +- GCC-4.5 でもインライン展開はされていたが、GCC-4.6 はより良い最適化がかけられている。 -GCC の最適化について -======== -- インライン展開の最適化がより良くなっていることができた. -- また, GCC では新たな最適化もアップデートが行われていく. - --- +GCC のアップデートに合わせる事の重要性 +======== +- 今回の『インライン展開』のように GCC の最適化は日々改良されていく。 +- また、既存の最適化の改良だけでなく新たな最適化の追加等も行われていく。 +- それらの恩恵を受ける為にも GCC のアップデートに合わせていく事は今後も重要である。 + + + +--- + + まとめ ======== -- 今回 CbC-GCC を GCC-4.6 へとアップデートを行った. -- アップデートに伴い最適化の強制付与や環境付き継続の部分の実装の修正を行った. -- アップデートにかけたことで, より良い最適化がかかることを確認できた. -- GCC ベースの CbC コンパイラは今後 GCC のアップデートに合わせていくだけとなる. +- 今回 CbC-GCC を GCC-4.6 へとアップデートを行った。 +- アップデートに伴い最適化の強制付与や環境付き継続の部分の実装の修正を行った。 +- アップデートにかけたことで, より良い最適化がかかることを確認できた。 +- GCC ベースの CbC コンパイラは今後 GCC のアップデートに合わせていくだけとなる。 今後の課題 @@ -434,6 +379,69 @@ --- +最適化の比較 +======== + + + + + + + + + + + + + +
    それぞれの最適化により吐かれたアセンブラコード
    CbC-GCC-4.5CbC-GCC-4.6
    +
    +main:
    +	call    f
    +	:
    +	jmp     f_g0
    +	:
    +	movq    $f_g1, -24(%rdx)
    +	addl    $10, %edi
    +	movq    $g_h1, -48(%rdx)
    +	jmp     g_h1
    +	:
    +	movq    24(%rsi), %rdx
    +	movq    %rax, %rsi
    +	:
    +	jmp     *%rdx
    +	:
    +	movq    24(%rsi), %rdx
    +	:
    +	jmp     *%rdx
    +      
    +
    +
    +main:
    +	movq    $f_g1, main_stack+2000(%rip)
    +	:
    +	call    g_h1
    +	:
    +	movq    24(%rax), %rdx
    +	:
    +	jmp     *%rdx
    +	:
    +	movq    24(%rax), %rdx
    +	:
    +	jmp     *%rdx
    +      
    +
    +
  • 関数を展開してその場で計算する『インライン展開』がより強力になっているのが確認できる
  • + + +--- diff -r 1ff691fb558e -r 24ef9b912739 presen/presentation.html --- a/presen/presentation.html Mon Feb 27 04:04:02 2012 +0900 +++ b/presen/presentation.html Mon Feb 27 14:11:40 2012 +0900 @@ -392,7 +392,7 @@

  • CbC-GCC の軽量継続は最適化の1つ, Tail Call Celimination(末尾除去)により実装されている.
  • Tail Call Elimination

  • 関数呼び出しを call ではなく jmp 命令で行う最適化
  • -
  • 例えば, 如何の場合関数 f は jmp 命令で処理が移る
  • +
  • 例えば, 如何の場合関数 g は jmp 命令で関数 f へと処理が移る
  • @@ -497,7 +497,7 @@
  • この専用関数は元々ある GCC コードを元に作成している為, アップデートに合わせて修正していく 必要があった。
  • しかし, 今回の実装でその関数を無くし, Tail Call Elimination のフラグを強制的に立たせる実装に変更。
  • -
  • 専用関数がなくなったことでより今後より楽なアップデートを行なっていくことができるようになった。
  • +
  • 専用関数がなくなったことで今後より楽なアップデートを行なっていくことができるようになった。
  • @@ -528,7 +528,7 @@

    性能評価

    -
  • conv1:演算と継続を交互に繰り返すプログラム
  • +
  • conv1: 演算と継続を交互に繰り返すプログラム
  • @@ -540,10 +540,9 @@
    各コンパイラにより生成されたコードの速度比較
    -
  • 引数 2,3 の結果はほぼ同じだが, 引数 1 の結果には差がでている.
  • +
  • 引数 2、3 の結果はほぼ同じ
  • -

    引数 1 の時のプログラム

    -

  • 引数が 1 の時は, 関数ポインタとして構造体に保存していたコードセグメントへと継続を行なっている
  • +
  • 引数 1 の結果では 32bit, 64bit 共に GCC-4.6 の方が 1.5倍以上早
  • @@ -574,7 +573,7 @@

    - + @@ -623,6 +622,219 @@
    +

    GCC の最適化

    + + +
      +
    • conv1 プログラムでは、GCC-4.6 のインライン展開が GCC-4.5 に比べより良くなっていることが分かった。
    • +
    +

    インライン展開

    +
      +
    • +
    • +

      また, GCC では新たな最適化もアップデートが行われていく。 +その為、GCC のアップデートに合わせる

      +
    • +
    +

    引数 1 の時のプログラム

    +

  • 引数が 1 の時は, 関数ポインタとして構造体に保存していたコードセグメントへと継続を行なっている
  • + +
    +
    +

    Presenter Notes

    +
    + +
    +
    +
    + + + + +
    +
    + + + +
    +
    +
    + +

    まとめ

    + + +
      +
    • 今回 CbC-GCC を GCC-4.6 へとアップデートを行った.
    • +
    • アップデートに伴い最適化の強制付与や環境付き継続の部分の実装の修正を行った.
    • +
    • アップデートにかけたことで, より良い最適化がかかることを確認できた.
    • +
    • GCC ベースの CbC コンパイラは今後 GCC のアップデートに合わせていくだけとなる.
    • +
    +

    今後の課題

    +
      +
    • LLVM ベースの CbC コンパイラの開発
    • +
    • google Go 言語への実装の検討
    • +
    + +
    +
    +

    Presenter Notes

    +
    + +
    +
    +
    + + + + +
    +
    +
    + + +
    +
    +
    + +

    CbC の実装: 環境付き継続

    + + +
      +
    • 環境付き継続: C との互換を取るための機能。継続を行った C の関数に戻ることができる。
    • +
    • _CbC_return、 _CbC_environment キーワードを使うことで使える。
    • +
    • +

      以下の使い方の場合、戻値 1 を返す。 +

      +code c1(code ret(int,void ),void env) {
      +    goto ret(1,env);
      +}
      +int main() {
      +    goto c1(return, environment);
      +}
      +

      +
    • +
    • +

      今回この環境付き継続をスレッドセーフの実装へと修正した。

      +
    • +
    + +
    +
    +

    Presenter Notes

    +
    + +
    +
    +
    + + + + +
    +
    +
    + + +
    +
    +
    + +

    CbC 引数渡し

    + + +

  • CbC では引数渡しにできるだけレジスタを用いるようにしている.
  • +
    それぞれの最適化にかかったプログラムの挙動それぞれの最適化にかかった conv1プログラムの挙動(引数 1)
    最適化 状態遷移
    + + + + + + + + + + + + +
    fastcall属性有・無の実行速度
    fastcall無し
    + +
    fastcall有り
    + +

    + +
    +
    +

    Presenter Notes

    +
    + +
    +
    +
    + + + + +
    + + + + +
    +
    +
    + +

    GCC でのコンパイルの仕組み

    + + +
    + +
    + +
    + +
  • CbC の実装では Parser と RTL の生成部分に手が加えられている。
  • + +
    +
    +

    Presenter Notes

    +
    + +
    +
    +
    + + + + +
    +
    +
    + + +
    +
    +
    +

    最適化の比較

    @@ -674,7 +886,7 @@
  • 関数を展開してその場で計算する『インライン展開』がより強力になっているのが確認できる
  • @@ -696,210 +908,6 @@ - - - - - -
    -
    -
    - -

    GCC の最適化について

    - - -
      -
    • インライン展開の最適化がより良くなっていることができた.
    • -
    • また, GCC では新たな最適化もアップデートが行われていく.
    • -
    - -
    -
    -

    Presenter Notes

    -
    - -
    -
    -
    - - - - -
    -
    -
    - - -
    -
    -
    - -

    まとめ

    - - -
      -
    • 今回 CbC-GCC を GCC-4.6 へとアップデートを行った.
    • -
    • アップデートに伴い最適化の強制付与や環境付き継続の部分の実装の修正を行った.
    • -
    • アップデートにかけたことで, より良い最適化がかかることを確認できた.
    • -
    • GCC ベースの CbC コンパイラは今後 GCC のアップデートに合わせていくだけとなる.
    • -
    -

    今後の課題

    -
      -
    • LLVM ベースの CbC コンパイラの開発
    • -
    • google Go 言語への実装の検討
    • -
    - -
    -
    -

    Presenter Notes

    -
    - -
    -
    -
    - - - - -
    -
    -
    - - -
    -
    -
    - -

    CbC の実装: 環境付き継続

    - - -
      -
    • 環境付き継続: C との互換を取るための機能。継続を行った C の関数に戻ることができる。
    • -
    • _CbC_return、 _CbC_environment キーワードを使うことで使える。
    • -
    • -

      以下の使い方の場合、戻値 1 を返す。 -

      -code c1(code ret(int,void ),void env) {
      -    goto ret(1,env);
      -}
      -int main() {
      -    goto c1(return, environment);
      -}
      -

      -
    • -
    • -

      今回この環境付き継続をスレッドセーフの実装へと修正した。

      -
    • -
    - -
    -
    -

    Presenter Notes

    -
    - -
    -
    -
    - - - - -
    -
    -
    - - -
    -
    -
    - -

    CbC 引数渡し

    - - -

  • CbC では引数渡しにできるだけレジスタを用いるようにしている.
  • - - - - - - - - - - - - - -
    fastcall属性有・無の実行速度
    fastcall無し
    - -
    fastcall有り
    - -

    - -
    -
    -

    Presenter Notes

    -
    - -
    -
    -
    - - - - -
    -
    -
    - - -
    -
    -
    - -

    GCC でのコンパイルの仕組み

    - - -
    - -
    - -
    - -
  • CbC の実装では Parser と RTL の生成部分に手が加えられている。
  • - -
    -
    -

    Presenter Notes

    -
    - -
    -
    - @@ -1015,37 +1023,37 @@ - 最適化の比較 + GCC の最適化 14 - GCC の最適化について + まとめ 15 - まとめ + CbC の実装: 環境付き継続 16 - CbC の実装: 環境付き継続 + CbC 引数渡し 17 - CbC 引数渡し + GCC でのコンパイルの仕組み 18 - GCC でのコンパイルの仕組み + 最適化の比較 19