annotate evaluations.tex @ 1:aa09c34b90d3

add quicksort_for_pcc add sources, figures.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Mon, 01 Feb 2010 20:37:36 +0900
parents e9ecd5b5f29a
children 50e23a4b2f40
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \chapter{評価}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 \label{chp:eval}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 本章では本研究の評価を行う。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 まず、gccでのCbCコンパイルにおける利点と欠点を考察する。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 次にgccベースのCbCコンパイラの性能評価を行う。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 最後に、\ref{chp:task}章のTaskManagerの開発を元に、CbC言語そのものの記述性、プログラミング手法などについて考察する。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
10
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 \section{gccでを使うことの利点・欠点}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 \label{sec:merit}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 これまでCbCのコンパイルに使用してきたmc(micro-c)に対し、新しくgccが使
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 用可能となった。ここでgccを用いることの利点と欠点について考察する。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 \subsection*{アーキテクチャ}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 mcにおいてはPPC,x86,MIPS,ARM,SPUなど、多数のCPUアーキテクチャをサポー
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 トしてきた。しかしあるCPUに新しく対応するには多大な時間、労力が必要と
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 なる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 gccは現在、既に20を越えるCPUに対応しており、またOS毎のABIの差異も吸収
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 可能である。これはgccをコンパイラとすることに最大の利点である。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 またそれだけでなく、gccは新しいアーキテクチャへの対応も早い。この特徴
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 は、gccがフロントエンドとバックエンドという形で言語実装とアーキテクチ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 ャを分離していることからくる。一般的に新しいCPUアーキテクチャが開発さ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 れた場合にはその開発者自身がgccにコミットすることが多いため、組み込み
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 用途を目的の一つとするCbCではよりその強みがます。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 \subsection*{最適化の恩恵}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 gccは豊富な最適化機構を備えている。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 代表的な最適化だけでもループ最適化、分岐スレッディング(jump threading)
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 、共通式除去(common subexpression elimination)、命令スケジューリング
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 (instruction scheduling)などがある。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 とくに、プログラムにおいては類似した形の式(expression)を扱うことがよく
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 あるため、共通式除去は非常に効果が高い。同様の効果は同じ式を保持する変
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 数を用意することでも実現できるがソースコードの修正が必要になる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 mcにはこの最適化は含まれていないため、複雑な計算式を含むプログラムにお
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 いてはgccの方が良いコンパイル結果を示すものと考えられる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 %\ref{sec:}の性能評価では最適化の効果についても測定する。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 \subsection*{デバッガ}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 これまでCbCにはデバッガが存在しなかった。デバッガの実装には出力するア
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 センブラに行番号や変数名、関数名などの情報を付加する必要があるが、gcc
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 は標準でこれを行っている。そのためCのデバッガとして広く一般的に使われ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 ている gdbをそのままCbCのデバッガとして使用することが可能であり、ソフ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 トウェア開発の大きな助力となる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 %ただし継続制御では``next''コマンドが使いづらいなどの操作性の問題がいく
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 %つか確認している。これらは
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 %
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 \subsection*{関数呼出しの名残り}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 上記の利点に対し、gccであるゆえの欠点も存在する。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 本研究による軽量継続制御の実装には\ref{chp:impl}章で説明したように関数
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 の末尾最適化を利用した。それゆえコードセグメントのアセンブラ出力の命令
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 列には一部関数呼び出し時のスタック処理が残ってしまうことが分かっている。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 特にレジスタの少ないアーキテクチャ、x86などではそれが顕著に現れる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 mcではコードセグメントと関数は完全に別物として取り扱っており、この様な
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 スタック操作はコードセグメントには現れないため、このオーバヘッドがgcc
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 では不利な点である。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 % スタック処理が残ってしまう
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 % 同じくcpuに特化したコンパイルに比べると
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 \subsection*{互換性、ABI}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 %これは最後の考察に入れよう
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 ソースコードレベルでの互換性の問題がある。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 また、継続制御のパラメタを
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 % 関数宣言
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 % 型推定
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 % ABI、特にppc
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 % 最適化
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 % SPUでのベクトル演算
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 % gdb
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 % architecture
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 % 関数呼び出しのオーバヘッド
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 % 互換性,ソースコード、ABI
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
90
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
91
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
92
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 \section{性能評価}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 \subsection{評価手法と環境}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 性能評価として、実際にコンパイラの出力した実行ファイルを複数回実行し、
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 その実効速度の平均を測定する。 CbCは実用的なプログラムの記述を目的とし
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 ているので、プログラムの動作速度は性能評価として妥当だと考えられる。ま
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 た速度比較の対象として、もう一つのCbCコンパイラ実装であるmicro-cベース
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 のコンパイラ(以下mc)を用いる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 実行するプログラムとして、クイックソートのテストプログラムを作成した。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 クイックソートは再帰呼び出しを伴うため、スタック操作が必須となる。その
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 ためより多く様々なコードセグメントへの継続制御が使用されることになり、
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 CbCの性能評価に適していると考えられる。クイックソートはCbCに先立ってC
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 で実装し、参考文献\cite{bib:kinjo}で紹介する手法を用いてCbCに変換した。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 測定環境は両コンパイラが対応しているアーキテクチャ、OSから以下の5つ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 の組み合わせ[CPUアーキテクチャ/OS種別]を選択した。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 \begin{itemize}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 \item ppc/OS X
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 \item ppc/linux
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 \item ppc/linux on PS3
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 \item x86/OS X
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 \item x86/linux
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 \end{itemize}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 なお、mcはmips,armにも対応しているが、現在その処理系が用意できなかった
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 ので割愛した。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 %gccのコンパイルでは``-O2 -fomit-pointer''の最適化を付加して測定している。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 % noreturnもON.
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 % x86ではfastcallもON,
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 \subsection{評価結果}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 実効速度の測定結果を表\ref{tab:eval}に示す。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 ただし環境毎にCPUの速度は異なるので、上下の比較には意味はない。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 \begin{table}[htpb]
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 \centering
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 \begin{tabular}{|c|c|c|c|} \hline
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 \multirow{2}{*}{ \backslashbox{CPU/OS}{コンパイラ} }
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 & \multicolumn{2}{c|}{gcc} & \multirow{2}{*}{mc} \\ \cline{2-3}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 & 最適化なし & 最適化あり & \\ \hline
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 x86/OS X & 5.901 & 2.213 & 2.857 \\ \hline
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 x86/Linux & 5.869 & 2.401 & 2.254 \\ \hline
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 ppc/OS X &14.875 & 2.146 & 4.811 \\ \hline
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 ppc/Linux &19.722 & 3.927 & 6.596 \\ \hline
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 ppc/PS3 &26.169 & 6.104 &11.536 \\ \hline
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 \end{tabular}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 \caption{アーキテクチャ毎のgccとmcの速度比較(単位: 秒)}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 \label{tab:eval}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 \end{table}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 % ppcのが圧倒的に早い
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 % x86ではあまりさはでない
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 % 最適化が効いている
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 まずどのアーキテクチャにおいてもgccの最適化の効果が大きいことが分かる
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 。 x86では約2.5倍、ppcでは4~7倍もの差が生じている。ppcの方で異様に効果
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 が高いように見えるのは、関数やコードセグメントの引数渡しがレジスタベー
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 スのため、最適化なしの場合には無駄なメモリアクセスが生じているためであ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 る。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 x86はOS XとLinuxの環境で測定を行った。OS Xではmcに比べて20\%ほど早くな
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 ったことが分かる。しかし逆にLinux環境では6\%の速度低下が示された。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 どちらにおいてもppcほどの良い結果ではない。これは自由に使えるレジスタ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 が極めて少ないというx86の特殊なアーキテクチャが要因だと考えられる。そ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 のためにgccの最適化が十分に働かなかった可能性がある。逆に言うとmcが高
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 いレベルでx86のアセンブラ命令を実行しているともとれる。この6\%の差は実
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 用レベルでは問題なく、プログラムの構成によっては結果は逆転する事も十分
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 にある。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 ppcではどのオペレーティングシステムでもmcに比べてgccが早いことが分かる
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 。いずれも約2倍近くあるいはそれ以上に速度が向上している。これはgccの最
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 適化機構が十分に働いている要因が大きい。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 %\subsubsection{アセンブラ比較}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 比較のため、quicksortプログラムで使われているコードセグメントを一つ例
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 にあげる。 CbCのソースがコード\ref{code:divider_s}、そのコードセグメン
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 トのgccによる出力がコード\ref{code:divider_s_gcc}、mcによる出力がコー
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 ド \ref{code:divider_s_mc} である。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 \lstinputlisting[
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 caption=quicksortプログラムで使われているコードセグメント,
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 label=code:divider_s]
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 {sources/quicksort_divider_s.cbc}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 \begin{minipage}[t]{.45\textwidth}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 \lstinputlisting[
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 caption=divider\_sのgccによる出力(PowerPC),
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 label=code:divider_s_gcc]
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 {sources/gcc_divider_s.asm}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 \end{minipage}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 \hfill
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 \begin{minipage}[t]{.45\textwidth}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 \lstinputlisting[
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 caption=divider\_sのmcによる出力(PowerPC),
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 label=code:divider_s_mc]
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 {sources/mc_divider_s.asm}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 \end{minipage}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 もっとも比較しやすい箇所は\verb|s+1|の処理である。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 コード\ref{code:divider_s_gcc}のgccではこれを1命令の\verb|addi 4,4,1|
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 で行っている。 mcではこれが\verb|mr, addi, mr|という3命令になっている
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 。これは変数\verb|s|の値を一度別のレジスタに移して計算するという処理で
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 ある。この様な細かい命令の展開が速度に差が出る要因である。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 またこの出力からも、x86での速度差が少ないことが頷ける。引数のほとんど
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 をメモリに格納するx86では計算には一度レジスタに格納しないといけない事
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 から、結局3 命令になる。そのためgccの最適化が十分には働かないのである。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 実際x86でのdivider\_sのアセンブラ出力はgccでは 24命令、mcでは18命令と
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 となっている。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 この結果より、CbCで記述されたプログラムではレジスタが多い方が実効速度
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 の面で有利であるということが分る。これは他のコンパイラ言語でも同じ事が
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 言えるが、前の(手続きやメソッドにおける)環境を保持する必要がないCbCでは
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 その影響がより強い。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 %レジスタの数は
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 %まずどのアーキテクチャにおいても、gccを使った場合は最適化の有無で大きな差が出ていることが分かる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 %ppc/OS Xでは倍以上の速度を示すことができた。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 %これはgccの最適化機構が十分に働いている要因が大きい。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 %特に構造体のポインタからそのメンバにアクセスする処理(Cにおけるアロー演算子である)では違いがでた。ppcではその処理のために
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 %特に共通部分式除去(Common Subexpression Elimination)の処理はmcにはなく、この例題では多数その処理が適用可能な部分が出てきているためその影響があるものと思われる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 %x86/OS Xでは約23\%ほど高速化された。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 %x86/OS Xでは約23\%、 ppc/OS Xでは最適化ありのgccはmcと比べて倍以上の速度を示すことができた。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 %しかしx86/Linuxでは逆に6\%ほど速度が低下している事が分かる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 %この主な原因は関数呼出し時のスタック操作である。今回\ref{chp:impl}章で説明したように、継続制御の実装には末尾最適化を応用する形をとった。そのためgccとしては関数として処理しているので、一部のスタック操作(x86なら\verb|pop, push|である)が残ってしまうことが分かっている。元から継続制御用に設計されたmcではそれが存在しないため、その分の処理が速度としてに現れたものと思われる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 %レジスタの多いアーキテクチャであるほど、速度は改善されると考えられる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 %その中でPowerPC(ppc)での最適化ありとなしの差が非常に大きい。これはppcアセンブラの特徴であるレジスタの多さが原因の一つである。ppcの関数呼出し規約ではほとんどの引数はレジスタにのせて呼出し先に渡すことができる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 %しかし呼出し先でさらに別の関数を呼び出す場合はそのレジスタを置き換えるため、スタックに積むなど値を保存しなければならない。この処理を最適に行うには呼び出し後の使用する変数、保持すべき変数を考慮する必要があるため、単純に全てをスタックに積む事とは違う処理が必要になる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 \section{CbCでのプログラム}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
230 \section{本研究における成果}
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
231 本研究では、これまでバグが多くプログラムの動作に問題のあった
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
232 GCCベースのCbCコンパイラを、実用的なプログラムが動くレベルまで改善する
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
233 ことができた。
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
234
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
235
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
236 \section{以前のバージョンとの速度比較}