# HG changeset patch # User sugi # Date 1364826992 -32400 # Node ID 653cdc2f74e5eb88f21885f7ab2fdbc6e346c8d5 # Parent ae099fad4c1e3253ef8d8f18898527ca24380830 add source file diff -r ae099fad4c1e -r 653cdc2f74e5 alice.tex --- a/alice.tex Mon Apr 01 21:47:04 2013 +0900 +++ b/alice.tex Mon Apr 01 23:36:32 2013 +0900 @@ -1,9 +1,9 @@ \section{分散ネットフレームワークAlice} -Alice\cite{kono11g}は、本研究室で開発を行なっている分散管理フレームワークである。Cell用の並列フレームワークCerium\cite{kono09b} \cite{cerium-sourceforge}に似たタスク管理機構を持つ。Data Semgnetの通信ではLinda\cite{linda} を相互接続した分散フレームワークであるFedaradeLinda\cite{kono05b}\cite{kono10d}に似た構造をもつ。 +Alice\cite{kono11g}は、本研究室で開発を行なっている分散管理フレームワークである。Cell用の並列フレームワークCerium\cite{kono09b} \cite{cerium-sourceforge}に似たタスク管理機構を持つ。Data Semgnetの通信ではLinda\cite{linda} を相互接続した分散フレームワークであるFederated Linda\cite{kono05b}\cite{kono10d}に似た構造をもつ。 まず、Aliceを使用するに必要なData Segment、Code Segmentについて説明を行う。 \subsection{Data Segment API} -Data Segmentは数値や文字列などのデータ構造体的に保持する。AliceはData Segmentをデータベース的に扱う。しかし、Data Base的に扱うがAliceではData Baseとは異なりKey毎にキューがある。キューにData Segmentをput した順番に取得することができる。これはLindaに準じた設計となっている。 +Data Segmentは数値や文字列などのデータを構造体的に保持する。AliceはData Segmentをデータベース的に扱う。しかし、Aliceは通常のデータベースとは異なりKey毎にキューがある。キューにData Segmentをput した順番に取得することができる。これはLindaに準じた設計となっている。 Data Segmentを管理するのがData Segment Manager(以下DSM)である。ノード毎にキーを持ち他のノードにはRemote DSM経由でアクセスすることができる。つまり、Remote DSMは他のノードのLocal DSMのproxyである。(図 \ref{fig:proxy})他のノードに対するアクセスはキューによって、ノード内部で逐次化される。それ以外は、すべてJavaのThread poolにより並列実行される。 \begin{figure}[tb] @@ -84,13 +84,13 @@ Code Segmentはタスクのことである。Code Segmentをユーザーが記述するときにCode Segment内で使用するData Segmentの作成を記述する。Code SegmentにはInput Data SegmentとOutput Data Segmentを作るAPIが存在する。 -Input Data Segmentで作成されたData SegmentはRemoteかLocalを指定する必要がある。 -実際にはsetKeyのメソッド時に指定するが、その他にどのData Segmentを取ってくるかを指定するキーを指定する。 +Input Data SegmentはRemoteかLocalを指定する必要がある。さらに、どのData Segmentを取るかをキーで指定する。 +実際にsetKeyのメソッドを呼んだ時に指定する。 Code Segmentがactiveになるためには、Input Data Segmentが全て揃う必要がある。 -Output Data Segmentで作成されたData Segmentにも、RemoteかLocalを指定する。 -実際にはputまたはupdateメソッドを呼んだ時にRemote,Localを指定すると共にキーを指定する。 +Output Data SegmentもRemoteかLocalを指定する。Input と同様にどのキーに対してData Segmentを追加するか指定する。 +実際にはputまたはupdateメソッドを呼ぶタイミングでおこなう。 これらのInput/OutputがCode Segment間の依存関係を自動的に記述することになる。 diff -r ae099fad4c1e -r 653cdc2f74e5 improvement.tex --- a/improvement.tex Mon Apr 01 21:47:04 2013 +0900 +++ b/improvement.tex Mon Apr 01 23:36:32 2013 +0900 @@ -1,6 +1,4 @@ \section{改善案} - - \subsection{Message Pack} AliceではData SegmentをValue型という、Message Packが提供している型で保存している。 Value というクラスは動的に型付けされたオブジェクトを表現することができるため、RubyやPythonのような動的型付けの言語のオブジェクトと同様の扱いをすることができる。 @@ -22,4 +20,14 @@ \end{table} {\tt readbuf}がInput Data Segment、{\tt writebuf}がOutput Data Segmentである。 Output がinput の書き換えならばswapを行い、2つの領域を入れ替えることで無駄なmemcopyを防ぐことができる。 -AliceにおいてもCeriumと同様にflipを実装することで、無駄なデータのコピーを防ぐ。 \ No newline at end of file + + +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メソッドに引数として渡すことで、 +無駄なコピーを減らす diff -r ae099fad4c1e -r 653cdc2f74e5 source/OutputDataSegment.java --- a/source/OutputDataSegment.java Mon Apr 01 21:47:04 2013 +0900 +++ b/source/OutputDataSegment.java Mon Apr 01 23:36:32 2013 +0900 @@ -1,4 +1,5 @@ public class OutputDataSegment { public void flip(Receiver receiver) { DataSegment.getLocal().putObject(receiver.key, receiver.getObj()); - } \ No newline at end of file + } +} \ No newline at end of file diff -r ae099fad4c1e -r 653cdc2f74e5 source/Sort.java --- a/source/Sort.java Mon Apr 01 21:47:04 2013 +0900 +++ b/source/Sort.java Mon Apr 01 23:36:32 2013 +0900 @@ -1,6 +1,14 @@ - - +public class SortPhase extends CodeSegment{ + private Receiver info = ids.create(CommandType.PEEK); -public void flip(Receiver receiver) { - DataSegment.getLocal().putObject(receiver.key, receiver.getObj()); + public SortPhase(String key){ + info.setKey(key); + } + + @Override + public void run() { + DataList list1 = info.asClass(DataList.class); + Sort.quickSort(list1); + ods.flip(info); + } } \ No newline at end of file diff -r ae099fad4c1e -r 653cdc2f74e5 source/Sort2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/Sort2.java Mon Apr 01 23:36:32 2013 +0900 @@ -0,0 +1,14 @@ +public class SortPhase extends CodeSegment{ + private Receiver info = ids.create(CommandType.PEEK); + + public SortPhase(String key){ + info.setKey(key); + } + + @Override + public void run() { + DataList list1 = info.asClass(DataList.class); + Sort.quickSort(list1); + ods.put(info.key ,list1); + } +} \ No newline at end of file