comparison paper/cbc.tex @ 18:415fa6d79d00

Add GearsOS description
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Fri, 20 Jan 2017 14:39:45 +0900
parents db2909ab202d
children 34de798b11c3
comparison
equal deleted inserted replaced
17:db2909ab202d 18:415fa6d79d00
96 \end{center} 96 \end{center}
97 \end{figure} 97 \end{figure}
98 98
99 % }}} 99 % }}}
100 100
101 % {{{ Continuation based C におけるメタ計算の例: GearsOS
101 \section{Continuation based C におけるメタ計算の例: GearsOS} 102 \section{Continuation based C におけるメタ計算の例: GearsOS}
102 CbC におけるメタ計算は軽量継続を行なう際に Meta CodeSegment を挟むことで実現できる。 103 CbC におけるメタ計算は軽量継続を行なう際に Meta CodeSegment を挟むことで実現できる。
103
104 CbC を用いてメタ計算を実現した例として、GearsOS\cite{weko_142108_1}が存在する。 104 CbC を用いてメタ計算を実現した例として、GearsOS\cite{weko_142108_1}が存在する。
105 GearsOS とはマルチコアCPUやGPU環境での動作を対象としたOSであり、現在OSの設計と並列処理部分の実装が行なわれている。 105 GearsOS とはマルチコアCPUやGPU環境での動作を対象としたOSであり、現在OSの設計と並列処理部分の実装が行なわれている。
106 現在存在するメタ計算としてメモリの確保と割り当て、並列に書き込むことが可能な Synchronized Queue、データの保存に用いる非破壊赤黒木がある。 106 現在存在するメタ計算としてメモリの確保と割り当て、並列に書き込むことが可能な Synchronized Queue、データの保存に用いる非破壊赤黒木がある。
107 107
108 GearsOS では CodeSegment と DataSegment はそれぞれ CodeGear と DataGear と呼ばれている。 108 GearsOS では CodeSegment と DataSegment はそれぞれ CodeGear と DataGear と呼ばれている。
109 マルチコアCPU環境では CodeGear と CodeSegment は同一だが、GPU 環境では CodeGear には OpenCL/CUDA における kernel も含まれる。 % TODO: ref 109 マルチコアCPU環境では CodeGear と CodeSegment は同一だが、GPU 環境では CodeGear には OpenCL/CUDA における kernel も含まれる。 % TODO: ref
110 kernel とは GPU で実行される関数のことであり、GPU上のメモリに配置されたデータ群に対して並列に実行されるものである。 110 kernel とは GPU で実行される関数のことであり、GPU上のメモリに配置されたデータ群に対して並列に実行されるものである。
111 通常 GPU でデータの処理を行なう場合はデータの転送、転送終了を同期で確認、 kernel 実行、kernel の終了を同期で確認する、という手順が必要である。 111 通常 GPU でデータの処理を行なう場合はデータの転送、転送終了を同期で確認、 kernel 実行、kernel の終了を同期で確認する、という手順が必要である。
112 CPU/GPU での処理をメタ計算で行なうことにより、ノーマルレベルでは CodeGear が実行されるデバイスや DataGear の位置を意識する必要が無いというメリットがある。 112 CPU/GPU での処理をメタ計算で行なうことにより、ノーマルレベルでは CodeGear が実行されるデバイスや DataGear の位置を意識する必要が無いというメリットがある。
113 113
114 GearsOS においては軽量継続の呼び出し部分もメタ計算として実現されている。
115 ある CodeGear から次の CodeGear へと継続する際には、次に実行される CodeGear の名前を指定する。
116 その名前を Meta CodeGear が解釈し、対応する CodeGear へと処理を引き渡す。
117 これは従来の OS の Dynamic Loading Libary や Command の呼び出しに相当する。
118 CodeGear と名前の対応は Meta DataGear に格納されており、従来の OS の Process や Thread に相当する。
119
120 具体的には Meta DataGear には以下のようなものが格納される。
121
122 \begin{itemize}
123 \item DataGear の型情報
124 \item DataGear を格納するメモリの情報
125 \item CodeGear の名前と CodeGear の関数ポインタ との対応表
126 \item CodeGear が参照する DataGear へのポインタ
127 \end{itemize}
128
129 実際の GearsOS におけるメモリ管理を含むメタ計算用の Meta DataGear の定義例をリスト\ref{src:context}に示す。
130 Meta DataGear は Context という名前の構造体で定義されている。
131
132 \lstinputlisting[label=src:context, caption=GearsOS における Meta DataGearの定義例] {src/context.h}
133
134 \begin{itemize}
135 \item DataGear の型情報
136
137 DataGear は構造体を用いて定義する(リスト\ref{src:context} 27-46行)。
138 Tree や Node、 Allocate 構造体が DataGear に相当する。
139 メタ計算は任意の DataGear 扱うために全ての DataGear を扱える必要がある。
140 全ての DataGear の共用体を定義することで、 DataGear を一律に扱うことができる(リスト\ref{src:context} 26-47行)。
141 メモリを確保する場合はこの型情報からサイズを決定する。
142
143 \item DataGear を格納するメモリの情報
144
145 メモリ領域の管理は、事前に領域を確保した後、必要に応じてその領域を割り当てることで実現する。
146 そのために Context は割り当て済みの領域 heap と、割り当てた DataGear の数 dataNum を持つ。
147
148 \item CodeGear の名前と CodeGear の関数ポインタ との対応表
149
150 CodeGear の名前と CodeGear の関数ポインタの対応は enum と関数ポインタによって実現されている。
151 CodeGear の名前は enum (リスト\ref{src:context} 5-9行) で定義され、コンパイル後には整数へと変換される。
152 プログラム全体で利用する CodeGear は code フィールドに格納されており、enum を用いてアクセスする。
153 この対応表を動的に変更することにより、実行時に比較ルーチンなどを変更することが可能になる。
154
155
156 \item CodeGear が参照する DataGear へのポインタ
157
158 Meta CodeGear は Context を引数に取る CodeGear として定義されている。
159 そのため、Meta CodeGear が DataGear の値を使う為には Context から DataGear を取り出す必要がある。
160 取り出す必要がある DataGear は enum を用いて定義し(リスト\ref{src:context} 11-14行)、 CodeGear を実行する際に data フィールドから取り出す。
161 なお、この Context から DataGear を取り出す Meta CodeSegment を stub と呼ぶ。
162 \end{itemize}
163
164 % }}}
165
166
114 \section{メタ計算ライブラリ akasha を用いた赤黒木の実装の検証} 167 \section{メタ計算ライブラリ akasha を用いた赤黒木の実装の検証}
115 168