# HG changeset patch # User sugi # Date 1420624875 -32400 # Node ID f948d683c29a9432d7243a09881c8ca2cd6b3c86 # Parent a9a8f37945d402bc8769f1b9649ae0251e99cbc8 modify chapter4 and add source diff -r a9a8f37945d4 -r f948d683c29a paper/chapter2.tex --- a/paper/chapter2.tex Wed Jan 07 13:20:56 2015 +0900 +++ b/paper/chapter2.tex Wed Jan 07 19:01:15 2015 +0900 @@ -1,4 +1,4 @@ \chapter{Aliceを使った例題} \label{chapter:chapter2} -\section{AliceVNC} +\section{AliceVNC} \label{section:AliceVNC} \section{水族館の例題(JavaFx)} \section{Jungle} \ No newline at end of file diff -r a9a8f37945d4 -r f948d683c29a paper/chapter4.tex --- a/paper/chapter4.tex Wed Jan 07 13:20:56 2015 +0900 +++ b/paper/chapter4.tex Wed Jan 07 19:01:15 2015 +0900 @@ -1,7 +1,7 @@ \chapter{改善点} \label{chapter:chapter4} %この章では、分散フレームワークAliceに対して行った改善点を示す。 \section{並列環境における改善} -分散フレームワークAliceは、並列環境に対応したフレームワークである。しかし、並列環境に対応していることを確認するためにbitonic sortを作成、計測したところ、Data Segmentの更新のオーバーヘッドにより、期待した効果を得ることができなかった。その際に、行った改善点を示す。 +分散フレームワークAliceは、並列環境にも対応したフレームワークである。しかし、並列環境に対応していることを確認するためにbitonic sortを作成、計測したところ、Data Segmentの更新のオーバーヘッドにより、期待した効果を得ることができなかった。その際に、行った改善点を示す。 \subsection{SEDA Architecture} SEDA Architectureとはマルチコアスレッドを用いて大量の接続を管理し、受け取ったデータを処理ごとに分けられたステージと呼ばれるスレッドに投げ、処理が終わると次のステージにデータを伝搬させていく処理方式である。 スループット重視のでありレスポンスは多段のパイプラインのせいで遅れてしまう。 @@ -10,7 +10,28 @@ 以上の理由からLocal Data Segmentに対して操作をする際はSEDAを使用せず処理を行なうように変更した。 変更前は、Local Data Segmentに対して操作する場合、putやpeekに沿ったCommandを作成するステージ(Code Segmentが実行されているスレッド)、受け取ったCommandを処理するステージ、Code SegmentにData Segmentをセットするステージ(peekとtakeの場合)の2段または3段のパイプラインで構成されていた。これらを1つのステージにまとめて処理することで、並列環境における性能を向上させた。 + \subsection{Data Segment の再構成(flip 機能の追加)} +Data Segment APIのput、updateを呼ぶとOutput Data Segmentが毎回新しく作成される。そして出力するデータのコピーが行われる。しかし、Input Data Segmentとして取得したデータに変更を行い、Output Data Segmentとして出力する場合、コピーを行なうのは無駄である。そこで、このコピーを減らすことで速度改善を行った。 + +このコピーを無くし、Data Segmentの更新におけるオーバーヘッドを減らす方法としてCeriumでも良好な結果を得ているflipを用いた。Ceriumにおけるflipは、Input Data SegmentとOutput Data SegmentをswapさせるAPIである。(ソースコード \ref{src:flipCerium}) + +\begin{table}[html] +\lstinputlisting[label=src:flipCerium, caption=Ceriumにおけるflip]{source/flip.cc} +\end{table} + + +\begin{table}[html] +\lstinputlisting[label=src:flipAlice, caption=Aliceにおけるflip]{source/flip.java} +\end{table} + +\begin{table}[html] +\lstinputlisting[label=src:exampleFlip,caption=flipの使用例]{source/Sort.java} +\end{table} + +Ceriumの場合、Output Data SegmentはTaskが実行された段階ですでに用意されている。そのためデータをOutput Data Segmentに書き込む前にflipを呼ぶ。 +Aliceの場合、putまたはupdateを呼んだ段階でOutput Data Segmentが作られるため、ソースコード\ref{src:exampleFlip}のようにInput Data SegmentであるReceiverをflipメソッドに引数として渡すことで、無駄なコピーを減らす。 + \subsection{Data Segmentのデータ表現の追加} 変更前はData Segmentのデータ表現はMessage Pack for JaveのValueオブジェクトのみを用いて表現していた。 Valueオブジェクトとは、Message Packのバイナリにシリアライズできる型のみで構成されたJavaのオブジェクトであり、自己記述形式のデータ形式となっている。そのため、ArrayValueを用いることにより、ユーザーはデータを後からつなげたりすることも可能である。 @@ -22,4 +43,11 @@ この問題を解決するために、一般的なJavaのクラスオブジェクトでもデータ表現を可能にした。Local Data Segmentに対してputする場合は、Valueオブジェクトに変換せず一般的なJavaのクラスオブジェクトのままで、Remote Data Segmentに対してputする場合にのみValueに変換する。これにより、無駄な変換コストを抑えられるようになった。 \section{分散環境における改善} +AliceVNCを実装するにあたり、Aliceの送受信部分に問題が発見された。ここでは発見された問題の解決方法を示す。 +\subsection{Data Segmentのデータ表現の変更} +AliceVNCは、\ref {section:AliceVNC}で説明したように、当研究室で開発しているTreeVNCを分散フレームワークAliceを用いて実装した画面共有システムである。 + +Topology Nodeは受け取った画面データを描画すると同時に、Remote Data Segmentに送信する。Remote Data Segmentに送信する際にはMessage PackによりValue型に変換し、その後シリアライズ化(byteArrayで表現されたバイナリに変換)される。Topology Nodeは受信するとデシリアライズしValue型に変換した後putされる。 + +このValue型への変換が問題である。受け取ったデータを自分の子ノードに対して送信する際には、デシリアライズしValue型に変換する必要はない。シリアライズ状態のまま子ノードに送信すれば、Value型に変換するオーバーヘッドとValue型をシリアライズするオーバーヘッドを無くすことができる。そこで、Remoteからputされたデータ表現をValue型からbyteArrayで表現されたbinaryに変更した。 \subsection{Protocolの再設計} \ No newline at end of file diff -r a9a8f37945d4 -r f948d683c29a paper/mindMap.xmind Binary file paper/mindMap.xmind has changed diff -r a9a8f37945d4 -r f948d683c29a paper/source/Sort.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/Sort.java Wed Jan 07 19:01:15 2015 +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.flip(info); + } +} \ No newline at end of file diff -r a9a8f37945d4 -r f948d683c29a paper/source/flip.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/flip.cc Wed Jan 07 19:01:15 2015 +0900 @@ -0,0 +1,5 @@ +void swap() { + void * tmp = readbuf; + readbuf = writebuf; + writebuf = tmp; +} \ No newline at end of file diff -r a9a8f37945d4 -r f948d683c29a paper/source/flip.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/flip.java Wed Jan 07 19:01:15 2015 +0900 @@ -0,0 +1,3 @@ +public void flip(Receiver receiver) { + DataSegment.getLocal().put(receiver.key, receiver.getReceiveData(), null); +} \ No newline at end of file