view mid_thesis.tex @ 9:3da9c163df86

線の太さ調整
author tobaru
date Fri, 27 Oct 2017 13:15:00 +0900
parents 1bf3f300f500
children cf9fc50057b3
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]{pic/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{}
\maketitle
\thispagestyle{fancy} 

\section{Gears OS}
当研究室では、Code Segment と Data Segment によって構成される Gears OS の開発を行っている。Gears OS は、並列プログラミングフレームワークの Cerium と 分散フレームワークの Alice の開発を通して得られた知見を元に開発を進めている。 \\
  Cerium はオブジェクト指向言語である C++ を用いて開発した並列プログラミングフレームワークである。Cell、マルチコアCPU、GPU を用いた並列実行をサポートしている。並列処理の単位として Task を記述し、Task に他の Task との依存関係を設定する事で並列実行を実現するが、データは汎用ポインタで Task に渡されるため、データの依存関係を保証できない。データの正しさや依存関係を保証できていないので、並列処理は行えるが、信頼性が低い。その知見から、並列分散処理 には Code の分割だけではなく Data の分割も必要である事が分かった。\\
  Alice では処理の単位である、 Code Segment、データの単位である Data Segment を用いてプログラムを記述する。Code Segment は使用する Input Data Segment、Output Data Segment  を指定することで処理とデータの依存関係を解決する。Gears OSでは、Gear という単位を用いてプログラムを Code Gear、Data Gear に細かく分割するが、これは Alice のCode Segment、Data Segment にそれぞれ対応する。\\
  Gears OS では 当研究室で開発している CbC を用いて Data Sement を定義し、実装を行っている。
%当研究室で開発している Code Segment を処理単位とする プログラミング言語 CbC を用いて Data Segment を定義し、Gears OS の実装を行っている。


\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{pic/codesegment.pdf}}
 \end{center}
 \caption{goto による code gear 間の継続}
 \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{研究目的}
本研究では、ARM で動くシングルボードコンピュータである Raspberry Pi 上で Gears OS を動かせるようになる事で、ハードウェア上でも信頼性があり、並列実行ができるプログラミングを を記述できるようになる事を目指している。\\
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{pic/examples_2.pdf}}
 \end{center}
 \caption{I-T図の例}
 \label{fig:examples}
\end{figure}




\section{Raspberry Pi 上での実装}
  Raspberry Pi の OS である Raspbian ではメモリが 256MB なので Raspberry Pi 上で直接 CbC をコンパイルするには時間がかかる。qemu によるメモリの拡張もできないので、別の手法で Raspberry Pi 上に CbC を実装する方が好ましい。\\
Raspberry Pi でコンパイルを行うまでの過程を、図\ref{fig:RaspberryPi}に示す。

\begin{figure}[htpb]
 \begin{center}
  \scalebox{0.17}{\includegraphics{pic/RaspberryPi_2.pdf}}
 \end{center}
 \caption{Raspberry Pi}
 \label{fig:RaspberryPi}
\end{figure}




\section{LLVM CrossCompile}
Raspberri pi 上ではコンパイルするためのメモリが足りないので、OSX 上で CrossCompile する事でこの問題を解決する方法がある。\\
  CrossCompile とは、別の OS で実行可能なコードを生成するコンパイルの手法である。つまり、OSX であらかじめ Raspberry Pi で CbC が動くように CrossCompile を行い、そのコードを Raspberry Pi に移せばよい。\\ 
arm-linux-gnueabihf-gcc を使用し、C で書かれたファイルを CrossCompile することで ARM のコードを生成できる事を確認した。CbC でも CrossCompile できるコンパイラを書く必要がある。OSX 上で コンパイルを行うまでの過程を、図\ref{fig:OSX}に示す。

\begin{figure}[htpb]
 \begin{center}
  \scalebox{0.35}{\includegraphics{pic/OSX_2.pdf}}
 \end{center}
 \caption{OSX}
 \label{fig:OSX}
\end{figure}



\section{仮想マシン}
CrossCompile と別に linux 環境で CbC を動かした後に、Raspberry Pi に載せる手法がある
LLVM を動かす際に、オプションで target を指定する事で、ARM のコードを生成することができる。\\
linux 用の gcc を CbC に書き直す際に、gcc7 に書き直せば linker がそのまま使えるので、xv6 で動くようになる。\\
  xv6とは、マサチューセッツ工科大の大学院生向け講義の教材として使うために、UNIX V6 という OS を ANSI-C に書き換え、x86に移植した OS である。
xv6 は Raspberry Pi に移植する事ができる。ANSI-C で書かれている xv6 を CbC に書き直す事で、Raspberry Pi で CbC を動かせるようになる。Linux 上で コンパイルを行うまでの過程を、図\ref{fig:OSX_Linux_VM}に示す

\begin{figure}[htpb]
 \begin{center}
  \scalebox{0.5}{\includegraphics{pic/OSX_Linux_VM_2.pdf}}
 \end{center}
 \caption{OSX Linux VM}
 \label{fig:OSX_Linux_VM}
\end{figure}


% xv6詳しく


% \section{clang のバージョンアップ}
%  CbC はバージョン 3.9 の clang を使用している。現在のバージョンの LLVM と clang を使用して、CbCをコンパイラできるように修正を加える必要がある。

% cross compiler, 実機, VM への実装を書く

\nocite{*}
\bibliographystyle{junsrt}
\bibliography{reference}
\end{document}