Mercurial > hg > Papers > 2012 > nobu-thesis
changeset 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 |
files | presen/cbc.md presen/presentation.html |
diffstat | 2 files changed, 316 insertions(+), 300 deletions(-) [+] |
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> +--> + +---
--- 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 @@ <section><p><li>CbC-GCC の軽量継続は最適化の1つ, <font color=red>Tail Call Celimination(末尾除去)</font>により実装されている.</li></p> <h2>Tail Call Elimination</h2> <p><li>関数呼び出しを call ではなく jmp 命令で行う最適化</li> -<li>例えば, 如何の場合関数 f は jmp 命令で処理が移る</li></p> +<li>例えば, 如何の場合関数 g は jmp 命令で関数 f へと処理が移る</li></p> <table width=100%> <tr> <td width=50%> @@ -497,7 +497,7 @@ <li>この専用関数は元々ある GCC コードを元に作成している為, アップデートに合わせて修正していく 必要があった。</li> <li>しかし, 今回の実装でその関数を無くし, Tail Call Elimination のフラグを強制的に立たせる実装に変更。</li> -<li>専用関数がなくなったことでより今後より楽なアップデートを行なっていくことができるようになった。</li> +<li>専用関数がなくなったことで今後より楽なアップデートを行なっていくことができるようになった。</li> </ul></section> </div> @@ -528,7 +528,7 @@ <header><h1>性能評価</h1></header> - <section><li>conv1:演算と継続を交互に繰り返すプログラム</li> + <section><li>conv1: 演算と継続を交互に繰り返すプログラム</li> <table width=100%> <caption>各コンパイラにより生成されたコードの速度比較</caption> @@ -540,10 +540,9 @@ </td> </table> -<li>引数 2,3 の結果はほぼ同じだが, 引数 1 の結果には差がでている.</li> +<li>引数 2、3 の結果はほぼ同じ</li> -<h2>引数 1 の時のプログラム</h2> -<p><li>引数が 1 の時は, 関数ポインタとして構造体に保存していたコードセグメントへと継続を行なっている</li></p></section> +<li>引数 1 の結果では 32bit, 64bit 共に GCC-4.6 の方が 1.5倍以上早</li></section> </div> <div class="presenter_notes"> @@ -574,7 +573,7 @@ <section><p><table width=100% border=1> - <caption>それぞれの最適化にかかったプログラムの挙動</caption> + <caption>それぞれの最適化にかかった conv1プログラムの挙動(引数 1)</caption> <tr> <td>最適化</td> <td style="text-align:center;">状態遷移</td> @@ -623,6 +622,219 @@ <div class="slide"> <div class="inner"> + <header><h1>GCC の最適化</h1></header> + + + <section><ul> +<li>conv1 プログラムでは、GCC-4.6 のインライン展開が GCC-4.5 に比べより良くなっていることが分かった。</li> +</ul> +<h2>インライン展開</h2> +<ul> +<li></li> +<li> +<p>また, GCC では新たな最適化もアップデートが行われていく。 +その為、GCC のアップデートに合わせる</p> +</li> +</ul> +<h2>引数 1 の時のプログラム</h2> +<p><li>引数が 1 の時は, 関数ポインタとして構造体に保存していたコードセグメントへと継続を行なっている</li></p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + <aside class="source"> + Source: <a href="./cbc.md">./cbc.md</a> + </aside> + + <aside class="page_number"> + 14/19 + </aside> + </footer> + </div> + </div> + + <!-- slide source: ./cbc.md --> + <div class="slide-wrapper"> + <div class="slide"> + <div class="inner"> + + <header><h1>まとめ</h1></header> + + + <section><ul> +<li>今回 CbC-GCC を GCC-4.6 へとアップデートを行った.</li> +<li>アップデートに伴い最適化の強制付与や環境付き継続の部分の実装の修正を行った.</li> +<li>アップデートにかけたことで, より良い最適化がかかることを確認できた.</li> +<li>GCC ベースの CbC コンパイラは今後 GCC のアップデートに合わせていくだけとなる.</li> +</ul> +<h2>今後の課題</h2> +<ul> +<li>LLVM ベースの CbC コンパイラの開発</li> +<li>google Go 言語への実装の検討</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + <aside class="source"> + Source: <a href="./cbc.md">./cbc.md</a> + </aside> + + <aside class="page_number"> + 15/19 + </aside> + </footer> + </div> + </div> + + <!-- slide source: ./cbc.md --> + <div class="slide-wrapper"> + <div class="slide"> + <div class="inner"> + + <header><h1>CbC の実装: 環境付き継続</h1></header> + + + <section><ul> +<li>環境付き継続: C との互換を取るための機能。継続を行った C の関数に戻ることができる。 </li> +<li>_CbC_return、 _CbC_environment キーワードを使うことで使える。</li> +<li> +<p>以下の使い方の場合、戻値 1 を返す。 +<pre> +<strong>code c1(</strong>code ret(int,void <em>),void </em>env) { + goto ret(1,env); +} +int main() { + goto c1(<strong>return, </strong>environment); +} +</pre></p> +</li> +<li> +<p>今回この環境付き継続をスレッドセーフの実装へと修正した。</p> +</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + <aside class="source"> + Source: <a href="./cbc.md">./cbc.md</a> + </aside> + + <aside class="page_number"> + 16/19 + </aside> + </footer> + </div> + </div> + + <!-- slide source: ./cbc.md --> + <div class="slide-wrapper"> + <div class="slide"> + <div class="inner"> + + <header><h1>CbC 引数渡し</h1></header> + + + <section><p><li>CbC では引数渡しにできるだけレジスタを用いるようにしている.</li> +<table border=1 width=100%> + <caption><small>fastcall属性有・無の実行速度</small></caption> + <tr> + <td width=50% style="text-align:center;">fastcall無し</td> + </tr> + <tr> + <td style="margin:auto; text-align:center;"> + <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/linux_conv_nofastcall.png" style="height:15em;"> + </td> + </tr> + <tr> + <td width=50% style="text-align:center;">fastcall有り</td> + <tr> + <td> + <img src="./pix/linux_conv_fastcall.png" style="height:15em;"> + </td> + </tr> +</table></p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + <aside class="source"> + Source: <a href="./cbc.md">./cbc.md</a> + </aside> + + <aside class="page_number"> + 17/19 + </aside> + </footer> + </div> + </div> + + <!-- slide source: ./cbc.md --> + <div class="slide-wrapper"> + <div class="slide"> + <div class="inner"> + + <header><h1>GCC でのコンパイルの仕組み</h1></header> + + + <section><table width=100%> + <td style="margin:auto; text-align:center;"> + <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/ir.png" style="height:15em"> + </td> +</table> + +<li>CbC の実装では Parser と RTL の生成部分に手が加えられている。</li></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + <aside class="source"> + Source: <a href="./cbc.md">./cbc.md</a> + </aside> + + <aside class="page_number"> + 18/19 + </aside> + </footer> + </div> + </div> + + <!-- slide source: ./cbc.md --> + <div class="slide-wrapper"> + <div class="slide"> + <div class="inner"> + <header><h1>最適化の比較</h1></header> @@ -674,7 +886,7 @@ </tr> <!-- <tr> - <td></td>\<Element 'br' at 0x10398a300> <td></td>\<Element 'br' at 0x10398a360> </tr> + <td></td>\<Element 'br' at 0x10756cb70> <td></td>\<Element 'br' at 0x10756cbd0> </tr> --></p> <p></table> <li>関数を展開してその場で計算する『インライン展開』がより強力になっているのが確認できる</li> @@ -696,210 +908,6 @@ </aside> <aside class="page_number"> - 14/19 - </aside> - </footer> - </div> - </div> - - <!-- slide source: ./cbc.md --> - <div class="slide-wrapper"> - <div class="slide"> - <div class="inner"> - - <header><h1>GCC の最適化について</h1></header> - - - <section><ul> -<li>インライン展開の最適化がより良くなっていることができた.</li> -<li>また, GCC では新たな最適化もアップデートが行われていく.</li> -</ul></section> - - </div> - <div class="presenter_notes"> - <header><h1>Presenter Notes</h1></header> - <section> - - </section> - </div> - <footer> - - <aside class="source"> - Source: <a href="./cbc.md">./cbc.md</a> - </aside> - - <aside class="page_number"> - 15/19 - </aside> - </footer> - </div> - </div> - - <!-- slide source: ./cbc.md --> - <div class="slide-wrapper"> - <div class="slide"> - <div class="inner"> - - <header><h1>まとめ</h1></header> - - - <section><ul> -<li>今回 CbC-GCC を GCC-4.6 へとアップデートを行った.</li> -<li>アップデートに伴い最適化の強制付与や環境付き継続の部分の実装の修正を行った.</li> -<li>アップデートにかけたことで, より良い最適化がかかることを確認できた.</li> -<li>GCC ベースの CbC コンパイラは今後 GCC のアップデートに合わせていくだけとなる.</li> -</ul> -<h2>今後の課題</h2> -<ul> -<li>LLVM ベースの CbC コンパイラの開発</li> -<li>google Go 言語への実装の検討</li> -</ul></section> - - </div> - <div class="presenter_notes"> - <header><h1>Presenter Notes</h1></header> - <section> - - </section> - </div> - <footer> - - <aside class="source"> - Source: <a href="./cbc.md">./cbc.md</a> - </aside> - - <aside class="page_number"> - 16/19 - </aside> - </footer> - </div> - </div> - - <!-- slide source: ./cbc.md --> - <div class="slide-wrapper"> - <div class="slide"> - <div class="inner"> - - <header><h1>CbC の実装: 環境付き継続</h1></header> - - - <section><ul> -<li>環境付き継続: C との互換を取るための機能。継続を行った C の関数に戻ることができる。 </li> -<li>_CbC_return、 _CbC_environment キーワードを使うことで使える。</li> -<li> -<p>以下の使い方の場合、戻値 1 を返す。 -<pre> -<strong>code c1(</strong>code ret(int,void <em>),void </em>env) { - goto ret(1,env); -} -int main() { - goto c1(<strong>return, </strong>environment); -} -</pre></p> -</li> -<li> -<p>今回この環境付き継続をスレッドセーフの実装へと修正した。</p> -</li> -</ul></section> - - </div> - <div class="presenter_notes"> - <header><h1>Presenter Notes</h1></header> - <section> - - </section> - </div> - <footer> - - <aside class="source"> - Source: <a href="./cbc.md">./cbc.md</a> - </aside> - - <aside class="page_number"> - 17/19 - </aside> - </footer> - </div> - </div> - - <!-- slide source: ./cbc.md --> - <div class="slide-wrapper"> - <div class="slide"> - <div class="inner"> - - <header><h1>CbC 引数渡し</h1></header> - - - <section><p><li>CbC では引数渡しにできるだけレジスタを用いるようにしている.</li> -<table border=1 width=100%> - <caption><small>fastcall属性有・無の実行速度</small></caption> - <tr> - <td width=50% style="text-align:center;">fastcall無し</td> - </tr> - <tr> - <td style="margin:auto; text-align:center;"> - <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/linux_conv_nofastcall.png" style="height:15em;"> - </td> - </tr> - <tr> - <td width=50% style="text-align:center;">fastcall有り</td> - <tr> - <td> - <img src="./pix/linux_conv_fastcall.png" style="height:15em;"> - </td> - </tr> -</table></p></section> - - </div> - <div class="presenter_notes"> - <header><h1>Presenter Notes</h1></header> - <section> - - </section> - </div> - <footer> - - <aside class="source"> - Source: <a href="./cbc.md">./cbc.md</a> - </aside> - - <aside class="page_number"> - 18/19 - </aside> - </footer> - </div> - </div> - - <!-- slide source: ./cbc.md --> - <div class="slide-wrapper"> - <div class="slide"> - <div class="inner"> - - <header><h1>GCC でのコンパイルの仕組み</h1></header> - - - <section><table width=100%> - <td style="margin:auto; text-align:center;"> - <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/ir.png" style="height:15em"> - </td> -</table> - -<li>CbC の実装では Parser と RTL の生成部分に手が加えられている。</li></section> - - </div> - <div class="presenter_notes"> - <header><h1>Presenter Notes</h1></header> - <section> - - </section> - </div> - <footer> - - <aside class="source"> - Source: <a href="./cbc.md">./cbc.md</a> - </aside> - - <aside class="page_number"> 19/19 </aside> </footer> @@ -1015,37 +1023,37 @@ <tr id="toc-row-14"> - <th><a href="#slide14">最適化の比較</a></th> + <th><a href="#slide14">GCC の最適化</a></th> <td><a href="#slide14">14</a></td> </tr> <tr id="toc-row-15"> - <th><a href="#slide15">GCC の最適化について</a></th> + <th><a href="#slide15">まとめ</a></th> <td><a href="#slide15">15</a></td> </tr> <tr id="toc-row-16"> - <th><a href="#slide16">まとめ</a></th> + <th><a href="#slide16">CbC の実装: 環境付き継続</a></th> <td><a href="#slide16">16</a></td> </tr> <tr id="toc-row-17"> - <th><a href="#slide17">CbC の実装: 環境付き継続</a></th> + <th><a href="#slide17">CbC 引数渡し</a></th> <td><a href="#slide17">17</a></td> </tr> <tr id="toc-row-18"> - <th><a href="#slide18">CbC 引数渡し</a></th> + <th><a href="#slide18">GCC でのコンパイルの仕組み</a></th> <td><a href="#slide18">18</a></td> </tr> <tr id="toc-row-19"> - <th><a href="#slide19">GCC でのコンパイルの仕組み</a></th> + <th><a href="#slide19">最適化の比較</a></th> <td><a href="#slide19">19</a></td> </tr>