Mercurial > hg > Papers > 2010 > kent-master
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 業を要した。しかし複雑な作業はこの衝突ファイルの修正だけに抑えられる。 |