comparison evaluations.tex @ 7:8ef81ff8cb52

emended.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 12 Feb 2010 13:10:57 +0900
parents dfb89e32eea1
children 4b2af58b0302
comparison
equal deleted inserted replaced
6:b59d31966d7d 7:8ef81ff8cb52
1 \chapter{評価・考察} 1 \chapter{評価・考察}
2 \label{chp:eval} 2 \label{chp:eval}
3 3
4 本章では本研究の評価を行う。 4 本章では本研究の評価を行う。
5 5
6
7 \section{本研究での改善による成果}
8 本研究では、2008年に実装されたGCCベースコンパイラの改善を行った。
9 まずはその改善による成果をここで述べる。
10
11 \begin{description}
12 \item [並列代入] \hfill \\
13 並列代入の改善により、これまで存在した軽量継続の際のバグが取り除か
14 れた。特に引数で渡されたコードセグメントポインタへ継続する際に出て
15 いたバグに対する影響が大きい。
16 \item [環境付き継続の実装] \hfill \\
17 この実装により、Cとの互換性が確保できた。これにより名実ともにCwC
18 コンパイラとして完成したと言える。
19 \item [PowerPCでの間接軽量継続] \hfill \\
20 これまで実質的にはPowerPCでは使用不能であった。
21
22 本研究室ではPS3を用いた研究も行っており、その研究ではPowerPCアーキ
23 テクチャが必要となる。この問題の解決により、当研究室の提案する
24 CeriumはCbCベースへの移行が可能になる。
25 \item [プトロタイプ宣言の自動生成] \hfill \\
26 GCCとmicro-cの間にある、コードセグメントの宣言に関する差異が、この
27 自動生成によって改善された。これにより、これまでmicro-c用に作成さ
28 れていたプログラムはほとんど修正することなく動く。
29 \item [x86でのfastcall] \hfill \\
30 未だに主流であるx86アーキテクチャ(x86\_64への移行は進みつつあるが
31 )において、若干の速度低下が見られていたものを改善した。この測定に
32 ついては\ref{sec:evaluation}節で行う。
33 \end{description}
34
6 \section{GCCを使うことの利点・欠点} 35 \section{GCCを使うことの利点・欠点}
7 \label{sec:merit} 36 \label{sec:merit}
8 37
9 これまでCbCのコンパイルに使用してきたmc(micro-c)に対し、新しくGCCが 38 これまでCbCのコンパイルに使用してきたmicro-cに対し、新しくGCCが
10 CwCのフルセットとして使用可能となった。ここでGCCを用いることの利点と欠 39 CwCのフルセットとして使用可能となった。ここでGCCを用いることの利点と欠
11 点について考察する。 40 点について考察する。
12 41
13 \subsection*{アーキテクチャ} 42 \subsection*{アーキテクチャ}
14 43
15 mcにおいてはPPC,x86,MIPS,ARM,SPUなど、多数のCPUアーキテクチャをサポー 44 micro-cにおいてはPPC, x86, MIPS, ARM, SPUなど、多数のCPUアーキテクチャ
16 トしてきた。しかしあるCPUに新しく対応するには多大な時間、労力が必要と 45 をサポートしてきた。しかし他のCPUに新しく対応するには多大な時間、労力
17 なる。 46 が必要となる。
18 GCCは現在、既に20を越えるCPUに対応しており、またOS毎のABIの差異も吸収 47 GCCは現在、既に20を越えるCPUに対応しており、またOS毎のABIの差異も吸収
19 可能である。これはGCCをコンパイラとすることに最大の利点である。 48 可能である。これはGCCをコンパイラとすることに最大の利点である。
20 49
21 またそれだけでなく、GCCは新しいアーキテクチャへの対応も早い。この特徴 50 またそれだけでなく、GCCは新しいアーキテクチャへの対応も早い。この特徴
22 は、GCCがフロントエンドとバックエンドという形で言語実装とアーキテクチ 51 は、GCCがフロントエンドとバックエンドという形で言語実装とアーキテクチ
31 (instruction scheduling)などがある。 60 (instruction scheduling)などがある。
32 61
33 とくに、プログラムにおいては類似した形の式(expression)を扱うことがよく 62 とくに、プログラムにおいては類似した形の式(expression)を扱うことがよく
34 あるため、共通式除去は非常に効果が高い。同様の効果は同じ式を保持する変 63 あるため、共通式除去は非常に効果が高い。同様の効果は同じ式を保持する変
35 数を用意することでも実現できるがソースコードの修正が必要になる。 64 数を用意することでも実現できるがソースコードの修正が必要になる。
36 mcにはこの最適化は含まれていないため、複雑な計算式を含むプログラムにお 65 micro-cにはこの最適化は含まれていないため、複雑な計算式を含むプログラムにお
37 いてはGCCの方が良いコンパイル結果を示すものと考えられる。 66 いてはGCCの方が良いコンパイル結果を示すものと考えられる。
38 67
39 %\ref{sec:}の性能評価では最適化の効果についても測定する。 68 %\ref{sec:}の性能評価では最適化の効果についても測定する。
40 69
41 \subsection*{デバッガ} 70 \subsection*{デバッガ}
52 \subsection*{関数呼出しの名残り} 81 \subsection*{関数呼出しの名残り}
53 上記の利点に対し、GCCであるゆえの欠点も存在する。 82 上記の利点に対し、GCCであるゆえの欠点も存在する。
54 83
55 本研究による軽量継続制御の実装には\ref{chp:impl}章で説明したように関数 84 本研究による軽量継続制御の実装には\ref{chp:impl}章で説明したように関数
56 の末尾最適化を利用した。それゆえコードセグメントのアセンブラ出力の命令 85 の末尾最適化を利用した。それゆえコードセグメントのアセンブラ出力の命令
57 列には一部関数呼び出し時のスタック処理が残ってしまうことが分かっている。 86 列には関数呼び出し時のスタック処理が一部残ってしまうことが分かっている。
58 特にレジスタの少ないアーキテクチャ、x86などではそれが顕著に現れる。 87 特にレジスタの少ないアーキテクチャ、x86などではそれが顕著に現れる。
59 88
60 mcではコードセグメントと関数は完全に別物として取り扱っており、この様な 89 micro-cではコードセグメントと関数は完全に別物として取り扱っており、この様な
61 スタック操作はコードセグメントには現れないため、このオーバヘッドがGCC 90 スタック操作はコードセグメントには現れないため、このオーバヘッドがGCC
62 では不利な点である。 91 では不利な点である。
63 92
64 93
65 \subsection*{互換性、ABI} 94 \subsection*{互換性、ABI}
66 %これは最後の考察に入れよう 95 また、同じく関数呼び出しの名残りから、GCCではmicro-cとのバイナリレベル
67 ソースコードレベルでの互換性の問題がある。 96 での互換性がない。つまりGCCでコンパイルしたコードセグメントからmicro-c
68 また、継続制御のパラメタを 97 でコンパイルしたコードセグメントに継続することはできない。
69 % 関数宣言 98
70 % 型推定 99 これはmicro-cでの軽量継続のABIが関数とはまったく違うものだからである。
71 % ABI、特にppc 100 今回はtailcallを実装に用いたため、関数としての制限があり、micro-cの
72 101 ABIに合わせることはできなかった。
73 102
74 % 最適化 103 この問題はGCCの欠点というわけではないが、CbCベースの共有ライブラリを生
75 % SPUでのベクトル演算 104 成・使用する場合には注意が必要となる。
76 % gdb 105
77 % architecture 106
78 107
79 % 関数呼び出しのオーバヘッド 108
80 % 互換性,ソースコード、ABI 109 \section{性能評価}\label{sec:evaluation}
81 110 次にコンパイラの性能評価を行う。
82
83
84
85
86 \section{性能評価}
87 111
88 \subsection{評価項目、比較対象} 112 \subsection{評価項目、比較対象}
89 コンパイラの出力した実行ファイルを複数回実行し、その実効速度を測定する 113 コンパイラの出力した実行ファイルを複数回実行し、その実効速度を測定する
90 。CbCは実用的なプログラムの記述を目的としているので、プログラムの動作 114 。CbCは実用的なプログラムの記述を目的としているので、プログラムの動作
91 速度は性能の評価として妥当だと考えられる。 115 速度は性能の評価として妥当だと考えられる。
92 116
93 またもう一つの項目として、出力した実行ファイルのファイルサイズも評価す 117 またもう一つの項目として、出力した実行ファイルのファイルサイズも評価す
94 る。一般的なプログラムではファイルサイズを気にすることは少ないが、CbC 118 る。一般的なプログラムではファイルサイズを気にすることは少ないが、CbC
95 の用途には組み込みなども考えられているため、ファイルサイズの影響は大き 119 の用途には組み込みなども考えられているため、ファイルサイズの影響は大き
96 い。比較する際はstripコマンドを用いてデバグ情報等を取り除いている。 120 い。比較する際はstripコマンドを用いてデバグ情報等を取り除いている。
97 %SPUはm..
98 121
99 実効速度、ファイルサイズの比較対象として2つ用意した。 122 実効速度、ファイルサイズの比較対象として2つ用意した。
100 一つは過去の研究でのGCCベースコンパイラ、つまり今回の改善を含めてない 123 一つは過去の研究でのGCCベースコンパイラ、つまり今回の改善を含めてない
101 ものである。こちらはGCCのバージョン4.2.3をベースとしている。 124 ものである。こちらはGCCのバージョン4.2.3をベースとしている。
102 125
103 もう一つの比較対象にはmicro-cベースのコンパイラ(以下mc)を用いる。 126 もう一つの比較対象にはmicro-cベースのコンパイラを用いる。
104 さらにGCCでは最適化による効果も評価するため、 127 さらにGCCでは最適化による効果も評価するため、
105 \begin{inparaenum}[\itshape 1)\ttfamily] 128 \begin{inparaenum}[\itshape 1)\ttfamily]
106 \item 最適化なし ``-O0'' 129 \item 最適化なし ``-O0''
107 \item 速度最適化 ``-O2 -fomit-framepointer'' 130 \item 速度最適化 ``-O2 -fomit-framepointer''
108 \item サイズ最適化 ``-Os'' 131 \item サイズ最適化 ``-Os''
116 CbCの性能評価に適していると考えられる。クイックソートはCbCに先立ってC 139 CbCの性能評価に適していると考えられる。クイックソートはCbCに先立ってC
117 で実装し、参考文献\cite{bib:kinjo-2005}で紹介する手法を用いてCbCに変換 140 で実装し、参考文献\cite{bib:kinjo-2005}で紹介する手法を用いてCbCに変換
118 した。このプログラムは付録\ref{apx:quicksort}に添付する。 141 した。このプログラムは付録\ref{apx:quicksort}に添付する。
119 142
120 測定環境は両コンパイラが対応しているアーキテクチャ、OSから以下の5つの 143 測定環境は両コンパイラが対応しているアーキテクチャ、OSから以下の5つの
121 組み合わせ[CPUアーキテクチャ/OS種別]を選択した。 144 組み合わせ[CPUアーキテクチャ/OS種別]を選択した。(ppcはPowerPCの意であ
145 る)
122 \begin{itemize} 146 \begin{itemize}
123 \item ppc/OS X 147 \item ppc/OS X
124 \item ppc/linux 148 \item ppc/linux
125 \item ppc/linux on PS3 149 \item ppc/linux on PS3
126 \item x86/OS X 150 \item x86/OS X
127 \item x86/linux 151 \item x86/linux
128 \end{itemize} 152 \end{itemize}
129 なお、mcはmips,armにも対応しているが、現在その処理系が用意できなかった 153 なお、micro-cはMIPS, ARMにも対応しているが、現在その処理系が用意できな
130 ので割愛している。また、GCC-4.2.3ベースコンパイラはppcでは実行不能であ 154 かったので割愛している。また、GCC-4.2.3ベースコンパイラはppcでは実行不
131 ったためx86のみとなる。 155 能であったためx86のみとなる。
132 156
133 各評価マシンの詳細は付録\ref{sec:machine-specs}に掲載する。 157 各評価マシンの詳細は付録\ref{sec:machine-specs}に掲載する。
134 158
135 %GCCのコンパイルでは``-O2 -fomit-pointer''の最適化を付加して測定している。 159 %GCCのコンパイルでは``-O2 -fomit-pointer''の最適化を付加して測定している。
136 % noreturnもON. 160 % noreturnもON.
142 % -O2で約10秒になる要素数を選んだ方がいいかもしれない 166 % -O2で約10秒になる要素数を選んだ方がいいかもしれない
143 \begin{table}[htpb] 167 \begin{table}[htpb]
144 \centering 168 \centering
145 \begin{tabular}{|c|c|c|c|c|} \hline 169 \begin{tabular}{|c|c|c|c|c|} \hline
146 \multirow{2}{*}{ \backslashbox{CPU/OS}{コンパイラ} } 170 \multirow{2}{*}{ \backslashbox{CPU/OS}{コンパイラ} }
147 & \multicolumn{3}{c|}{GCC} & \multirow{2}{*}{mc} \\ \cline{2-4} 171 & \multicolumn{3}{c|}{GCC} & \multirow{2}{*}{micro-c} \\ \cline{2-4}
148 &最適化なし&速度最適化&サイズ最適化& \\ \hline 172 &最適化なし&速度最適化&サイズ最適化& \\ \hline
149 x86/OS X & 5.901 & 2.434 & 2.785 & 2.857 \\ \hline 173 x86/OS X & 5.901 & 2.434 & 2.785 & 2.857 \\ \hline
150 x86/Linux & 5.732 & 2.401 & 2.876 & 2.254 \\ \hline 174 x86/Linux & 5.732 & 2.401 & 2.876 & 2.254 \\ \hline
151 ppc/OS X &14.875 & 2.146 & 2.170 & 4.811 \\ \hline 175 ppc/OS X &14.875 & 2.146 & 2.170 & 4.811 \\ \hline
152 ppc/Linux &19.793 & 3.955 & 4.013 & 6.454 \\ \hline 176 ppc/Linux &19.793 & 3.955 & 4.013 & 6.454 \\ \hline
153 ppc/PS3 &39.176 & 5.874 & 6.111 &11.121 \\ \hline 177 ppc/PS3 &39.176 & 5.874 & 6.111 &11.121 \\ \hline
154 \end{tabular} 178 \end{tabular}
155 \caption{アーキテクチャ毎のGCCとmcの速度比較(単位: 秒)} 179 \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)}
156 \label{tab:speed-mc-vs-gcc} 180 \label{tab:speed-mc-vs-gcc}
157 \end{table} 181 \end{table}
158 182
159 次に実行ファイルのstrip前のファイルサイズを表\ref{tab:eval-nostrip} 183 実行ファイルのstrip前のファイルサイズを表\ref{tab:eval-nostrip}
160 に、strip後のファイルサイズを表\ref{tab:eval-strip}に示す。 184 に、strip後のファイルサイズを表\ref{tab:eval-strip}に示す。
161 185
162 \begin{table}[htpb] 186 \begin{table}[htpb]
163 \centering 187 \centering
164 \begin{tabular}{|c|c|c|c|c|c|} \hline 188 \begin{tabular}{|c|c|c|c|c|c|} \hline
165 \multirow{3}{*}{ \backslashbox{CPU/OS}{コンパイラ} } 189 \multirow{3}{*}{ \backslashbox{CPU/OS}{コンパイラ} }
166 & \multicolumn{4}{c|}{GCC} & \multirow{3}{*}{mc} \\ \cline{2-5} 190 & \multicolumn{4}{c|}{GCC} & \multirow{3}{*}{micro-c} \\ \cline{2-5}
167 & \multicolumn{2}{c|}{デバグ情報(-g)付き} & \multicolumn{2}{c|}{デバグ情報なし} & \\ \cline{2-5} 191 & \multicolumn{2}{c|}{デバグ情報(-g)付き} & \multicolumn{2}{c|}{デバグ情報なし} & \\ \cline{2-5}
168 & -O2 & -Os & -O2 & -Os & \\ \hline 192 & 速度最適化 & サイズ最適化 & 速度最適化 & サイズ最適化 & \\ \hline
169 x86/OS X & 11100 & 11100 & 9804 & 9804 & 11136 \\ \hline 193 x86/OS X & 11100 & 11100 & 9804 & 9804 & 11136 \\ \hline
170 x86/Linux & 18444 & 17310 & 8216 & 8214 & 9844 \\ \hline 194 x86/Linux & 18444 & 17310 & 8216 & 8214 & 9844 \\ \hline
171 ppc/OS X & 10392 & 10392 & 9172 & 9172 & 14396 \\ \hline 195 ppc/OS X & 10392 & 10392 & 9172 & 9172 & 14396 \\ \hline
172 ppc/Linux & 25138 & 23876 & 13030 & 13028 & 15453 \\ \hline 196 ppc/Linux & 25138 & 23876 & 13030 & 13028 & 15453 \\ \hline
173 ppc/PS3 & 22142 & 20452 & 9906 & 9672 & 15463 \\ \hline 197 ppc/PS3 & 22142 & 20452 & 9906 & 9672 & 15463 \\ \hline
177 \end{table} 201 \end{table}
178 \begin{table}[htpb] 202 \begin{table}[htpb]
179 \centering 203 \centering
180 \begin{tabular}{|c|c|c|c|} \hline 204 \begin{tabular}{|c|c|c|c|} \hline
181 \multirow{2}{*}{ \backslashbox{CPU/OS}{コンパイラ} } 205 \multirow{2}{*}{ \backslashbox{CPU/OS}{コンパイラ} }
182 & \multicolumn{2}{c|}{GCC} & \multirow{2}{*}{mc} \\ \cline{2-3} 206 & \multicolumn{2}{c|}{GCC} & \multirow{2}{*}{micro-c} \\ \cline{2-3}
183 & -O2 & -Os & \\ \hline 207 & 速度最適化 & サイズ最適化 & \\ \hline
184 x86/OS X & 9176 & 9176 & 9172 \\ \hline 208 x86/OS X & 9176 & 9176 & 9172 \\ \hline
185 x86/Linux & 5752 & 5752 & 5796 \\ \hline 209 x86/Linux & 5752 & 5752 & 5796 \\ \hline
186 ppc/OS X & 8576 & 8576 & 12664 \\ \hline 210 ppc/OS X & 8576 & 8576 & 12664 \\ \hline
187 ppc/Linux & 10068 & 10068 & 9876 \\ \hline 211 ppc/Linux & 10068 & 10068 & 9876 \\ \hline
188 ppc/PS3 & 6960 & 6728 & 8636 \\ \hline 212 ppc/PS3 & 6960 & 6728 & 8636 \\ \hline
189 \end{tabular} 213 \end{tabular}
190 \caption{実行ファイルのファイルサイズ比較 stripped(単位: bytes)} 214 \caption{実行ファイルのファイルサイズ比較 stripped(単位: bytes)}
191 \label{tab:eval-strip} 215 \label{tab:eval-strip}
192 \end{table} 216 \end{table}
193 217
194 最後に、本研究での実装GCC-4.4.2と以前のバージョンGCC-4.2.3との比較を表 218 本研究での実装GCC-4.4.2と以前のバージョンGCC-4.2.3との比較を表
195 \ref{tab:speed-old-vs-new}に示す。こちらはx86のみ、最適化も-Osは対応し 219 \ref{tab:speed-old-vs-new}に示す。こちらはx86のみ、最適化も-Osは対応し
196 ていない。 220 ていない。
197 \begin{table}[htpb] 221 \begin{table}[htpb]
198 \centering 222 \centering
199 \begin{tabular}{|c|c|c|c|c|} \hline 223 \begin{tabular}{|c|c|c|c|c|} \hline
200 \multirow{2}{*}{ \backslashbox{CPU/OS}{コンパイラ} } 224 \multirow{2}{*}{ \backslashbox{CPU/OS}{コンパイラ} }
201 & \multicolumn{2}{c|}{CbC on GCC-4.4.2} & 225 & \multicolumn{2}{c|}{CbC on GCC-4.4.2} &
202 \multicolumn{2}{c|}{CbC on GCC-4.2.3} \\ \hline 226 \multicolumn{2}{c|}{CbC on GCC-4.2.3} \\ \hline
203 & -O0 & -O2 & -O0 & -O2 \\ \hline 227 & 最適化なし & 速度最適化 & 最適化なし & 速度最適化 \\ \hline
204 x86/OS X & 5.907 & 2.434 & 4.668 & 3.048 \\ \hline 228 x86/OS X & 5.907 & 2.434 & 4.668 & 3.048 \\ \hline
205 x86/Linux & 5.715 & 2.401 & 4.525 & 2.851 \\ \hline 229 x86/Linux & 5.715 & 2.401 & 4.525 & 2.851 \\ \hline
206 \end{tabular} 230 \end{tabular}
207 \caption{GCC-4.2.3ベースとGCC-4.4.2ベースの速度比較(単位: 秒)} 231 \caption{GCC-4.2.3ベースとGCC-4.4.2ベースの速度比較(単位: 秒)}
208 \label{tab:speed-old-vs-new} 232 \label{tab:speed-old-vs-new}
210 234
211 235
212 \subsection{評価結果考察} 236 \subsection{評価結果考察}
213 % stripするとx86はサイズに変化がない 237 % stripするとx86はサイズに変化がない
214 \subsubsection{速度面} 238 \subsubsection{速度面}
215 まずは速度面からこの測定結果を考察する。
216
217 まずどのアーキテクチャにおいても、GCCの最適化が大きな速度差を生み出し 239 まずどのアーキテクチャにおいても、GCCの最適化が大きな速度差を生み出し
218 ている事が分かる。最適化なしと速度最適化を比較すると、x86では2.4倍、 240 ている事が分かる。最適化なしと速度最適化を比較すると、x86では2.4倍、
219 ppcでは5〜7倍もの差が生じている。 241 ppcでは5〜7倍もの差が生じている。
220 ただしppcのこの以上な速度差は\ref{sec:impl-parallel}並列代入で示した様に、継続の引 242 ただしppcのこの以上な速度差は\ref{sec:impl-parallel}並列代入で示した様に、継続の引
221 数を全て一時変数に入れていることが大きい。その場合最適化なしではすべて 243 数を全て一時変数に入れていることが大きい。その場合最適化なしではすべて
222 の引数を一度メモリに確保するので、その分逆に遅くなっているのだと考えら 244 の引数を一度メモリに確保するので、その分逆に遅くなっているのだと考えら
223 れる。しかしながら最適化を有効にすることでそのメモリへの一時変数の確保 245 れる。しかしながら最適化を有効にすることでそのメモリへの一時変数の確保
224 も解消されるということが分かった。 246 も解消されるということが分かった。
225 247
226 x86はOS XとLinuxの環境で測定を行った。速度最適化のGCCとmcを比べると、 248 x86はOS XとLinuxの環境で測定を行った。速度最適化のGCCとmicro-cを比べる
227 OS Xではmcに比べて20\%ほど早くなった事が分かる。しかし逆にLinux環境で 249 と、 OS Xではmicro-cに比べて20\%ほど早くなった事が分かる。しかし逆に
228 は6\%の速度低下が示された。どちらにしてもppcほどの良い結果ではない。こ 250 Linux環境では6\%の速度低下が示された。どちらにしてもppcほどの良い結果
229 れは自由に使えるレジスタが極めて少ないというx86の特殊なアーキテクチャ 251 ではない。これは自由に使えるレジスタが極めて少ないというx86の特殊なア
230 が要因だと考えられる。そのためGCCの最適化が十分に機能できなかった可能 252 ーキテクチャが要因だと考えられる。そのためGCCの最適化が十分に機能でき
231 性がある。この6\%の差は実用レベルでは問題なく、プログラムの構成によっ 253 なかった可能性がある。この6\%の差は実用レベルでは問題なく、プログラム
232 ては結果は逆転する事も十分にある。 254 の構成によっては結果は逆転する事も十分にある。
233 255
234 ppcにおいてはどのオペレーティングシステムでも、速度最適化を使ったGCCは 256 ppcにおいてはどのオペレーティングシステムでも、速度最適化を使ったGCCは
235 mcに比べて早い事が分かる。いずれも約2倍、もしくはそれ以上に速度が向上 257 micro-cに比べて早い事が分かる。いずれも約2倍、もしくはそれ以上に速度が
236 している。これはGCCの最適化機構が十分に働いている要因が大きい。 258 向上している。これはGCCの最適化機構が十分に働いている要因が大きい。
237 259
238 \subsubsection{アセンブラ比較} 260 \subsubsection{アセンブラ比較}
239 実際に出力されたアセンブラから速度向上の要因を確かめるため、quicksort 261 実際に出力されたアセンブラから速度向上の要因を確かめるため、quicksort
240 プログラムで使用されているコードセグメントを一つ例に挙げる。CbCのプロ 262 プログラムで使用されているコードセグメントを一つ例に挙げる。CbCのプロ
241 グラムソースがコード \ref{code:divider-e}である。このコードセグメント 263 グラムソースがコード \ref{code:divider-e}である。このコードセグメント
242 の速度最適化を使ったGCCによる出力がコード\ref{code:divider-e-gcc}、mc 264 の速度最適化を使ったGCCによる出力がコード\ref{code:divider-e-gcc}、
243 による出力がコード \ref{code:divider-e-mc}である。 265 micro-c による出力がコード \ref{code:divider-e-mc}である。どちらもアー
244 どちらもアーキテクチャはppcである。 266 キテクチャはppcである。
245 267
246 %まずどのアーキテクチャにおいてもgccの最適化の効果が大きいことが分かる
247 %。 x86では約2.5倍、ppcでは4~7倍もの差が生じている。ppcの方で異様に効果
248 %が高いように見えるのは、関数やコードセグメントの引数渡しがレジスタベー
249 %スのため、最適化なしの場合には無駄なメモリアクセスが生じているためであ
250 %る。
251
252 %x86はOS XとLinuxの環境で測定を行った。OS Xではmcに比べて20\%ほど早くな
253 %ったことが分かる。しかし逆にLinux環境では6\%の速度低下が示された。
254 %どちらにおいてもppcほどの良い結果ではない。これは自由に使えるレジスタ
255 %が極めて少ないというx86の特殊なアーキテクチャが要因だと考えられる。そ
256 %のためにgccの最適化が十分に働かなかった可能性がある。逆に言うとmcが高
257 %いレベルでx86のアセンブラ命令を実行しているともとれる。この6\%の差は実
258 %用レベルでは問題なく、プログラムの構成によっては結果は逆転する事も十分
259 %にある。
260
261 %ppcではどのオペレーティングシステムでもmcに比べてgccが早いことが分かる
262 %。いずれも約2倍近くあるいはそれ以上に速度が向上している。これはgccの最
263 %適化機構が十分に働いている要因が大きい。
264
265 %\subsubsection{アセンブラ比較}
266 %比較のため、quicksortプログラムで使われているコードセグメントを一つ例
267 %にあげる。 CbCのソースがコード\ref{code:divider_s}、そのコードセグメン
268 %トのgccによる出力がコード\ref{code:divider_s_gcc}、mcによる出力がコー
269 %ド \ref{code:divider_s_mc} である。
270 %
271 \lstinputlisting[ 268 \lstinputlisting[
272 caption=quicksortプログラムで使われているコードセグメント, 269 caption=quicksortプログラムで使われているコードセグメント,
273 label=code:divider-e] 270 label=code:divider-e]
274 {sources/divider-e.cbc} 271 {sources/divider-e.cbc}
275 \begin{minipage}[t]{.45\textwidth} 272 \begin{minipage}[t]{.45\textwidth}
279 {sources/divider-e-gcc.asm} 276 {sources/divider-e-gcc.asm}
280 \end{minipage} 277 \end{minipage}
281 \hfill 278 \hfill
282 \begin{minipage}[t]{.45\textwidth} 279 \begin{minipage}[t]{.45\textwidth}
283 \lstinputlisting[ 280 \lstinputlisting[
284 caption=divider\_eのmcによる出力(ppc), 281 caption=divider\_eのmicro-cによる出力(ppc),
285 label=code:divider-e-mc] 282 label=code:divider-e-mc]
286 {sources/divider-e-mc.asm} 283 {sources/divider-e-mc.asm}
287 \end{minipage} 284 \end{minipage}
288 285
289 もっとも比較しやすい箇所は\verb|e-1|の処理である。 286 もっとも比較しやすい箇所は\verb|e-1|の処理である。コード
290 コード\ref{code:divider-e-gcc}のGCCではこれを1命令の\verb|addi 5,5,-1| 287 \ref{code:divider-e-gcc}のGCCではこれを1命令の\verb|addi 5,5,-1| で行
291 で行っている。 mcではこれが\verb|mr, addi, mr|という3命令になっている 288 っている。 micro-cではこれが\verb|mr, addi, mr|という3命令になっている
292 。これは変数\verb|s|の値を一度別のレジスタに移して計算するという処理で 289 。これは変数\verb|s|の値を一度別のレジスタに移して計算するという処理で
293 ある。この様な細かい命令の展開が速度に差が出る要因である。 290 ある。この様な細かい命令の展開が速度に差が出る要因である。
294 291
295 またこのppcのアセンブラからも、x86での速度差が少ないことが頷ける。引数 292 またこのppcのアセンブラからも、x86での速度差が少ないことが頷ける。引数
296 のほとんどをメモリに格納するx86では、計算のために一度レジスタに格納し 293 のほとんどをメモリに格納するx86では、計算のために一度レジスタに格納し
297 ないといけないことから、この命令は結局3命令になるはずであり、実際にx86 294 ないといけないことから、この命令は結局3命令になるはずであり、実際にx86
298 ではGCC,mc共にそのようなコードが出力されていた。 295 ではGCC, micro-c共にそのようなコードが出力されていた。
299 296
300 この結果より、CbCで記述されたプログラムではレジスタが多い方が実効速度 297 この結果より、CbCで記述されたプログラムではレジスタが多い方が実効速度
301 の面で有利であるということが分る。これは他のコンパイラ言語でも同じ事が 298 の面で有利であるということが分る。これは他のコンパイラ言語でも同じ事が
302 言えるが、(手続きやメソッドにおける)前の環境を保持する必要がないCbC 299 言えるが、(手続きやメソッドにおける)前の環境を保持する必要がないCbC
303 ではその影響がより強い。 300 ではその影響がより強い。
311 実行ファイルのファイルサイズは組み込み用途のプログラムには重要な要素と 308 実行ファイルのファイルサイズは組み込み用途のプログラムには重要な要素と
312 なる。多くの場合、組み込み機器では大容量のメモリは用意されておらず、 309 なる。多くの場合、組み込み機器では大容量のメモリは用意されておらず、
313 OSも存在しないため仮想記憶の概念がない。そのためメモリに乗り切らないプ 310 OSも存在しないため仮想記憶の概念がない。そのためメモリに乗り切らないプ
314 ログラムはそもそも実行不能である。 311 ログラムはそもそも実行不能である。
315 312
316 まず、評価の主な特徴として、strip後のファイルサイズ\ref{tab:eval-strip} 313 まず、評価の主な特徴として、strip後のファイルサイズ
317 をみると、x86ではmcとGCCでほとんど差がない事が分かる。この環境では速度 314 \ref{tab:eval-strip} をみると、x86ではmicro-cとGCCでほとんど差がない事
318 面でも大きな差はなく、mcの精度の良さがわかる。 315 が分かる。この環境では速度面でも大きな差はなく、micro-cの精度の良さが
316 わかる。
319 317
320 デバグ情報のあり/なし/strip後との比較で大きな差が出ているのは全て 318 デバグ情報のあり/なし/strip後との比較で大きな差が出ているのは全て
321 Linux(PS3含む)である。Linuxでは実行ファイルのファイル形式にELFを用い 319 Linux(PS3含む)である。Linuxでは実行ファイルのファイル形式にELFを用い
322 ている。この形式はLinuxの標準的な実行形式で、様々な研究に用いられてい 320 ている。この形式はLinuxの標準的な実行形式で、様々な研究に用いられてい
323 るため、Mach-Oと比べて付加機能が豊富である。そのため多くの情報が含まれ 321 るため、Mach-Oと比べて付加機能が豊富である。そのため多くの情報が含まれ
324 ているのだと考えられる。 322 ているのだと考えられる。
325 Linuxは組み込み用途に多く用いられているため、極端にメモリの制限された 323 Linuxは組み込み用途に多く用いられているため、極端にメモリの制限された
326 環境ではデバグが困難になることが考えられる。 324 環境ではデバグが困難になることが考えられる。
327 325
328 また興味深い特徴として、-O2と-Osの差がppc/PS3以外は全くないことも分か 326 また興味深い特徴として、速度最適化とサイズ最適化の差がppc/PS3以外は全
329 った。 -Osは-O2の最適化機能から、ファイルサイズが大きくなるものを除外 327 くないことも分かった。 サイズ最適化は速度最適化の最適化機能から、ファ
330 したものである。評価結果には-Osによるファイルサイズの減少はほとんどな 328 イルサイズが大きくなるものを除外したものである。評価結果にはサイズ最適
331 く、しかし速度は少々遅くなっている。このことからCbCによるプログラムで 329 化によるファイルサイズの減少はほとんどなく、しかし速度は少々遅くなって
332 は-Osを用いる必要はなく、-O2で十分であることが分かった。 330 いる。このことからCbCによるプログラムではサイズ最適化を用いる必要はな
331 く、速度最適化で十分であることが分かった。
333 332
334 333
335 % ELF, Mach-O 334 % ELF, Mach-O
336 % o OS Xはデバグ情報が少ない。逆か、ELFが多いのか 335 % o OS Xはデバグ情報が少ない。逆か、ELFが多いのか
337 % o x86でほぼ同じサイズ 336 % o x86でほぼ同じサイズ
365 364
366 365
367 366
368 367
369 368
370 %\section{CbCでのプログラミング}
371 % TODO:
372
373 369
374 \section{メンテナンス性の向上に関する取り組み}\label{sec:mentainance} 370 \section{メンテナンス性の向上に関する取り組み}\label{sec:mentainance}
375 371
376 本研究室ではこれまでCbCコンパイラとしてmicro-cを利用していた。このコン 372 本研究室ではこれまでCbCコンパイラとしてmicro-cを利用していた。このコン
377 パイラはベースとなるmicro-cには依存せずに、ほぼ独立な開発を続けている。 373 パイラはベースとなるmicro-cには依存せずに、ほぼ独立な開発を続けている。
378 374
379 これに対しGCCは現在も精力的に開発が続けられており、年数回のアップデー 375 これに対しGCCは現在も精力的に開発が続けられており、年数回のアップデー
380 トではバグの除去や最適化の改善などが行われている。 376 トではバグの除去や最適化の改善などが行われている。
381 そのためCbCコンパイラでもそのリリースに沿ってアップデートすることが望 377 そのためCbCコンパイラでもそのリリースに沿ってアップデートすることが望
382 ましく、実際に今回の改善の際にも2010年1月現在での最新リリースである 378 ましく、実際に今回の改善の際にも2010年1月現在での最新リリースである
383 4.4.2をベースとしている。 379 4.4.2をベースとして行い、本稿執筆中に4.4.3へのアップデートが行われた。
384 380
385 しかしアップデートの度に新しいソースコードを書き換えるのは無理があり、 381 しかしアップデートの度に新しいソースコードを書き換えるのは無理があり、
386 現実的ではない。最良の方法はGCCの正式な機能として開発リポジトリにマー 382 現実的ではない。最良の方法はGCCの正式な機能として開発リポジトリにマー
387 ジしてもらうことだが、現段階ではそこには至っていない。 383 ジしてもらうことだが、現段階ではそこには至っていない。
388 384
402 こちらがCbCに関するメインの開発環境となる。図\ref{fig:gcc-repository} 398 こちらがCbCに関するメインの開発環境となる。図\ref{fig:gcc-repository}
403 では中央と右のラインがそのリポジトリを表している。 399 では中央と右のラインがそのリポジトリを表している。
404 400
405 \begin{figure}[htpb] 401 \begin{figure}[htpb]
406 \begin{center} 402 \begin{center}
407 \includegraphics[width=.4\textwidth]{figures/gcc-repository.eps} 403 \includegraphics[width=.7\textwidth]{figures/gcc-repository.eps}
408 \end{center} 404 \end{center}
409 \caption{CbCコンパイラ開発でのリポジトリ管理(左が本家のリリースタイ 405 \caption{CbCコンパイラ開発でのリポジトリ管理(左が本家のリリースタイ
410 ムライン、中央がGCC-copy、右がCbCの開発用リポジトリのタイムライン)} 406 ムライン、中央がGCC-copy、右がCbCの開発用リポジトリのタイムライン)}
411 \label{fig:gcc-repository} 407 \label{fig:gcc-repository}
412 \end{figure} 408 \end{figure}
416 \begin{itemize} 412 \begin{itemize}
417 \item GCC-copyリポジトリにて 413 \item GCC-copyリポジトリにて
418 \begin{enumerate} 414 \begin{enumerate}
419 \item GCC-copyリポジトリ中のファイル全てを消す(バージョン管理情 415 \item GCC-copyリポジトリ中のファイル全てを消す(バージョン管理情
420 報以外) 416 報以外)
421 \item gcc-core-4.4.3.tar.gzを展開し、全ファイルをGCC-copyに追加 417 \item gcc-core-{\tt\it version}.tar.gzを展開し、全ファイルをGCC-copyに追加
422 \item \verb|hg status|で追加ファイル、削除ファイルを確認 418 \item \verb|hg status|で追加ファイル、削除ファイルを確認
423 \item コミット 419 \item コミット
424 \item gcc-4.4.3タグの追加 420 \item gcc-{\tt\it version}タグの追加
425 \end{enumerate} 421 \end{enumerate}
426 \item CbConGCCリポジトリにて 422 \item CbConGCCリポジトリにて
427 \begin{enumerate} 423 \begin{enumerate}
428 \item GCC-copyから\verb|pull|. 424 \item GCC-copyから\verb|pull|.
429 \item \verb|hg merge|でマージ実行 425 \item \verb|hg merge|でマージ実行
430 \item 衝突のあったファイルを修正 426 \item 衝突のあったファイルを修正
431 \item 実際にビルドしてテストファイルが動くことを確認 427 \item 実際にビルドしてテストファイルが動くことを確認
432 \item コミット 428 \item コミット
433 \item cbc-4.4.3タグの追加 429 \item cbc-{\tt\it version}タグの追加
434 \end{enumerate} 430 \end{enumerate}
435 \end{itemize} 431 \end{itemize}
436 432
437 以上でアップデートが完了する。 433 以上でアップデートが完了する。
438 434
439 \subsection{このリポジトリ管理方法の評価} 435 \subsection{このリポジトリ管理方法の評価}
440 436
441 実際にこのリポジトリ管理方法を用いてアップデートを行った。この作業では 437 実際にこのリポジトリ管理方法を用いてアップデートを行った。この評価では
442 バージョン 4.4.0から4.4.2へのアップデートと、4.4.2から4.4.3へのアップ 438 バージョン 4.4.0から4.4.2へのアップデートと、4.4.2から4.4.3へのアップ
443 デートである。 439 デートを行った。
444 440
445 アップデートの際に何らかの問題が生じるのはCbConGCCリポジトリでの衝突フ 441 アップデートの際に何らかの問題が生じるのはCbConGCCリポジトリでの衝突フ
446 ァイルの修正だけである。4.4.3へのアップデートでは特になにも衝突するこ 442 ァイルの修正だけである。4.4.3へのアップデートでは特になにも衝突するこ
447 とはなかったが、4.4.2ではある関数の引数が変わっており、その修正に手作 443 とはなかったが、4.4.2ではある関数の引数が変わっており、その修正に手作
448 業を要した。しかし複雑な作業はこの衝突ファイルの修正だけに抑えられる。 444 業を要した。しかし複雑な作業はこの衝突ファイルの修正だけに抑えられる。