Mercurial > hg > Papers > 2011 > nobu-prosym
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 |