comparison Paper/nobu-prosym.tex @ 32:8bf53f6b1256

modify
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Mon, 21 Nov 2011 07:12:43 +0900
parents db9735be2bf1
children c2a267355565
comparison
equal deleted inserted replaced
31:db9735be2bf1 32:8bf53f6b1256
113 GCC への実装により,GCC の最適化やデバッガの機能を使うことができより実用的な CbC プログラミングが行えるようになった. 113 GCC への実装により,GCC の最適化やデバッガの機能を使うことができより実用的な CbC プログラミングが行えるようになった.
114 %以来,GCC のアップデートに合わせて GCC ベースの CbC コンパイラのアップデートを行って来ている. 114 %以来,GCC のアップデートに合わせて GCC ベースの CbC コンパイラのアップデートを行って来ている.
115 %今回,CbC コンパイラを GCC-4.6 へとアップデートを行った. 115 %今回,CbC コンパイラを GCC-4.6 へとアップデートを行った.
116 %本論文では, CbC,GCC の簡単な説明と,GCC-4.6 への実装を述べる. 116 %本論文では, CbC,GCC の簡単な説明と,GCC-4.6 への実装を述べる.
117 だが, GCC をベースとした CbC のコンパイラ (以下 CbC-GCC)は, GCC のアップデートに合わせて変更する必要がある. 117 だが, GCC をベースとした CbC のコンパイラ (以下 CbC-GCC)は, GCC のアップデートに合わせて変更する必要がある.
118 %本研究では, GCC-4.5.0 をベースとしていた CbC-GCC を GCC-4.6.0 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う.
118 本研究では, GCC-4.5.0 をベースとしていた CbC-GCC を GCC-4.6.0 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う. 119 本研究では, GCC-4.5.0 をベースとしていた CbC-GCC を GCC-4.6.0 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う.
119
120 120
121 % }{ 121 % }{
122 122
123 \section{Continuation based C (CbC)} 123 \section{Continuation based C (CbC)}
124 CbC のプログラムはコードセグメント毎に記述され, コード間をgoto(軽量継続)により処理を移る. 124 CbC のプログラムはコードセグメント毎に記述され, コード間をgoto(軽量継続)により処理を移る.
414 %\subsection{スタック書き換えの問題} 414 %\subsection{スタック書き換えの問題}
415 \subsubsection{引数の並びの上書きコピー} 415 \subsubsection{引数の並びの上書きコピー}
416 CbC の継続では, 引数渡しでスタックを入れ替える為値が書き換えられる可能性がでてくる. 416 CbC の継続では, 引数渡しでスタックを入れ替える為値が書き換えられる可能性がでてくる.
417 例えばlistlising\ref{code:cs_prog}のような継続である. 417 例えばlistlising\ref{code:cs_prog}のような継続である.
418 \begin{figure}[h] 418 \begin{figure}[h]
419 \begin{footnotesize} 419 %\begin{footnotesize}
420 \begin{minipage}[b]{.45\textwidth} 420 \begin{minipage}[b]{.45\textwidth}
421 \begin{lstlisting}[caption=スタックの上書きが起こる継続の例,label=code:cs_prog] 421 \begin{lstlisting}[caption=スタックの上書きが起こる継続の例,label=code:cs_prog]
422 __code cs_a(int a, int b) { 422 __code cs_a(int a, int b) {
423 goto cs_b(b, a) 423 goto cs_b(b, a)
424 } 424 }
425 \end{lstlisting} 425 \end{lstlisting}
426 \end{minipage} 426 \end{minipage}
427 \hfill 427 \hfill
428 \end{footnotesize} 428 %\end{footnotesize}
429 \end{figure} 429 \end{figure}
430 430
431 431
432 \begin{figure}[htpb] 432 \begin{figure}[htpb]
433 \begin{center} 433 \begin{center}
439 この時のスタックの様子を表したのが図\ref{fig:cs_prog}となる. 439 この時のスタックの様子を表したのが図\ref{fig:cs_prog}となる.
440 数字の 1 と 2 は \verb+cs_b+ の引数をスタックに乗せる順を表している. 440 数字の 1 と 2 は \verb+cs_b+ の引数をスタックに乗せる順を表している.
441 CbC ではこの問題を一時変数に引数の値を代入することで問題を解決している. 441 CbC ではこの問題を一時変数に引数の値を代入することで問題を解決している.
442 442
443 \subsubsection{一時変数へのコピー} 443 \subsubsection{一時変数へのコピー}
444 一時変数へのコピーは, goto が行れるコードセグメントの Generic Tree を生成時する時に行われる. 444 一時変数へのコピーは, goto が行れるコードセグメントの Generic Tree 生成時に行われる.
445 445
446 図\ref{fig:cbc_replace}に示す \verb+cbc_replace_arguments+ 関数が実際のコードとなる. 446 図\ref{fig:cbc_replace}に示す \verb+cbc_replace_arguments+ 関数が実際のコードとなる.
447 %\begin{figure} 447 %\begin{figure}
448 %\lstinputlisting[language=c]{source/cbc_replace_arguments.c} 448 %\lstinputlisting[language=c]{source/cbc_replace_arguments.c}
449 %\caption{引数の一時変数へのコピー} 449 %\caption{引数の一時変数へのコピー}
581 今回実装を行った GCC-4.6 ベースのコンパイラを GCC-4.4 ベース, 581 今回実装を行った GCC-4.6 ベースのコンパイラを GCC-4.4 ベース,
582 Micro-C コンパイラとそれぞれ比較を行った. 582 Micro-C コンパイラとそれぞれ比較を行った.
583 比較を行うのはクイックソートのプログラムである. 583 比較を行うのはクイックソートのプログラムである.
584 %クイックソートは再帰的にプログラムされる為 CbC に向いている 584 %クイックソートは再帰的にプログラムされる為 CbC に向いている
585 %プログラムだと言える. 585 %プログラムだと言える.
586 クイックソートは再帰的なプログラムな為スタック操作が行われる. 586 クイックソートは再帰的なプログラムな為スタック操作が行われる為テストに向いている.
587 比較を行うのは以下のアーキテクチャと OS になる. 587 比較を行うのは以下のアーキテクチャと OS になる.
588 588
589 %\begin{description} 589 %\begin{description}
590 \begin{itemize} 590 \begin{itemize}
591 \item x86/Linux 591 \item x86/Linux
604 \begin{table}[htpb] 604 \begin{table}[htpb]
605 \centering 605 \centering
606 \small 606 \small
607 \begin{tabular}{|c|c|c|c|} \hline 607 \begin{tabular}{|c|c|c|c|} \hline
608 CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline 608 CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline
609 x86/Linux & 7.378 & 0.833 & 2.923 \\ \hline 609 % x86/Linux & 7.378 & 0.833 & 2.923 \\ \hline
610 x86\_64/OS X(-m32)& 5.951 & 0.507 & 2.871\\ \hline 610 x86/Linux & 7.378 & & 2.923 \\ \hline
611 x86\_64/OS X & 6.420 & 0.621 & \\ \hline 611 % x86\_64/OS X(-m32)& 5.951 & 0.507 & 2.871\\ \hline
612 x86\_64/OS X(-m32)& 5.951 & & 2.871\\ \hline
613 % x86\_64/OS X & 6.420 & 0.621 & \\ \hline
614 x86\_64/OS X(-m64) & 6.420 & & \\ \hline
612 \end{tabular} 615 \end{tabular}
613 \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(最適化無し)} 616 \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(最適化無し)}
614 \label{tab:speed-mc-vs-gcc-nonopt} 617 \label{tab:speed-mc-vs-gcc-nonopt}
615 \end{table} 618 \end{table}
616 619
620 \small 623 \small
621 \begin{tabular}{|c|c|c|c|} \hline 624 \begin{tabular}{|c|c|c|c|} \hline
622 CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline 625 CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline
623 x86/Linux & 3.253 & 2.906 & 2.71 \\ \hline 626 x86/Linux & 3.253 & 2.906 & 2.71 \\ \hline
624 x86\_64/OS X(-m32)& 2.726 & 2.418 & 2.857\\ \hline 627 x86\_64/OS X(-m32)& 2.726 & 2.418 & 2.857\\ \hline
625 x86\_64/OS X & 1.390 & 1.509 & \\ \hline 628 x86\_64/OS X(-m64) & 1.390 & 1.509 & \\ \hline
626 \end{tabular} 629 \end{tabular}
627 \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(速度最適化)} 630 \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(速度最適化)}
628 \label{tab:speed-mc-vs-gcc-opt} 631 \label{tab:speed-mc-vs-gcc-opt}
629 \end{table} 632 \end{table}
633
634 GCC-4.6 バージョンの最適化無しは, 末尾最適化が強制的に行われる為
635 除外している.
636 最適化有りと無しの比較が 4.6 でも行えないのは残念だが, 最適化の効果はでている
637 ように思われる.GCC-4.4 では最適化により 2 倍以上の性能がでている.
638 また 64bit 版の最適化有りは 32bit 版に比べてどちらも 1.6 倍以上の速度がでている
639 のが確認できた.
640 Micro-C と比較では GCC の 32bit 版が若干早く, 64bit 版は 2 倍の差がでているのが
641 確認できた.
630 642
631 643
632 \section{CbC のアップデート手法} 644 \section{CbC のアップデート手法}
633 最後に, CbC のアップデート手法について述べる. 645 最後に, CbC のアップデート手法について述べる.
634 646