annotate evaluations.tex @ 5:dfb89e32eea1

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