view improvement.tex @ 7:653cdc2f74e5

add source file
author sugi
date Mon, 01 Apr 2013 23:36:32 +0900
parents ae099fad4c1e
children
line wrap: on
line source

\section{改善案}
\subsection{Message Pack}
AliceではData SegmentをValue型という、Message Packが提供している型で保存している。
Value というクラスは動的に型付けされたオブジェクトを表現することができるため、RubyやPythonのような動的型付けの言語のオブジェクトと同様の扱いをすることができる。
分散プログラムのアプリケーションはサーバとクライアントのVersionが同じとは限らない。サーバ側が更新され、扱うData Segmentが変更された場合であっても、旧Versionとの互換性が要求される。
Aliceは、この問題をMessage PackのValue型を用いることで互換性をもたせようとしている。
しかし、Versionの問題が起こらないLocalの場合、Data SegmentをValue型に変換し、また任意の型に戻すという操作を行う必要はなく、この操作は単なるオーバーヘッドにしかならない。

従って、Data Segmentの送信先がRemoteであるならばValue型に変換を行い、Localであるならば変換しないという具合に改善をすれば、LocalにおけるMessage Packのオーバーヘッドを減らすことができる。


\subsection{SEDA Architecture }
Localにおいてはput や peek に沿ったCommand を作成するステージ(Code Segmentが実行されているスレッド)、受け取ったCommandを処理するステージ、Code SegmentにData Segmentをセットするステージの三段のパイプラインで構成されている。これを全て同一のステージにまとめ、Localの環境下においてSEDAを使用せずに処理を行うように変更する。
\subsection{Data Segmentの再構成}
Data Segmentの更新におけるオーバーヘッドを減らす方法としてCeriumでも良好な結果を得ているflipを提案する。
CeriumにおけるflipはInput Data SegmentとOutput Data SegmentをswapさせるAPIである。(ソースコード \ref{fig:flip})

\begin{table}[html]
\lstinputlisting[label=fig:flip, caption=Ceriumにおけるflip]{source/Cerium_flip.cc}
\end{table}
{\tt readbuf}がInput Data Segment、{\tt writebuf}がOutput Data Segmentである。
Output がinput の書き換えならばswapを行い、2つの領域を入れ替えることで無駄なmemcopyを防ぐことができる。


AliceにおいてもCeriumと同様にflipを実装することで、無駄なデータのコピーを防ぐ。(ソースコード\ref{fig:flipAlice})
\begin{table}[html]
\lstinputlisting[label=fig:flipAlice, caption=Aliceにおけるflip]{source/OutputDataSegment.java}
\lstinputlisting[label=fig:use,caption=flipの使用例]{source/Sort.java}
\end{table}

CeriumにおいてOutput Data SegmentはTaskが実行された段階ですでに用意されているため、flipしてから書き込む。
しかし、Aliceではputまたはupdateを呼んだ段階で作られるため、ソースコード\ref{fig:use}のようにInput Data SegmentであるReceiverをflipメソッドに引数として渡すことで、
無駄なコピーを減らす