Mercurial > hg > Papers > 2012 > sugi-prosym
comparison Paper/alice.ind @ 16:2fb744749f74
fix
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 26 Nov 2012 17:44:11 +0900 |
parents | 3f4b3f26419a |
children | fa9827772216 |
comparison
equal
deleted
inserted
replaced
15:3f4b3f26419a | 16:2fb744749f74 |
---|---|
285 \item 各clientで2 - 4が実行される。 | 285 \item 各clientで2 - 4が実行される。 |
286 \end{enumerate} | 286 \end{enumerate} |
287 | 287 |
288 --実験 | 288 --実験 |
289 | 289 |
290 Ring | 290 Ring 上のトポロジーを構築して、100周回時間を測定してみた。 |
291 | 291 マシン48台,CPU Intel(R) Xeon(R) X5650 @ 2.67GHz, 仮想コア数4,CPU キャッシュ12MB。Blade 上の仮想マシン上での測定となっている。 |
292 水族館 | 292 従来のFederated Lindaよいも若干遅い結果になっている。一部の異常なデータがあるが、データ量が増えると差は縮まっている。これは、コピーの影響よりも、個々の通信の手間の影響が大きいことを示している。00 |
293 | |
294 \begin{figure}[htbp] | |
295 \begin{center} | |
296 \includegraphics[width=110mm]{./images/ring10B.pdf} | |
297 \end{center} | |
298 \caption{10 bytes のデータを100周させたときの1周にかかる平均時間} | |
299 \label{fig:ring10B} | |
300 \end{figure} | |
301 | |
302 \begin{figure}[htbp] | |
303 \begin{center} | |
304 \includegraphics[width=110mm]{./images/ring10KB.pdf} | |
305 \end{center} | |
306 \caption{10 Kbytes のデータを100周させたときの1周にかかる平均時間} | |
307 \label{fig:ring10KB} | |
308 \end{figure} | |
309 | |
310 \begin{figure}[htbp] | |
311 \begin{center} | |
312 \includegraphics[width=110mm]{./images/ring100KB.pdf} | |
313 \end{center} | |
314 \caption{100 Kbytes のデータを100周させたときの1周にかかる平均時間} | |
315 \label{fig:ring100KB} | |
316 \end{figure} | |
317 | |
318 | |
293 | 319 |
294 --評価と考察 | 320 --評価と考察 |
295 | 321 |
296 今回の実装は、Java により Code Segment と Data Segment に必要な API を洗い出すためのものであった。この実装でもいくつかの問題が明らかになっている。 | 322 今回の実装は、Java により Code Segment と Data Segment に必要な API を洗い出すためのものであった。この実装でもいくつかの問題が明らかになっている。 |
297 | 323 |
298 {\bf API } Class を継承したり、Input Datasegment や Output Datasegment の作成に factory object を使うのは Java を使う際の技術的なものであり、Alice のAPI自体は Java に固有である必要はない。むしろ、Java の Object 指向な記述が全体を煩雑にしている部分がある。{\tt update} は、Data Segmentの競合的な更新に使われるべきだと思われる。 | 324 {\bf API } Class を継承したり、Input Datasegment や Output Datasegment の作成に factory object を使うのは Java を使う際の技術的なものであり、Alice のAPI自体は Java に固有である必要はない。むしろ、Java の Object 指向な記述が全体を煩雑にしている部分がある。{\tt update} は、Data Segmentの競合的な更新に使われるべきだと思われる。 |
299 | 325 |
300 \{bf SEDA } | 326 \{bf SEDA } Federated Linad に比べて、通信のレスポンスが遅い原因の一つはSEDA architectureのせいだと思われる。SEDA はスループット重視の実装であり、多段のパイプラインのせいでレスポンスは遅れてしまう。実際、スレッドプールを使用しないほうが、Ring の結果は良くなる(図\ref{fig:ringnothread})。 |
301 | 327 |
302 Federated Linad に比べて、通信のレスポンスが遅い原因の一つはSEDA architectureのせいだと思われる。SEDA はスループット重視の実装であり、多段のパイプラインのせいでレスポンスは遅れてしまう。レスポンスが要求される部分のスケジューラーを別にするなどの工夫が必要だと思われる。それを記述そのものに入れるのが良いかどうかには議論の余地がある。 | 328 \begin{figure}[htbp] |
303 | 329 \begin{center} |
304 \{bf MessagePack } | 330 \includegraphics[width=110mm]{./images/ring_notp_10b.pdf} |
305 | 331 \end{center} |
306 今回の実装では単純な Message の転送の場合でも MessagePack の decode/encode が必要になる。これは単純に overhead になる。encode/decode 抜きに直接処理できる方が望ましい。また、Data Segment の一部の修正に | 332 \caption{Code Segment のスレッドプールを使用せずに、 10 bytes のデータを回した時の実験結果} |
307 | 333 \label{fig:ringnothread} |
308 \{bf Key } | 334 \end{figure} |
335 | |
336 レスポンスが要求される部分のスケジューラーを別にするなどの工夫が必要だと思われる。それを記述そのものに入れるのが良いかどうかには議論の余地がある。 | |
337 | |
338 | |
339 \{bf MessagePack } 今回の実装では単純な Message の転送の場合でも MessagePack の decode/encode が必要になる。これは単純に overhead になる。encode/decode 抜きに直接処理できる方が望ましい。また、Data Segment の一部の修正に Data Segment を再構成するのは望ましくない。Cerium では Input Data Segment と Output Data Segment を swap する API があり、若干状況は複雑になるが良好な結果を得ている。この辺りは、ユーザから見えない最適化として実装する方が望ましいが、なんらかの制御方法も必要だと思われる。 | |
340 | |
341 \{bf Key } 本実装では Data Segment 相互の参照は Key 経由となる。Linda や分散実装では、それは妥当だが、並列実装では、すべての Data Segment を | |
342 Key Value Store | |
343 に格納するのは性能的な問題を引き起こす。一方で、分散記述と並列記述がかけ離れてしまうのも好ましくない。現状は Key Value Store は Java の Concurrent | |
344 Hash map を用いているが、今のベンチマークでは、そこがネックになっているわけではないと思われる。本来は、このKey Value Store は持続性を持つべきだと | |
345 思われるが今回は実装していない。 | |
309 | 346 |
310 \{bf Java } | 347 \{bf Java } |
311 | 348 Ring の実験での異常なデータは、Java の分散プログラミングでは良く現れる。一つは Java のGCの影響だと思われる。Alice では、すべての Data Segment |
312 拡張性 | 349 は Key Value に格納され、実行時の Data Segment は Code Segment が active な時のみにメモリ上にある。この最大値を見積ることは、Active Task の |
350 量を見積もれば良い。したがって、Alice には Garbage Collection は必要ない。一方で、Key Value Store 上のデータは決して Garbage Collection の | |
351 対象にならない。しかし、それは Garbage Collector には負荷をかけてしまう。つまり、Alice 自体は Java で実装するのには向いていない。 | |
352 | |
353 \{bf 拡張性} | |
354 分散アプリケーションでのプロトコルは常に変更されるものであり、Alice もそれに対応する必要がある。Alice 上で走るプロトコルは、 | |
355 Data Segment と Code Segment によって決まる。Key とトポロージーマネージャーをプロトコル毎に別に用意すれば、複数のプロトコルを | |
356 同時に走らせることが可能である。プロトコル間の互換性はいろいろあり得る。Data Segment と Code Segment の結びつきは弱いので、 | |
357 Data Segment に余計な値がある場合、あるいは、値が足りない場合に適切な値を設定することにより、古い Code Segment を変更せずに | |
358 プロトコルを拡張できると考えている。実際、水族館の例題で、2次元と3次元版を両立させることは容易である。 | |
359 | |
313 | 360 |
314 --まとめと今後の課題 | 361 --まとめと今後の課題 |
315 | 362 |
316 | 363 今回、Code Segment と Data Segment による並列分散フレームワークの Java による実装を示した。前の設計\cite{}と異なる部分は、 |
364 実装でしか得られない治験である。 | |
365 | |
366 Java による実装は、ラピッドプロトタイピングとしては適切であり、例題の記述と基本性能の確認に向いている。一方で、Java が Aliceの | |
367 実装に不向きであることもわかってきた。 | |
368 Code Segment / Data Segment を見たコンパイラ的アプローチ、あるいは実行時最適化などが有効であると思われる。 | |
369 あるいは、CbC\cite{} による実装が効果的だと考えている。 | |
370 | |
371 特に、今回はノード内の並列実行や GPGPU による並列実行などは考慮していないので、将来的には、それを含めた実装をしていきたい。 | |
372 | |
373 | |
374 | |
375 |