changeset 12:f0a7ebdf9d3f draft

modify
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Wed, 22 Feb 2012 18:37:06 +0900
parents 8bf97bf22f54
children b3ebb4a6ae75
files paper/resume.tex
diffstat 1 files changed, 15 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- 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 のアップデートに合わせていくだけとなる.