Mercurial > hg > Papers > 2018 > tobaru-thesis
view proceeding/last-proceeding.tex @ 6:3a99fc0296ce
mindmap slide 修正
author | tobaru |
---|---|
date | Thu, 22 Feb 2018 02:31:50 +0900 |
parents | d0d503dd3fd5 |
children |
line wrap: on
line source
\documentclass[twocolumn,twoside,9.5pt]{jarticle} \usepackage[dvipdfmx]{graphicx} \usepackage{picins} \usepackage{fancyhdr} \usepackage{abstract} \usepackage{url} \usepackage{float} %\pagestyle{fancy} \lhead{\parpic{\includegraphics[height=1zw,keepaspectratio,bb=0 0 251 246]{images/emblem-bitmap.pdf}}琉球大学主催 工学部情報工学科 卒業研究中間発表会} \rhead{} \cfoot{} \setlength{\topmargin}{-1in \addtolength{\topmargin}{15mm}} \setlength{\headheight}{0mm} \setlength{\headsep}{5mm} \setlength{\oddsidemargin}{-1in \addtolength{\oddsidemargin}{11mm}} \setlength{\evensidemargin}{-1in \addtolength{\evensidemargin}{21mm}} \setlength{\textwidth}{181mm} \setlength{\textheight}{261mm} \setlength{\footskip}{0mm} \pagestyle{empty} \usepackage{listings, jlisting} \input{dummy.tex} \renewcommand{\abstractname}{Abstract} \begin{document} \title{Gears OS on Raspberry Pi} %\title{Supporting NAT in Screen Sharing System TreeVNC} \author{145759E 氏名 {桃原}{優} 指導教員 : 河野 真治} \date{} \twocolumn[ \maketitle \thispagestyle{fancy} \begin{abstract} In our laboratory doing development CbC and Gears OS make use of CbC. CbC can be write meta level processing and parallel processing. Meta level processing can management memory , thread, CPU and GPU. In this research aiming to run Gears OS on Raspberry Pi \end{abstract} ] \section{Raspberry Pi上 の Gears OS} 当研究室では CbC(Continuation base C) とCbC を用いて実装する GearsOS の研究を行っている。 CbC は Code Segment と Data Segment という単位でプログラムを記述する。 Code Segment は並列処理の単位として利用でき、 Data Segment はデータそのもので型を持っていて、 CbC はメタレベルの処理,並列処理を記述することができる。 メタレベルの処理では、メモリ管理、スレッド管理、CPU や GPU の資源管理 を記述することができる。 本研究では、ARM で動くシングルボードコンピュータである Raspberry Pi 上で Gears OS を動かせるようになる事で、 ハードウェア上でもメタレベルの処理、並列実行ができるプログラミング を記述できるようになる事を目指している。 しかし、メモリの関係上 RaspberryPi 上で CbC の make を行うと、 かなりの時間がかかる。 解決案として、別のOSで CrossCompile を行う方法がある。 CbCには、LLVM/Clang上に実装したものと、GCCで実装したものがある。Linuxに実装されたLLVMとGCCのCrossCompileの手法について提案する。 % \section{CbC} % Gears OS の実装には LLVM/Clang 上に実装した CbC(Continuation based C)を用いる。\\ % CbC は Code Segment を基本的な処理単位とする。C の関数とは異なり返り値を持たないが、Code Segment の宣言は C の関数の構文と同じように行い、型に \_\_code を用いる。\\ % CbC は for 文や while 文といったループ制御構文を持たないので、ループ処理は自分自身への再帰的な継続を行う事で実現する。\\ % 現在の Code Segment から次の Code Segment への移動は goto の後に Code Segment 名と引数を並べて記述する。この goto による処理の遷移を継続と呼ぶ。C と異なり、戻り値を持たない Code Segment ではスタックに値を積んで行く必要が無くスタックは変更されない。このようなスタックに値を積まない継続を軽量継続と呼ぶ。この軽量継続により、並列化、ループ制御、関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようになる。 % % % % \begin{figure}[htpb] % % \begin{center} % % \scalebox{0.5}{\includegraphics{/codesegment.pdf}} % % \end{center} % % \caption{goto による Code Segment 間の継続} % % \label{fig:cs} % % \end{figure} % % \section{Code Gear と Data Gear} % Gears OS では、プログラムの単位として Gear を用いる。Gear は並列実行の単位、データの分割、Gear 間の接続等になる。 % Code Gear はプログラムの処理そのものであり、任意の数の Data Gear を参照し、処理が完了すると任意の数の Data Gear に書き込む。Code Gear は接続された Data Gear 以外にアクセスできない。Code Segment と同じように Code Gear から次の Code Gear への処理の移動は goto の後に Code Gear の名前と引数を指定する事で実現できる。 % Data Gear はデータそのものを表す。int や 文字列などの Primitive Data Type を持っている。Gear の特徴として処理やデータの構造が Code Gear、Data Gear に閉じている事にある。これにより、実行時間、メモリ使用量などを予測可能なものにすることができる。 % % % \section{Context} % % 接続可能な Code Gear、Data Gear のリスト、Temporal Data Gear 等のためのメモリ空間を持っており、Context を通してアクセスすることができる。Context にはメインとなる Context と Worker 用の Context がある。Temporal Data Gear のためのメモリ空間は Context 毎に異なり、互いに干渉する事はできない。 \section{CbC のmake時間の比較} % Raspberry Pi の OS である Raspbian ではメモリが 256MB なので % Raspberry Pi 上で直接 CbC をコンパイルするには時間がかかる。qemu によるメモリの拡張もできないので、別の手法で Raspberry Pi 上に CbC を実装する方が好ましい。 Raspberry Pi 1 のメモリは 256MB と小さいため、 CbC をmakeすることができない。 Raspberry Pi 3 だとメモリは 1GB あり CbC をmakeできるが、時間がかかる。 make時間の比較として研究室のメモリ16Gのサーバでと学科のサーバの一つでLinux環境であるメモリ756GBのDell PowerEdge630 を用いる。 なお、それぞれのサーバではGoogleによって開発されたbuildシステムのninja-buildを用いてmakeを行なった。その結果を表\ref{tab:make_time}に示す。 % ninja \begin{table}[htb] \centering \scalebox{1.0}[1.0]{ \begin{tabular}{| c | c | r | r |} \hline メモリ& コア & 時間 & 速度比較 \\ \hline \hline 1GB & 4Core & 15時間11分06秒 & 1.00倍 \\ \hline 16GB & 12Core& 2時間16分06秒 & 6.69倍 \\ \hline 756GB & 36Core & 2分26秒 & 374.42倍 \\ \hline \end{tabular} } \caption{make時間の比較} \label{tab:make_time} \end{table} \break \section{CrossCompile} CrossCompile を行うことで make 時間の問題を解決する方法がある。 % CrossCompile とは、別の OS で実行可能なコードを生成するコンパイルの手法である。 % つまり、OSX であらかじめ Raspberry Pi で CbC が動くように CrossCompile を行い、そのコードを Raspberry Pi に移せばよい。\\ CrossCompile とは、別の OS で実行可能なコードを生成するコンパイルの手法である。 Raspbian 以外の OS 環境であらかじめ Raspberry Pi で CbC が動くように CrossCompile を行い、そのコードを Raspberry Pi に移す事で、実行できるようになる。 % この研究でOSX とLinuxそれぞれで LLVMとGCCのCrossCompileを行う説明 Raspberry Pi の OS である Rasbian は qemu によるメモリの拡張もできないので、 別の手法で Raspberry Pi 上に CbC を実装する方が好ましい。 \section{xv6} マサチューセッツ工科大の大学院生向け講義の教材として使うために、UNIX V6 という OS を ANSI-C に書き換え、x86に移植したXv6 という OS がある。 Xv6 は Raspberry Pi に移植する事ができる。ANSI-C で書かれている Xv6 を CbC に書き直す事で、 Raspberry Pi で CbC を動かせるようになる。 % Raspberry Pi は ARM のコードを生成する。CbCはCによって記述されているため、Cから ARM.o を生成し、ARM.o から a.out を出力する。 % Raspberry Pi 上でxv6を実装し、cbcからa.outを出力するまでの過程を図\ref{images:RaspberryPi}に示す。 % \begin{figure}[htpb] % \begin{center} % \scalebox{0.17}{\includegraphics{images/RaspberryPi_2.pdf}} % \end{center} % \caption{Raspberry Pi} % \label{images:RaspberryPi} % \end{figure} % \section{OSX CrossCompile} % OSX上でxv6を実装する場合、Cから mach-o のバイナリファイルが生成される。 % この時、出力は mach-o になるので、mach-o の % loader 作ることで CbC が動かせるようになる。 % OSX 上で行えるためコンパイルの速度向上が望める。 % xv6を実装しCbCからa.outを出力するまでの過程を、図\ref{fig:OSX}に示す。 % \begin{figure}[htpb] % \begin{center} % \scalebox{0.35}{\includegraphics{images/OSX_2.pdf}} % \end{center} % \caption{OSX} % \label{fig:OSX} % \end{figure} % この手法に関して、arm-linux-gnueabihf-gccというツールチェーンを使用し、Cで書かれたファイルにCrossCompileを行い、RaspberryPi上で実行できるARMのコードを生成するところまで実装を行なった。 \section{Linux CrossCompile} OSX と別に Linux 環境で CbC を動かした後に、Raspberry Pi に載せる手法がある。 Linux の LLVM でコンパイルすることができれば elf のコードを書けるようになるので、elf のloader を作る事で、CbC を動かすことができる。 また、Linux 用の gcc を CbC に書き直す際に、gcc7 に書き直せば linker がそのまま使えるので、xv6 で動くようになる。 CbC を Raspberry Pi で動かすためのアプローチの手法を、I と T の形をした図の組み合わせによって説明を行う。I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある。T の下にある I は特別で、上に VM 下に VM を乗せている OS が記されている。 T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。 例として、cbclang のソースコード(I)と、 Raspberry Pi 上の clang (T) を図\ref{images:examples} に示す。 \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{images/examples_2.pdf}} \end{center} \caption{図の例} \label{images:examples} \end{figure} % CbCはCによって記述されているので、Cから ARM.oのバイナリを生成し、ARM.oからa.outを出力する。 % OSX上に立ち上げたLinux 上で xv6を実装するまでの過程を、図\ref{fig:OSX_Linux_VM}に示す。 Raspberry Pi は ARM のコードを生成する。Linux上でもARM.oのコードを生成するようにCrossCompileを行えば、RaspberryPiでも実行可能なファイルを出力することができる。 OSX上に立ち上げたLinux環境のVMでCbCが実行可能なxv6を実装するまでの過程を図\ref{images:OSX_Linux_VM}に示す。 \begin{figure}[htpb] \begin{center} \scalebox{0.5}{\includegraphics{images/OSX_Linux_VM_2.pdf}} \end{center} \caption{OSX Linux VM} \label{images:OSX_Linux_VM} \end{figure} \section{LLVM CrossCompile} LLVM は任意のプログラミング言語の静的コンパイルと動的コンパイルの両方をサポートできる事を目的としたプロジェクトから始まった、モジューラと再利用可能なcompilerとツールチェーン技術の集まりである。 Clangは高速なコンパイルを目的としたLLVMをバックエンドとした、C/C++/Objective-Cのcompilerである。 Makefileに変更を加えることで LLVM/Clang 上に実装されたCbCでRaspberry Piで実行できるようなARMのコードを生成できるように実装した。 CbCをmakeした際に作られるclangを使い、ARMのコードを生成できるようにtargetオプションでarm-linux-gnueabihfを指定する。 \section{GCC CrossCompile} GCC は C/C++/Objective-Cなどを様々な言語をコンパイルすることのできるcompiler である。 arm-linux-gnu-gcc のコマンドを使うことで、ARMのコードを生成することができる。アセンブラやリンカーに対してもarm-linux-gnu-as や arm-linux-gnu-ld という ふうに指定していく。 % Xv6詳しく \section{今後の課題} xv6 で CbC が動くようになれば、Raspberry Pi 以外のハードウェアでの実装も容易になるので、Linux 上での実装を目指して研究を進めていく。xv6 で CbC が動けば、続けて Linux 上で Gears OS の実装も行なっていく。 % \section{clang のバージョンアップ} % CbC はバージョン 3.9 の clang を使用している。現在のバージョンの LLVM と clang を使用して、CbCをコンパイラできるように修正を加える必要がある。 % cross compiler, 実機, VM への実装を書く \nocite{*} \bibliographystyle{junsrt} \bibliography{reference} \end{document}