Mercurial > hg > Papers > 2012 > nobu-thesis
annotate paper/resume.tex @ 19:669655c106eb draft
commit
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 25 Feb 2012 00:00:36 +0900 |
parents | d276144b815c |
children | f037b5a7d5f9 |
rev | line source |
---|---|
4 | 1 \documentclass[twocolumn,twoside,9.5pt]{jarticle} |
2 %\usepackage[dvips]{graphicx} | |
3 \usepackage[dvipdfm]{graphicx} | |
4 \usepackage{picins} | |
5 \usepackage{fancyhdr} | |
6 \usepackage{listings} | |
7 \usepackage{url} | |
8 | |
9 \lhead{\parpic{\includegraphics[height=1zw,clip,keepaspectratio]{figure/emblem-bitmap.eps}}琉球大学主催 工学部情報工学科 卒業研究発表会} | |
10 \rhead{} | |
11 \cfoot{} | |
12 | |
13 \setlength{\topmargin}{-1in \addtolength{\topmargin}{15mm}} | |
14 \setlength{\headheight}{0mm} | |
15 \setlength{\headsep}{5mm} | |
16 \setlength{\oddsidemargin}{-1in \addtolength{\oddsidemargin}{11mm}} | |
17 \setlength{\evensidemargin}{-1in \addtolength{\evensidemargin}{21mm}} | |
18 \setlength{\textwidth}{181mm} | |
19 \setlength{\textheight}{261mm} | |
20 \setlength{\footskip}{0mm} | |
21 \pagestyle{empty} | |
22 | |
23 \begin{document} | |
24 \title{Continuation based C コンパイラのGCC-4.6における実装} | |
25 \author{学籍番号:085711E 氏名:大城信康 {}{} 指導教員 : 河野真治} | |
26 %\date{H23 11/18 fri} | |
27 %\date{平成23 年11 月18 日} | |
28 \maketitle | |
29 \thispagestyle{fancy} | |
30 | |
13 | 31 \section{はじめに} |
6
b6584cc0f737
modify resume.tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
4
diff
changeset
|
32 当研究室ではプログラムをコードセグメント (Code Segment) 単位で記述するプログラミング言語 Continuation based C (以下 CbC) を提案している. |
13 | 33 %コードセグメントは並列実行の単位として使うことができ, プログラムの正しさを示す単位としても使用することができる.これにより, |
34 % Many Core での並列実行を高い性能と高い信頼性で実現することができると考えている. | |
35 コードセグメントは C の関数よりも細かな単位で, 状態を表すことができる. | |
18 | 36 その為 CbC では状態遷移記述を行うことができ, 状態探索といったモデル検査等に使えると考えている. |
4 | 37 |
13 | 38 %GCC をベースとした CbC のコンパイラ (以下 CbC-GCC)は, GCC のアップデートに合わせて変更する必要がある. |
39 %当研究室には 2008 年に開発されて以来アップデートがGCC-4.5 をベースとした CbC コンパイラがある. | |
15
6a667be77762
modify Makefile
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
14
diff
changeset
|
40 CbC のコンパイラとしては Micro-C 版と GCC ベースのコンパイラ(以下 CbC-GCC) が開発されている. |
6a667be77762
modify Makefile
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
14
diff
changeset
|
41 しかし, CbC-GCC はいくつかバグがあり機能の修正の余地があった. |
13 | 42 また, GCC の最新の機能を使用する為にも CbC-GCC は GCC のアップデートに合わせていく必要がある. |
17 | 43 本研究では, GCC-4.5 をベースとしていた CbC-GCC を GCC-4.6 へのアップデートをすると共に実装の修正 |
18 | 44 を行った. |
13 | 45 %本研究では, GCC-4.5 をベースとしていた CbC-GCC を GCC-4.6 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う. |
4 | 46 |
47 \section{Continuation basede C (CbC)} | |
19 | 48 CbC のプログラムはコードセグメント毎に記述され, コード間をgoto(軽量継続)により処理を移る. |
49 構文は C と同じであるが, ループ制御や関数コールが取り除かれる. | |
50 | |
51 \subsection{コードセグメント} | |
52 コードセグメントの記述は C の関数の構文と同じで, 型に``\_\_code'' を使うことで宣言できる. | |
53 コードセグメントへの移動は``goto'' の後にコードセグメント名と引数を並べて記述することで行える. | |
4 | 54 図\ref{fig:cs}はコードセグメント間の処理の流れを表している. |
55 | |
56 \begin{figure}[htpb] | |
57 \begin{center} | |
58 \scalebox{0.35}{\includegraphics{figure/codesegment.pdf}} | |
59 \end{center} | |
60 \caption{コードセグメント間の継続(goto)} | |
61 \label{fig:cs} | |
62 \end{figure} | |
63 | |
19 | 64 \subsection{軽量継続(light-weight continuation)} |
65 コードセグメントは C の関数と違って返り値を持たず, 処理が終われば次のコードセグメントへと処理を移る. | |
66 C において関数呼び出しを繰り返し行う場合, 呼び出された関数の引数の数だけスタックに値が積まれていく. | |
67 だが, 返り値を持たないコードセグメントではスタックに値を積んでいく必要な無く, スタックは変更されない. | |
68 | |
69 %軽量継続により並列化, ループ制御, 関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようになる. | |
70 | |
4 | 71 |
72 \section{GCC-4.6 への実装} | |
17 | 73 CbC の継続は, 環境を保持しない為軽量継続と呼ばれる. |
74 GCC における軽量継続は Tail Call Ellimination (末尾除去)を強制することで実装されている. | |
10 | 75 これにより, コードセグメント間の移動を, call ではなく jmp 命令で行う. |
12 | 76 この為コードセグメントからのは戻値は無くなる. |
4 | 77 図\ref{fig:continue}は Tail Call Elimination によるプログラムの処理の流れを表す. |
78 \begin{figure}[htpb] | |
79 \begin{center} | |
80 \scalebox{0.30}{\includegraphics{figure/continuation.pdf}} | |
81 \end{center} | |
82 \caption{Tail Call Elimination の例} | |
83 \label{fig:continue} | |
84 \end{figure} | |
85 | |
16 | 86 \subsection{Tail Call Elimination の強制付与} |
87 関数が Tail Call Elimination にかかる為には, ``呼び出し先関数と呼び出し元関数の型が一致している'' | |
10 | 88 等といった幾つかの条件をクリアしなければならない. |
9
942888c0f8aa
modify explanation of tailcall elimination
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
89 これまでの実装ではコードセグメントに条件をクリアさせる為, 専用の関数を用意していた. |
12 | 90 しかし今回の実装ではその関数を廃止し, 末尾除去にかかるフラグを落とさせない |
17 | 91 コードを追加することで Tail Call Elimination の条件をかわすようになった. |
9
942888c0f8aa
modify explanation of tailcall elimination
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
92 これにより GCC のアップデート時に伴う専用関数の修正が不要となり, 楽な管理が行えるようになった. |
4 | 93 |
94 | |
95 \section{評価} | |
19 | 96 今回実装を行った CbC-GCC-4.6 と CbC-GCC-4.5 でベンチマークを行った. |
10 | 97 プログラムは Micro-C のベンチマークにも使用されるものである. |
19 | 98 このプログラムは演算と継続を交互に行う処理をループの回数分繰り返すというものである. |
99 引数 1 は自作のスタックを作り, そこに継続先のコードセグメント(以下 cs)と値を確保して | |
100 渡していくプログラムである. | |
101 引数 2 は Micro-C 用に手動で最適化を行ったプログラムである. | |
102 引数 3 は C で書かれたプログラムをただ CbC へと変換したプログラムになる. | |
16 | 103 また評価は \verb+x86_64+ 上の Linux で行った. |
12 | 104 |
4 | 105 \begin{figure}[htpb] |
106 \begin{center} | |
16 | 107 \scalebox{0.33}{\includegraphics{figure/conv1_for_resume.pdf}} |
4 | 108 \end{center} |
16 | 109 \caption{各コンパイラにより生成されたコードの速度比較} |
12 | 110 \label{fig:conv1} |
4 | 111 \end{figure} |
112 | |
19 | 113 |
4 | 114 \subsection{評価の考察} |
12 | 115 手動で最適化を行なっている引数 2 と 3 の時は余り差は無い. |
19 | 116 寧ろわずかだが GCC-4.6 版の方が遅くなっている. |
117 しかし, 引数 1 の時は GCC-4.6 版 GCC-4.5 版より, 32 bit は 2.45 倍, 64 bit は 1.5 倍以上早いことが確認できる. | |
118 これは引数 2 と 3 の処理に比べて引数 1 の処理は最適化にかけにくいことが要因としてあげられる. | |
119 GCC-4.6 へとアップデートを行ったことで, より良い最適化にかかることができたと予想する. | |
120 | |
121 %この結果から GCC-4.5 に比べ GCC-4.6 の最適化が修正されよりよくなっているのが確認できた. | |
122 %アセンブラの比較も行なってみると, GCC-4.6 版の方では演算の結果が求められていて | |
123 %必要最小限の継続だけを行なうプログラムとなっていた. | |
124 | |
125 \subsection{アセンブラコードの比較の結果} | |
126 では具体的にはどのようなより良い最適化になっているのかを調べてみる. | |
127 結果に差の出た引数 1 の時のアセンブラコードを比較した. | |
128 まず, プログラムの大まかな流れを図\ref{fig:conv1_arg0}に示す. | |
129 \begin{figure}[htpb] | |
130 \begin{center} | |
131 \scalebox{0.35}{\includegraphics{figure/conv1_arg0.pdf}} | |
132 \end{center} | |
133 \caption{conv1プログラムの挙動} | |
134 \label{fig:conv1_arg0} | |
135 \end{figure} | |
136 \newpage | |
137 四角は cs を, 矢印は継続を表している. | |
138 また, cs の中の処理は演算の部分は省いて継続に関する部分だけにしてある. | |
139 プログラムの処理は cs f から継続が始まり cs g\_h1 まで継続を行いループするという流れになる. | |
140 注意点としては, cs f\_g1, cs g\_h1 への継続は cs f\_g0, cs f\_g で自作のスタック(実態は構造体)に | |
141 関数ポインタを入れて置き継続している部分である. | |
142 | |
143 まず, CbC-GCC-4.5 のアセンブラをみてみると main 関数から``call f''により継続が行われていた. | |
144 cs f へと継続後は図\ref{fig:conv1_arg0}に示す通りの動作を行った. | |
145 | |
146 しかし, CbC-GCC-4.6 の方では main 関数からは``call g\_h1''から継続が行われ, loop check 後も | |
147 g\_h1 から継続されていた. | |
148 この処理を図\ref{fig:conv1_arg0_2}に示す. | |
149 \begin{figure}[htpb] | |
150 \begin{center} | |
151 \scalebox{0.35}{\includegraphics{figure/conv1_arg0_2.pdf}} | |
152 \end{center} | |
153 \caption{conv1プログラムの挙動( CbC-GCC-4.6 )} | |
154 \label{fig:conv1_arg0_2} | |
155 \end{figure} | |
156 | |
157 cs f から cs h まで継続の処理はインライン展開によりまとめて計算されて定数として出されていた. | |
158 cs g\_h1 と cs f\_g1 の処理がインライン展開されないのは, 関数ポインタとして扱っていた為だと思われる. | |
159 | |
160 %CbC-GCC-4.6 では cs g_h1 までの処理はインライン展開されてまとめて計算を行われていたのが確認できた. | |
4 | 161 |
162 \section{今後の課題} | |
163 今回, CbC コンパイラを GCC-4.6 へとアップデートを行った. | |
19 | 164 アップデートに伴い実装の修正と, 本稿では説明していないが``\verb+__rectype+'' や``selftype''と言った |
165 構文の追加も行えた. | |
166 また, GCC をアップデートしたことで、より協力な最適化がかかることも確認できた. | |
167 %アップデートに伴い実装の修正を行い, また CbC の記述に便利な新たな構文の追加も行うことができた. | |
4 | 168 |
169 GCC 版 CbC コンパイラは細かい実装の除けば, 以後 GCC のアップデートに合わせていくだけとなる. | |
17 | 170 CbC コンパイラの今後としては LLVM への実装, もしくは Google go 言語での実装の検討も行なっていく予定である. |
4 | 171 |
172 %今後は本稿で述べた CbC-GCC の問題点を改善していく必要がある. | |
173 %また,CbC を GCC だけでなく LLVM での実装や,C 言語以外の言語への変更も検討していく. | |
174 | |
175 \thispagestyle{fancy} | |
176 \begin{thebibliography}{3} | |
177 | |
178 \bibitem{1}{河野真治}: | |
179 ``継続を基本とした言語 CbC の gcc 上の実装''. 日本ソフトウェア科学会第 19 回大会論文集, Sep, 2002 | |
180 | |
181 \bibitem{2}{与儀健人,河野真治}: | |
182 ``Continuation based CコンパイラのGCC-4.2による実装''. 琉球大学 情報工学科 学位論文, 2008 | |
183 | |
184 \bibitem{3}{GNU Compiler Collection (GCC) Internals}: | |
185 ``http://gcc.gnu.org/onlinedocs/gccint/'' | |
186 | |
187 | |
188 \end{thebibliography} | |
189 \end{document} |