# HG changeset patch # User Nobuyasu Oshiro # Date 1329903426 -32400 # Node ID f0a7ebdf9d3fe9dee3054141c3730c38e8b15edc # Parent 8bf97bf22f54ef52bd4e6d3ff29c5b0c6c084043 modify diff -r 8bf97bf22f54 -r f0a7ebdf9d3f paper/resume.tex --- a/paper/resume.tex Wed Feb 22 16:24:21 2012 +0900 +++ b/paper/resume.tex Wed Feb 22 18:37:06 2012 +0900 @@ -37,7 +37,7 @@ 本研究では, GCC-4.5 をベースとしていた CbC-GCC を GCC-4.6 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う. \section{Continuation basede C (CbC)} -Continuation based C (以下 CbC) は状態遷移記述をベースとしたプログラミング言語である. +Continuation based C (以下 CbC) は状態遷移記述が行うことができる C を基本としたプログラミング言語である. 構文は C と同じであるが, 継続(goto) やコードセグメントの導入によりループ制御や関数コールが取り除かれる. CbC のプログラムはコードセグメントの末尾から次のコードセグメントへの継続を記述することで作られる. 図\ref{fig:cs}はコードセグメント間の処理の流れを表している. @@ -52,10 +52,10 @@ \section{GCC-4.6 への実装} +CbC 環境を保持しない継続は軽量継続と呼ばれる. GCC における軽量継続は Tail Call Ellimination (末尾除去)を強制することで実装する. これにより, コードセグメント間の移動を, call ではなく jmp 命令で行う. -コードセグメント自体には戻値はない. - +この為コードセグメントからのは戻値は無くなる. 図\ref{fig:continue}は Tail Call Elimination によるプログラムの処理の流れを表す. \begin{figure}[htpb] \begin{center} @@ -69,7 +69,7 @@ 関数が Tail Call Elimination にかかる為には, ``呼び出し先関数と呼び出し元関数の方が一致している'' 等といった幾つかの条件をクリアしなければならない. これまでの実装ではコードセグメントに条件をクリアさせる為, 専用の関数を用意していた. -しかし今回の実装ではその関数を撤廃し, 末尾除去にかかるフラグを落とさせない +しかし今回の実装ではその関数を廃止し, 末尾除去にかかるフラグを落とさせない コードを追加することで Tail Call Elimination の条件をクリアさせるようになった. これにより GCC のアップデート時に伴う専用関数の修正が不要となり, 楽な管理が行えるようになった. @@ -84,7 +84,7 @@ %持つコードセグメントになる. %GCC内部では, \verb+__return+ は, 関数内で定義された \verb+_cbc_internal_return+関数へのポインタを返す. %戻値は, \verb+cbc_internal_return+ 関数内で定義された変数\verb+retval+を通して返される(Listing\ref{code:retval}) . -実際には \verb+__return+ キーワードにより GCC 内部でlisting\ref{code:retval}のコードが生成される. +実際には \verb+__return+ キーワードにより GCC 内部でlisting\ref{code:retval}のコードが生成されている. \begin{figure}[h] \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=環境付き継続を行うコード,label=code:retval] @@ -141,25 +141,28 @@ プログラムは Micro-C のベンチマークにも使用されるものである. 引数 1 は C で書かれたプログラムをただ CbC へと変換したプログラムになる. 引数 2 と 3 は Micro-C 用に手動で最適化を行ったプログラムである. -Linux 上で 32bit と 64bit それぞれに最適化オプション(-O2)をつけての評価を行った. -結果を図\ref{fig:linux_conv}に示す. +また評価は \verb+x86_64+ 上の CentOS 5.7 で行った. +%また評価は \verb+x86_64+ 上の OS X(10.7) で 32bit と 64bit それぞれに最適化オプション(-O2)をつけての評価を行った. +%結果を図\ref{fig:conv1}の様になった(斜線は segmentation fault を示す). + \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/conv1_linux.pdf}} \end{center} \caption{各種コンパイラにより生成されたコードの速度比較} - \label{fig:linux_conv} + \label{fig:conv1} \end{figure} \subsection{評価の考察} まず, Micro-C 版より GCC 版コンパイラの方が結果が良いことが確認できる. -GCC-4.5 と GCC-4.6 版を比較してみると手動で最適化を行なっている引数 2 と 3 の結果に余り差はみられない. -しかし CbC へと変換しただけの引数 1 の場合には GCC-4.6 版が 32bit 版は 2.43倍, 64bit 版は 1.68 倍と優っている. -つまり GCC-4.5 に比べ GCC-4.6 の最適化が修正されよりよくなっているのが確認できる. +次に GCC-4.5 と GCC-4.6 を比較してみる. +手動で最適化を行なっている引数 2 と 3 の時は余り差は無い. +だが, 引数 1 の時は GCC-4.6 版が GCC-4.5 に比べて 1.67 倍程早い. +この結果から GCC-4.5 に比べ GCC-4.6 の最適化が修正されよりよくなっているのが確認できる. \section{今後の課題} 今回, CbC コンパイラを GCC-4.6 へとアップデートを行った. -アップデートに伴い実装の修正と Intel64 ビットへの対応を行った. +アップデートに伴い実装の修正と Intel64 bit への対応を行った. また, CbC の記述に便利な新たな構文の追加も行うことができた. GCC 版 CbC コンパイラは細かい実装の除けば, 以後 GCC のアップデートに合わせていくだけとなる.