view proceeding/last-proceeding.tex @ 2:d5507629a56b

mv name
author tobaru
date Tue, 20 Feb 2018 14:28:27 +0900
parents proceeding/mid_thesis.tex@612de2705907
children f3c9c9e2d66b
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}

\input{dummy.tex}
\renewcommand{\abstractname}{概要}
\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 を行うと、
かなりの時間がかかる。

解決案として、OSX 上で CrossCompile を行う方法と、Linux 環境で 
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{Raspberry Pi 上での実装}
%  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時間の比較として研究室のサーバでメモリ16GBのfireflyと学科のサーバの一つでLinux環境であるメモリ756GBのDALMOREを用いる。
なお、fireflyとDALMOREではGoogleによって開発されたbuildシステムのninja-buildを用いてmakeを行なった。その結果を表\ref{tab:make_time}に示す。

% ninja

\begin{table}[htb]
\centering
\scalebox{1.0}[1.0]{
  \begin{tabular}{| c | r | r |} \hline
    環境(メモリ) & 時間 & 比較 \\ \hline \hline
    RaspberryPi(1GB) & 15時間11分06秒 & 1.00倍 \\ \hline
    OSX(16GB) & 2時間16分06秒 & 6.69倍 \\ \hline
    Linux(756GB) & 2分26秒 & 374.42倍 \\ \hline
  \end{tabular}
  }
   \caption{make時間の比較}
 \label{tab:make_time}
\end{table}

\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 を実装する方が好ましい。



  マサチューセッツ工科大の大学院生向け講義の教材として使うために、UNIX V6 という OS を 
  ANSI-C に書き換え、x86に移植したXv6 という OS がある。
Xv6 は Raspberry Pi に移植する事ができる。ANSI-C で書かれている Xv6 を CbC に書き直す事で、
Raspberry Pi で CbC を動かせるようになる。


CbC を Raspberry Pi で動かすためのアプローチの手法を、I と T の形をした図の組み合わせによって説明を行う。I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある。T の下にある I は特別で、上に VM 下に VM を乗せている OS が記されている。  T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。

例として、cbclang のソースコード(I)と、 Raspberry Pi 上の clang (T) を図\ref{fig:examples} に示す。

\begin{figure}[htpb]
 \begin{center}
  \scalebox{0.35}{\includegraphics{images/examples_2.pdf}}
 \end{center}
 \caption{図の例}
 \label{fig:examples}
\end{figure}


\break


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{fig: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}



\section{Linux CrossCompile}
OSX と別に Linux 環境で CbC を動かした後に、Raspberry Pi に載せる手法がある。

 Linux の LLVM でコンパイルすることができれば elf のコードを書けるようになるので、elf のloader を作る事で、CbC を動かすことができる。
 
  また、Linux 用の gcc を CbC に書き直す際に、gcc7 に書き直せば linker がそのまま使えるので、xv6 で動くようになる。
  
   
  CbCはCによって記述されているので、Cから ARM.oのバイナリを生成し、ARM.oからa.outを出力する。
OSX上に立ち上げたLinux 上で xv6を実装するまでの過程を、図\ref{fig: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{fig:OSX_Linux_VM}
\end{figure}

% 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}