view paper/chapter4.tex @ 20:fc397777a7e2

fix
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Mon, 15 Feb 2016 23:53:19 +0900
parents 3afb4bfe1100
children
line wrap: on
line source

\chapter{Gears OS サポート}
\ref{sec:Gears} 節で述べた Gears OS の記述を助ける構文について記す.

Gears OS のための構文のサポートには python スクリプトを用いた. 記述したプログラムをこのスクリプトに読み込ませることで CbC コンパイラでコンパイル可能な構文へと変換される. このようにすることで meta code segment, data segment を用いるGears OS のコードのコンパイルが可能になる.

\section{meta code segment}
Gears OS では code segment 間の遷移に meta レベルの meta code segment を挟む. その様子を表したのが図 \ref{fig:metaCS} である. 通常レベルの code segment は一度 meta code segment へと継続し, その後次の code segment へと継続する. meta code segment は meta computation を行う code segment で, メモリの確保やネットワーク管理等が meta computation にあたる. code segment にはこれらの処理を書かず, meta code segment に必要に応じて記述する. 通常レベルの code segment からは meta code segment への継続は見えず, 通常レベルの code segment に直接継続しているように見えるべきである (リスト \ref{hideMeta}). しかし既存の CbC コンパイラでは meta code segment への継続等は自分で記述する必要がある(リスト \ref{GearsCode}). これをリスト \ref{hideMeta} の形に変換するのが今回作成した python スクリプトである. この CbC のコードでは, 並列実行時の資源のロック部分を meta code segment で行っている.


\begin{figure}[htpb]
 \begin{center}
  \scalebox{0.55}{\includegraphics{fig/metaCS.pdf}}
 \end{center}
 \caption{meta computation}
 \label{fig:metaCS}
\end{figure}

\begin{lstlisting}[frame=lrbt,label=hideMeta,caption={Gears OS での meta computation 例}]
__code meta_sender(struct Context* context, struct Queue* queue, enum Code next) {
    // lock
    pthread_mutex_lock(&queue->mutex);
    goto (context->code[next])(context);
}

__code sender(struct Context* context, struct Queue* queue) {
    goto put(queue);
}

__code code4(long* count, struct Allocate* allocate, struct Element* element) {
    allocate->after_put = Code3;
    element->value = (*count)++;
    goto sender();
\end{lstlisting}

\begin{lstlisting}[frame=lrbt,label=GearsCode,caption={スクリプトにより出力される Gears OS コード}]
__code meta_sender(struct Context* context, struct Queue* queue, enum Code next) {
    // lock
    pthread_mutex_lock(&queue->mutex);
    goto (context->code[next])(context);
}

__code sender(struct Context* context, struct Queue* queue) {
    goto meta_sender(context, queue, Put);
}

__code sender_stub(struct Context* context) {
    goto sender(context, &context->data[Queue]->queue);
}

__code code4(struct Context* context, long* count, struct Allocate* allocate, struct Element* element) {
    allocate->after_put = Code3;
    element->value = (*count)++;
    goto meta(context, Sender);
}

\end{lstlisting}


\section{stub code segment}

python スクリプトのもう一つの機能として stub code segment の自動生成がある. Gears OS では code segment は meta code segment に継続し, その後 code segment に継続すると述べたが, 正確には meta code segment から code segment に継続する際に stub code segmentを挟む. stub code segmentでは, code segment が必要とする data segment を context から取り出すという処理を行うもので, リスト \ref{GearsCode}, code1\_stub, code2\_stub がそれにあたる. 
stub code segment は次の継続先のコードセグメントの引数をみて, 取り出す data segment を選択している. 
stub code segment は code segment 毎に生成されるためこの自動生成を行うことで code segment の記述量を約半分にすることができる. 

stub code segment, meta code segment への自動継続は Gears OS のサポートとして設計された機能であるが, CbC の拡張機能であるといえるため, Gears OS の記述のためでなくとも利用することが出来る.
この機能により, CbC は code segment のみでなく data segment を単位として用いることが可能になった. meta code segment, meta data segment により meta computation を通常の code segment 内に記述せずにすむ. code segment 間に実行される meta code segment で継続先を変更する, エラーハンドリングを行うといった使い方ができるようになるだろう.