Mercurial > hg > Papers > 2008 > kent-sigos
view slide.tex @ 9:5915da9d55db default tip
finish
author | kent |
---|---|
date | Wed, 23 Apr 2008 14:43:35 +0900 |
parents | 0cca1c3a062d |
children |
line wrap: on
line source
% File: slide.tex % Created: 月 4 21 08:00 PM 2008 J % Last Change: 月 4 22 17:18 PM 2008 J % \documentclass[mathserif]{beamer} \usepackage{graphicx} \usepackage{verbatim} %\usepackage{beamerthemesplit} %manual% open /usr/local/ptetex/share/texmf-dist/doc/latex/beamer/beameruserguide.pdf \title[CbC on GCC]{Continuation based CコンパイラのGCC-4.2による実装} \author{与儀 健人 \and 河野真治} \institute[IE Ryukyu Univ]{琉球大学大学院理工学研究科情報工学専攻} \date{\today} \usetheme{Boadilla} %\usetheme{default} %\useoutertheme[subsection=false]{smoothbars} %\useoutertheme{infolines} \renewcommand{\kanjifamilydefault}{gt} \begin{document} \begin{frame} \titlepage \end{frame} \section{背景} \begin{frame} \frametitle{研究背景} \begin{itemize} \item Continuation based C (CbC) \item Micro-CによるCbCコンパイラの実装 \item GCCでCbCコンパイラを実装する方法が分かっている \end{itemize} \end{frame} \begin{comment} 私たちの研究室ではCbCという言語を提案しています。 CbCはCから関数の概念を取り払って、 代わりにコードセグメントという処理単位を追加したものです。詳しくは CbCはこれまでMicro-Cというコンパイラを本研究室で独自に改良したもの つかってコンパイルしていました。 このMicro-CもGCCとくらべて遜色ないほど、良いコードをはくのですが はやり、UNIXの標準的なコンパイラであるGCCでコンパイルしたい また、以前の論文によりTail callを使ったGCCへの実装方法がしめされた。 そこで、本研究ではCbCのGCCへの実装を行いましたので、 その評価と合わせて報告したいと思います \end{comment} \section{CbC} \begin{frame} \frametitle{Continuation based Cについて} \begin{exampleblock}{What is it?} \begin{itemize} \item 琉球大学 並列信頼研究室で開発 \item 構文はC言語とほぼ同じ \item 関数の除去、コードセグメントの追加 \item コードセグメントを繋ぐ``継続''を導入 \end{itemize} \end{exampleblock} \end{frame} \begin{comment} まずは、本研究室が提案しているCbCについて少し説明します 構文はC言語とほぼ同じです ただし Cから関数や、while,forなどのloopを除去し code segmentという処理の単位を追加しています また、code segmentどうしの移動(これを継続と呼びます) をgotoを使って表します ...聴いても分かりにくいと思うので、コード例をみましょう \end{comment} \begin{frame}[fragile] \frametitle{CbCコード例} \begin{columns} \column{.4\textwidth} \flushleft \small \begin{verbatim} __code while_process(int total,int count){ total += count; count++; goto while_cond(total, count); } __code while_cond(int total, int count){ if ( count <= 100 ){ goto while_process(total, count); }else{ goto while_end(total); } } __code while_end(int total){ goto cs_exit(0); } \end{verbatim} \column{.1\textwidth} \column{.3\textwidth} \flushright \includegraphics[width=\textwidth]{figures/CbC-loop.eps} \end{columns} \end{frame} \begin{comment} 見にくい? これはCのwhile文をcode segmentにしたものです みての通り、_ _codeという関数の様なものが三つあります この一つずつがコードセグメントです 最初に while_condが実行されます これは条件判定ですね .. . 簡単でしたが、少し分かっていただけたでしょうか? \end{comment} \begin{frame}[fragile] \frametitle{実装に必要な構文} \begin{itemize} \large \item \verb|__code cs(int a, char *b)| \item \verb|goto cs(10, "abc");| \end{itemize} \end{frame} \begin{comment} 実装に必要な構文を説明します まずはcode segmentの定義です コード例にもあったように、 コードセグメントの定義や宣言、コードセグメントポインタの宣言などをこの構文で行えます つぎにgoto. この二つを実装することでCbCを動作させることができます \end{comment} \section{GCC} \begin{frame} \frametitle{GNU Compiler Collection} \begin{itemize} \item UNIXにおける標準的なコンパイラ \item C, C++, java, FORTRAN, Ada .. \item i386, PowerPC, MIPS, SPARC .. \item 強力な最適化機構 \item コンパイルだけでなくas, ldなどの統合環境 \end{itemize} \end{frame} \begin{comment} GNU Compiler Collection .. . ですが、皆さん良くご存知だと思いますので、 ここではGCCの内部構造について簡単に説明します \end{comment} \begin{frame} \frametitle{GCCコンパイルパス} \begin{columns} \column{.5\textwidth} \includegraphics[width=\textwidth]{figures/GCC-pass-slide.eps} \column{.4\textwidth} \begin{description} \item[Generic Tree] 構文木 \item[GIMPLE] SSA \item[RTL] 中間コード \end{description} \end{columns} \end{frame} \begin{comment} 図は GCCがどのようにコンパイルを進めるかを表したものです パーサによってGenericに変換 一般的にいう構文木、言語の構造をそのままツリーにしている 次にGEnericはGimplifyというpassによってGIMPLEに変換されます Static Single Assignment データ構造自体はGenericとかわりまりませんが、いろいろ制約が加わります RTLに変換 アーキテクチャに依存しないアセンブラ * 実装の際にはParserにのみ変更を加えることで、アーキテクチャへの依存がなくなる 今回の実装でどの部分を変更したのか コードセグメントや継続のパースのためにParserを修正 それらの構文を表すGeneric Treeを作る そのTreeをRTLに変換するRTLGenerator を修正 そこで、Tailcalleliminationについて説明します \end{comment} \section{Tail call} \begin{frame} \frametitle{Tail call elimination} \includegraphics[width=.9\textwidth]{figures/GCC-TailCall.eps} \end{frame} \begin{comment} このTail call EliminationはGCCの最適化の一つで、 「関数の最後に別の関数を呼び出してる場合は、 callじゃなくてjmpでいいじゃないか」 というアイデアをもとに設計されてます 図を見ていただくと分かるとおり、ここでは関数main, A, B を定義しています そして関数Aでは最後に関数Bを呼び出しています この場合、mainからAをよび、AからBをよび、 Bが終わるとAに戻り、すぐにret命令でmainにもどるという処理になります ですが、明らかにAに戻るのは無駄でしょう この無駄はAからBを呼ぶ際にcallでなくjmpを使うことで回避できます これが単純なTail callの例です ですが、たった1命令で最適化と言えるのか? \end{comment} \begin{frame}[fragile] \begin{columns}[t] \column{.5\textwidth} \begin{verbatim} A: pushl %ebp movl %esp, %ebp subl $24, %esp movl 20(%ebp), %eax addl 16(%ebp), %eax movl %eax, 8(%esp) movl 12(%ebp), %eax movl %eax, 4(%esp) movl 8(%ebp), %eax movl %eax, (%esp) call B leave ret \end{verbatim} \column{.5\textwidth} \begin{verbatim} A: pushl %ebp movl %esp, %ebp movl 20(%ebp), %eax addl %eax, 16(%ebp) popl %ebp jmp B \end{verbatim} \end{columns} \end{frame} \begin{frame} \frametitle{Tail callの条件} \begin{enumerate} \item 関数コールがreturnの直前にある \item 関数の返す型がcallerとcalleeで一致している \item caller側の引数サイズがcallee側の引数サイズより大きいもしくは等しい \item 書き込んだ引数が、その後書き込む引数を上書きしてはならない \end{enumerate} \center \visible<2>{引数をすべて固定数とすることで対応} \end{frame} \section{実装} \begin{frame} \frametitle{実装} \begin{itemize} \item \_\_code トークンの追加 \item code segmentのパース \hfill Parser \hspace{5em} \item gotoのパース \hfill Parser \hspace{5em} \item code segment/goto を表すGeneric Tree \item \alert<2>{tree/RTL変換 (expand\_call)} \hfill RTL Generator \hspace{5em} \item その他(エラー検出など) \end{itemize} \end{frame} \begin{comment} トークン パーサ recursive Decent expand_call expand_cbc_goto \end{comment} \begin{frame} \frametitle{expand\_call} \begin{exampleblock}{What is the function?} \begin{itemize} \item 関数呼び出しのtreeからRTLへ変換する \item Tail callが可能ならその最適化を行う \item この関数のみで1200行もある \item そのほとんどがTail call可否の判定 \item そして読みづらい \end{itemize} \end{exampleblock} \end{frame} \begin{frame} \frametitle{expand\_cbc\_goto} \begin{exampleblock}{What is it doing?} \begin{itemize} \item code segmentへのgotoを表したtreeをRTLに変換 \item 無駄なTail call可否判定を削除 \item Tail callの条件を強制 \item 確実にTail callを適用 \item 500行程度 \end{itemize} \end{exampleblock} \end{frame} \section{評価} \begin{frame}[fragile] \frametitle{評価(ベンチマーク)} \begin{itemize} \item 環境 i386 fedora core \item 使用したプログラム conv1 \end{itemize} \centering \begin{tabular}{|l|r|r|r|r|} \hline & ./conv1 0 & ./conv1 1 & ./conv1 2 & ./conv1 3 \\ \hline Micro-C & 5.25 & 8.97 & 2.19 & 2.73 \\ \hline \hline GCC & 3.69 & 4.87 & 3.08 & 3.65 \\ \hline GCC (+omit) & 2.74 & 4.20 & 2.25 & 2.76 \\ \hline GCC (+fastcall) & 2.70 & 3.44 & 1.76 & 2.34 \\ \hline \hline TCC & 4.15 &122.28& 84.91&102.59\\ \hline \end{tabular} \begin{description} \item[+omit] -fomit-frame-pointerオプションを付加 \item[+fastcall] \verb|__attribute__ ((fastcall))|を付加 \end{description} \end{frame} %\begin{frame} %\frametitle{考察} %\end{frame} \begin{frame} \frametitle{まとめ} \begin{block}{まとめ} \begin{itemize} \item GCCにCbCコンパイラを実装 \item そのベンチマーク \item 性能向上を確認 \end{itemize} \end{block} \begin{block}{TO DO} \begin{itemize} \item environment \item PPCのRTL変換不能 \item オプションの強制 \item SPU対応とGCCのversion \end{itemize} \end{block} \end{frame} \appendix \begin{frame} \includegraphics[width=.9\textwidth]{figures/stack-tailcall.eps} \end{frame} \end{document}