Mercurial > hg > Papers > 2012 > nobu-thesis
diff presen/cbc.md @ 29:24ef9b912739 draft
modify
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 27 Feb 2012 14:11:40 +0900 |
parents | 1ff691fb558e |
children | 5ec4d6ecebd1 |
line wrap: on
line diff
--- 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 --------- <li>関数呼び出しを call ではなく jmp 命令で行う最適化</li> -<li>例えば, 如何の場合関数 f は jmp 命令で処理が移る</li> +<li>例えば, 如何の場合関数 g は jmp 命令で関数 f へと処理が移る</li> <table width=100%> <tr> @@ -220,7 +220,7 @@ - この専用関数は元々ある GCC コードを元に作成している為, アップデートに合わせて修正していく 必要があった。 - しかし, 今回の実装でその関数を無くし, Tail Call Elimination のフラグを強制的に立たせる実装に変更。 -- 専用関数がなくなったことでより今後より楽なアップデートを行なっていくことができるようになった。 +- 専用関数がなくなったことで今後より楽なアップデートを行なっていくことができるようになった。 --- @@ -230,7 +230,7 @@ 性能評価 ======== -<li>conv1:演算と継続を交互に繰り返すプログラム</li> +<li>conv1: 演算と継続を交互に繰り返すプログラム</li> <table width=100%> <caption>各コンパイラにより生成されたコードの速度比較</caption> @@ -242,21 +242,16 @@ </td> </table> -<li>引数 2,3 の結果はほぼ同じだが, 引数 1 の結果には差がでている.</li> - -引数 1 の時のプログラム ---------- -<li>引数が 1 の時は, 関数ポインタとして構造体に保存していたコードセグメントへと継続を行なっている</li> - +<li>引数 2、3 の結果はほぼ同じ</li> +<li>引数 1 の結果では 32bit, 64bit 共に GCC-4.6 の方が 1.5倍以上早</li> --- - 最適化の比較 ======== <table width=100% border=1> - <caption>それぞれの最適化にかかったプログラムの挙動</caption> + <caption>それぞれの最適化にかかった conv1プログラムの挙動(引数 1)</caption> <tr> <td>最適化</td> <td style="text-align:center;">状態遷移</td> @@ -282,89 +277,39 @@ --- -最適化の比較 + +GCC の最適化 ======== -<table width=100% border=1> - <caption>それぞれの最適化により吐かれたアセンブラコード</caption> - <tr> - <td width=50% style="text-align:center;">CbC-GCC-4.5</td> - <td width=50% style="text-align:center;">CbC-GCC-4.6</td> - </tr> - - <tr> - <td> - <pre> -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 - </pre> - </td> - <td> - <pre> -main: - movq $f_g1, main_stack+2000(%rip) - : - call g_h1 - : - movq 24(%rax), %rdx - : - jmp *%rdx - : - movq 24(%rax), %rdx - : - jmp *%rdx - </pre> - </td> - </tr> -<!-- - <tr> - <td></td> - <td></td> - </tr> ---> - -</table> -<li>関数を展開してその場で計算する『インライン展開』がより強力になっているのが確認できる</li> -<!-- -<li>保存していた関数ポインタへの継続はインライン展開は行われない</li> ---> - ---- +- 最適化無しに比べると GCC-4.5、 GGC-4.6 共にコードセグメントの数が減っている。</l> +- これは、最適化の 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 @@ --- +最適化の比較 +======== +<table width=100% border=1> + <caption>それぞれの最適化により吐かれたアセンブラコード</caption> + <tr> + <td width=50% style="text-align:center;">CbC-GCC-4.5</td> + <td width=50% style="text-align:center;">CbC-GCC-4.6</td> + </tr> + + <tr> + <td> + <pre> +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 + </pre> + </td> + <td> + <pre> +main: + movq $f_g1, main_stack+2000(%rip) + : + call g_h1 + : + movq 24(%rax), %rdx + : + jmp *%rdx + : + movq 24(%rax), %rdx + : + jmp *%rdx + </pre> + </td> + </tr> +<!-- + <tr> + <td></td> + <td></td> + </tr> +--> + +</table> +<li>関数を展開してその場で計算する『インライン展開』がより強力になっているのが確認できる</li> +<!-- +<li>保存していた関数ポインタへの継続はインライン展開は行われない</li> +--> + +---