Mercurial > hg > Papers > 2008 > kent-sigos
comparison slide.tex @ 8:0cca1c3a062d
slide $B40@.(B?
author | kent |
---|---|
date | Wed, 23 Apr 2008 03:59:06 +0900 |
parents | f8cf4a3ac7a8 |
children | 5915da9d55db |
comparison
equal
deleted
inserted
replaced
7:f8cf4a3ac7a8 | 8:0cca1c3a062d |
---|---|
1 % File: slide.tex | 1 % File: slide.tex |
2 % Created: 月 4 21 08:00 PM 2008 J | 2 % Created: 月 4 21 08:00 PM 2008 J |
3 % Last Change: 月 4 21 08:00 PM 2008 J | 3 % Last Change: 月 4 22 17:18 PM 2008 J |
4 % | 4 % |
5 \documentclass[mathserif]{beamer} | 5 \documentclass[mathserif]{beamer} |
6 \usepackage{graphicx} | 6 \usepackage{graphicx} |
7 \usepackage{verbatim} | 7 \usepackage{verbatim} |
8 \usepackage{beamerthemesplit} | 8 %\usepackage{beamerthemesplit} |
9 %manual% open /usr/local/ptetex/share/texmf-dist/doc/latex/beamer/beameruserguide.pdf | 9 %manual% open /usr/local/ptetex/share/texmf-dist/doc/latex/beamer/beameruserguide.pdf |
10 | 10 |
11 \title{Continuation based CコンパイラのGCC-4.2による実装} | 11 \title[CbC on GCC]{Continuation based CコンパイラのGCC-4.2による実装} |
12 \author{与儀 健人} | 12 \author{与儀 健人 \and 河野真治} |
13 \institute[IE Ryukyu Univ]{琉球大学大学院理工学研究科情報工学専攻} | |
13 \date{\today} | 14 \date{\today} |
14 | 15 |
15 \usetheme{Boadilla} | 16 \usetheme{Boadilla} |
17 %\usetheme{default} | |
18 %\useoutertheme[subsection=false]{smoothbars} | |
19 %\useoutertheme{infolines} | |
20 \renewcommand{\kanjifamilydefault}{gt} | |
16 | 21 |
17 \begin{document} | 22 \begin{document} |
23 | |
24 \begin{frame} | |
25 \titlepage | |
26 \end{frame} | |
18 | 27 |
19 \section{背景} | 28 \section{背景} |
20 \begin{frame} | 29 \begin{frame} |
21 \frametitle{研究背景} | 30 \frametitle{研究背景} |
22 \begin{itemize} | 31 \begin{itemize} |
23 \item Continuation based C (CbC) | 32 \item Continuation based C (CbC) |
24 \item Micro-CによるCbCコンパイラの実装 | 33 \item Micro-CによるCbCコンパイラの実装 |
25 \item 以前の論文により、GCCでコンパイラを実装する方法が示された | 34 \item GCCでCbCコンパイラを実装する方法が分かっている |
26 \end{itemize} | 35 \end{itemize} |
27 \end{frame} | 36 \end{frame} |
28 \begin{comment} | 37 \begin{comment} |
29 私たちの研究室ではCbCという言語を提案しています。 | 38 私たちの研究室ではCbCという言語を提案しています。 |
30 CbCはCから関数の概念を取り払って、代わりに継続という概念を追加したもので、.. | 39 CbCはCから関数の概念を取り払って、 |
40 代わりにコードセグメントという処理単位を追加したものです。詳しくは | |
31 | 41 |
32 CbCはこれまでMicro-Cというコンパイラを本研究室で独自に改良したもの | 42 CbCはこれまでMicro-Cというコンパイラを本研究室で独自に改良したもの |
33 つかってコンパイルしていました。 | 43 つかってコンパイルしていました。 |
34 このMicro-CによるコンパイラもGCCとくらべて遜色ないほど、良いコードをはくのですが\ldots | 44 このMicro-CもGCCとくらべて遜色ないほど、良いコードをはくのですが |
35 細かな最適化などを比べると及ばない。 | 45 はやり、UNIXの標準的なコンパイラであるGCCでコンパイルしたい |
36 対応アーキテクチャ | 46 |
37 | 47 また、以前の論文によりTail callを使ったGCCへの実装方法がしめされた。 |
38 そこでGCCに移植する | 48 そこで、本研究ではCbCのGCCへの実装を行いましたので、 |
39 以前の論文によりGCCへの実装方法がしめされた。 | 49 その評価と合わせて報告したいと思います |
40 そこで、本研究ではGCCへの実装を行いました。 | |
41 \end{comment} | 50 \end{comment} |
42 | 51 |
43 | 52 |
44 \section{CbC} | 53 \section{CbC} |
45 \begin{frame} | 54 \begin{frame} |
46 \frametitle{Continuation based Cについて} | 55 \frametitle{Continuation based Cについて} |
47 \begin{itemize} | 56 \begin{exampleblock}{What is it?} |
48 \item | 57 \begin{itemize} |
49 \end{itemize} | 58 \item 琉球大学 並列信頼研究室で開発 |
50 \end{frame} | 59 \item 構文はC言語とほぼ同じ |
60 \item 関数の除去、コードセグメントの追加 | |
61 \item コードセグメントを繋ぐ``継続''を導入 | |
62 \end{itemize} | |
63 \end{exampleblock} | |
64 \end{frame} | |
65 \begin{comment} | |
66 まずは、本研究室が提案しているCbCについて少し説明します | |
67 構文はC言語とほぼ同じです | |
68 ただし Cから関数や、while,forなどのloopを除去し | |
69 code segmentという処理の単位を追加しています | |
70 また、code segmentどうしの移動(これを継続と呼びます) | |
71 をgotoを使って表します | |
72 ...聴いても分かりにくいと思うので、コード例をみましょう | |
73 \end{comment} | |
51 | 74 |
52 \begin{frame}[fragile] | 75 \begin{frame}[fragile] |
53 \frametitle{CbCコード例} | 76 \frametitle{CbCコード例} |
54 \begin{columns} | 77 \begin{columns} |
55 \column{.4\textwidth} | 78 \column{.4\textwidth} |
75 \column{.3\textwidth} | 98 \column{.3\textwidth} |
76 \flushright | 99 \flushright |
77 \includegraphics[width=\textwidth]{figures/CbC-loop.eps} | 100 \includegraphics[width=\textwidth]{figures/CbC-loop.eps} |
78 \end{columns} | 101 \end{columns} |
79 \end{frame} | 102 \end{frame} |
103 \begin{comment} | |
104 見にくい? | |
105 これはCのwhile文をcode segmentにしたものです | |
106 みての通り、_ _codeという関数の様なものが三つあります | |
107 この一つずつがコードセグメントです | |
108 最初に while_condが実行されます これは条件判定ですね | |
109 .. . | |
110 簡単でしたが、少し分かっていただけたでしょうか? | |
111 \end{comment} | |
80 | 112 |
81 \begin{frame}[fragile] | 113 \begin{frame}[fragile] |
82 \frametitle{実装に必要な構文} | 114 \frametitle{実装に必要な構文} |
83 \begin{itemize} | 115 \begin{itemize} |
84 \large | 116 \large |
85 \item コードセグメント宣言 \hfill\verb|__ code cs(int a, char *b)| | 117 \item \verb|__code cs(int a, char *b)| |
86 \item 継続 \hfill\verb|goto cs(10, "abc");| | 118 \item \verb|goto cs(10, "abc");| |
87 \end{itemize} | 119 \end{itemize} |
88 \end{frame} | 120 \end{frame} |
121 \begin{comment} | |
122 実装に必要な構文を説明します | |
123 まずはcode segmentの定義です コード例にもあったように、 | |
124 コードセグメントの定義や宣言、コードセグメントポインタの宣言などをこの構文で行えます | |
125 つぎにgoto. | |
126 この二つを実装することでCbCを動作させることができます | |
127 \end{comment} | |
89 | 128 |
90 \section{GCC} | 129 \section{GCC} |
91 \begin{frame} | 130 \begin{frame} |
92 \frametitle{GNU Compiler Collection} | 131 \frametitle{GNU Compiler Collection} |
93 \begin{itemize} | 132 \begin{itemize} |
96 \item i386, PowerPC, MIPS, SPARC .. | 135 \item i386, PowerPC, MIPS, SPARC .. |
97 \item 強力な最適化機構 | 136 \item 強力な最適化機構 |
98 \item コンパイルだけでなくas, ldなどの統合環境 | 137 \item コンパイルだけでなくas, ldなどの統合環境 |
99 \end{itemize} | 138 \end{itemize} |
100 \end{frame} | 139 \end{frame} |
140 \begin{comment} | |
141 GNU Compiler Collection | |
142 .. . ですが、皆さん良くご存知だと思いますので、 | |
143 ここではGCCの内部構造について簡単に説明します | |
144 \end{comment} | |
101 | 145 |
102 \begin{frame} | 146 \begin{frame} |
103 \frametitle{GCCコンパイルパス} | 147 \frametitle{GCCコンパイルパス} |
104 \begin{columns} | 148 \begin{columns} |
105 \column{.5\textwidth} | 149 \column{.5\textwidth} |
111 \item[RTL] 中間コード | 155 \item[RTL] 中間コード |
112 \end{description} | 156 \end{description} |
113 \end{columns} | 157 \end{columns} |
114 \end{frame} | 158 \end{frame} |
115 \begin{comment} | 159 \begin{comment} |
160 図は GCCがどのようにコンパイルを進めるかを表したものです | |
116 パーサによってGenericに変換 | 161 パーサによってGenericに変換 |
117 一般的にいう構文木、言語の構造をそのままツリーにしている | 162 一般的にいう構文木、言語の構造をそのままツリーにしている |
118 | 163 |
119 Static Single Assignment であるGIMPLEに変換 | 164 次にGEnericはGimplifyというpassによってGIMPLEに変換されます |
120 ここで、ほとんど言語の違いがなくなる | 165 Static Single Assignment |
166 データ構造自体はGenericとかわりまりませんが、いろいろ制約が加わります | |
121 | 167 |
122 RTLに変換 | 168 RTLに変換 |
123 アーキテクチャに依存しないアセンブラ | 169 アーキテクチャに依存しないアセンブラ |
124 | 170 |
125 実装の際にはParserにのみ変更を加えることで、アーキテクチャへの依存がなくなる | 171 * 実装の際にはParserにのみ変更を加えることで、アーキテクチャへの依存がなくなる |
172 今回の実装でどの部分を変更したのか | |
173 コードセグメントや継続のパースのためにParserを修正 | |
174 それらの構文を表すGeneric Treeを作る | |
175 そのTreeをRTLに変換するRTLGenerator を修正 | |
176 | |
177 そこで、Tailcalleliminationについて説明します | |
126 \end{comment} | 178 \end{comment} |
127 | 179 |
128 | 180 |
129 \section{Tail call} | 181 \section{Tail call} |
130 \begin{frame} | 182 \begin{frame} |
131 \frametitle{Tail call elimination} | 183 \frametitle{Tail call elimination} |
132 \includegraphics[width=.9\textwidth]{figures/GCC-TailCall.eps} | 184 \includegraphics[width=.9\textwidth]{figures/GCC-TailCall.eps} |
133 \end{frame} | 185 \end{frame} |
186 \begin{comment} | |
187 このTail call EliminationはGCCの最適化の一つで、 | |
188 「関数の最後に別の関数を呼び出してる場合は、 | |
189 callじゃなくてjmpでいいじゃないか」 | |
190 というアイデアをもとに設計されてます | |
191 | |
192 図を見ていただくと分かるとおり、ここでは関数main, A, B | |
193 を定義しています | |
194 そして関数Aでは最後に関数Bを呼び出しています | |
195 この場合、mainからAをよび、AからBをよび、 | |
196 Bが終わるとAに戻り、すぐにret命令でmainにもどるという処理になります | |
197 | |
198 ですが、明らかにAに戻るのは無駄でしょう | |
199 この無駄はAからBを呼ぶ際にcallでなくjmpを使うことで回避できます | |
200 これが単純なTail callの例です | |
201 | |
202 ですが、たった1命令で最適化と言えるのか? | |
203 \end{comment} | |
134 | 204 |
135 \begin{frame}[fragile] | 205 \begin{frame}[fragile] |
136 \begin{columns}[t] | 206 \begin{columns}[t] |
137 \column{.5\textwidth} | 207 \column{.5\textwidth} |
138 \begin{verbatim} | 208 \begin{verbatim} |
170 \item 関数コールがreturnの直前にある | 240 \item 関数コールがreturnの直前にある |
171 \item 関数の返す型がcallerとcalleeで一致している | 241 \item 関数の返す型がcallerとcalleeで一致している |
172 \item caller側の引数サイズがcallee側の引数サイズより大きいもしくは等しい | 242 \item caller側の引数サイズがcallee側の引数サイズより大きいもしくは等しい |
173 \item 書き込んだ引数が、その後書き込む引数を上書きしてはならない | 243 \item 書き込んだ引数が、その後書き込む引数を上書きしてはならない |
174 \end{enumerate} | 244 \end{enumerate} |
175 \end{frame} | 245 \center |
176 | 246 \visible<2>{引数をすべて固定数とすることで対応} |
177 \begin{frame} | |
178 \includegraphics[width=.9\textwidth]{figures/stack-tailcall.eps} | |
179 \end{frame} | 247 \end{frame} |
180 | 248 |
181 \section{実装} | 249 \section{実装} |
182 \begin{frame} | 250 \begin{frame} |
183 \frametitle{実装} | 251 \frametitle{実装} |
184 \begin{itemize} | 252 \begin{itemize} |
185 \item \_\_code トークンの追加 | 253 \item \_\_code トークンの追加 |
186 \item code segmentのパース | 254 \item code segmentのパース \hfill Parser \hspace{5em} |
187 \item gotoのパース | 255 \item gotoのパース \hfill Parser \hspace{5em} |
188 \item \alert<2>{tree/RTL変換 (expand\_call)} | 256 \item code segment/goto を表すGeneric Tree |
257 \item \alert<2>{tree/RTL変換 (expand\_call)} \hfill RTL Generator \hspace{5em} | |
189 \item その他(エラー検出など) | 258 \item その他(エラー検出など) |
190 \end{itemize} | 259 \end{itemize} |
191 \end{frame} | 260 \end{frame} |
261 \begin{comment} | |
262 トークン | |
263 パーサ recursive Decent | |
264 expand_call | |
265 expand_cbc_goto | |
266 \end{comment} | |
192 | 267 |
193 \begin{frame} | 268 \begin{frame} |
194 \frametitle{expand\_call} | 269 \frametitle{expand\_call} |
195 \begin{itemize} | 270 \begin{exampleblock}{What is the function?} |
196 \item 関数呼び出しのtreeからRTLへ変換する | 271 \begin{itemize} |
197 \item Tail callが可能ならその最適化を行う | 272 \item 関数呼び出しのtreeからRTLへ変換する |
198 \item この関数のみで1200行もある | 273 \item Tail callが可能ならその最適化を行う |
199 \item そのほとんどがTail call可否の判定 | 274 \item この関数のみで1200行もある |
200 \item そして読みづらい | 275 \item そのほとんどがTail call可否の判定 |
201 \end{itemize} | 276 \item そして読みづらい |
277 \end{itemize} | |
278 \end{exampleblock} | |
202 \end{frame} | 279 \end{frame} |
203 | 280 |
204 \begin{frame} | 281 \begin{frame} |
205 \frametitle{expand\_cbc\_goto} | 282 \frametitle{expand\_cbc\_goto} |
206 \begin{itemize} | 283 \begin{exampleblock}{What is it doing?} |
207 \item code segmentへのgotoを表したtreeを受け取る | 284 \begin{itemize} |
208 \item 確実にTail callでcode segmentにgoto | 285 \item code segmentへのgotoを表したtreeをRTLに変換 |
209 \item 無駄なTail call可否判定を削除 | 286 \item 無駄なTail call可否判定を削除 |
210 \end{itemize} | 287 \item Tail callの条件を強制 |
288 \item 確実にTail callを適用 | |
289 \item 500行程度 | |
290 \end{itemize} | |
291 \end{exampleblock} | |
211 \end{frame} | 292 \end{frame} |
212 | 293 |
213 | 294 |
214 \section{評価} | 295 \section{評価} |
215 \begin{frame}[fragile] | 296 \begin{frame}[fragile] |
232 \item[+fastcall] \verb|__attribute__ ((fastcall))|を付加 | 313 \item[+fastcall] \verb|__attribute__ ((fastcall))|を付加 |
233 \end{description} | 314 \end{description} |
234 \end{frame} | 315 \end{frame} |
235 | 316 |
236 \begin{frame} | 317 \begin{frame} |
318 \frametitle{考察} | |
319 \end{frame} | |
320 | |
321 \begin{frame} | |
237 \frametitle{まとめ} | 322 \frametitle{まとめ} |
238 \begin{itemize} | 323 \begin{block}{まとめ} |
239 \item GCCにCbCコンパイラを実装 | 324 \begin{itemize} |
240 \item そのベンチマーク | 325 \item GCCにCbCコンパイラを実装 |
241 \end{itemize} | 326 \item そのベンチマーク |
242 | 327 \item 性能向上を確認 |
243 | 328 \end{itemize} |
244 \begin{itemize} | 329 \end{block} |
245 \item environment | 330 |
246 \item PPCのRTL変換不能 | 331 \begin{block}{TO DO} |
247 \item オプションの強制 | 332 \begin{itemize} |
248 \item SPU対応とGCCのversion | 333 \item environment |
249 \end{itemize} | 334 \item PPCのRTL変換不能 |
335 \item オプションの強制 | |
336 \item SPU対応とGCCのversion | |
337 \end{itemize} | |
338 \end{block} | |
339 \end{frame} | |
340 | |
341 \appendix | |
342 \begin{frame} | |
343 \includegraphics[width=.9\textwidth]{figures/stack-tailcall.eps} | |
250 \end{frame} | 344 \end{frame} |
251 | 345 |
252 \end{document} | 346 \end{document} |
253 | 347 |
254 | 348 |