ScalaのParallel Collectionの論文

主にScalaのものですが。そして英語の勉強もかねて。
ScalaはEPFLという大学で開発されていて、Odersky先生はそこの教授です。Scalaの公式ページには論文などの一覧のページがあります。また、Odersky先生のwebサイトにも、論文一覧のページがあります。

他の言語の状況に詳しいではありませんが*1おそらく一般的に普及しているいわゆるスクリプト言語にくらべれば、この論文の数は多いほうではないでしょうか?*2

そもそも、なぜ論文読もうと思ったかというと、
基本的にずっと、collection libraryのそれぞれのメソッドや、詳細な動作とか、内部のアルゴリズムなどを調べるときに、たいていソースコード直接読んでました。というか今でもそうです。

同じ方法で2.9から入るParallel Collectionの動作調べようと思ったのですが、まだ完全には完成してないですし、ちょっと見た限りでは全くわからない・・・ェ・・・(´・ω・`)という感じで悩んでいたときに、論文直接読んでみると、
なにこれ完結に要点だけまとまっててわかりやすい!しかも英語の勉強にちょうどいい!
という理由です(`・ω・´)

Parallel Collectionの論文については、
A Generic Parallel Collection Framework
という名前で、2010年の7月の時点ででてるようです。7月というと、まだちょうど2.8がでた頃でしょうか?


ちなみに、他にも
Implementing First-Class Polymorphic Delimited Continuations by a Type-Directed Selective CPS-Transform
という2.8から標準のコンパイラプラグインとして提供されている、限定継続に関する論文をはじめ、基本的になにか新しい特徴的な機能が入るときは、


論文書く => それを設計書として実装


という順番で論文ドリブン(?)な開発なんでしょうか?

以下、自分が把握した限りで、Parallel Collectionの論文に関してちょっとだけ説明してみようかと思います。
章立てを抜き出すと、

  1. Introduction
  2. Scala Collection Framework
  3. Adaptive work stealing
  4. Implementation
    1. Initial approach
    2. Further refinement
    3. Common operations
    4. Parallel array
    5. Parallel hash trie
    6. Parallel range
    7. Parallel views
  5. Experimental results
  6. Conclusion

という構成になっています。

1章

イントロダクションで、

  • マルチコアの話とか、Parallel Collectionが必要になってる時代背景(?)
  • 現在、他の言語でどのようなParallel Collectionに関する実装があるか*3
  • そして現在開発しているScalaのParallel Collectionがそれらとはどのように異なるのか

などが説明されてます。

2章

現在のScalaのCollection libraryの概要の説明です。*4

3章

どのように設計されているかの全体的な概念というか概要というかんじ?

4章

ここからは、より詳細な実装よりの話です。

前半が、共通の内部の仕組み(splitとcombineという仕組み)と、どのparallel collectionのクラスにも共通して存在する中心となるメソッド(foreach、reduce、forall、filterなど)について。

そして後半に、array、hash trie、range、viewsなど主要となるcollectionの種類ごとに分けて、それぞれの詳細が説明されてます。

5章

実際に

4 Dual-Core AMD A Opteron 2.8 MHz processor with hyper-threading

のパソコンで色々なベンチマークをとった結果がグラフとともに説明されてます。

6章

全体の結論です。



全体読んだ感想として、あくまで自分が感じた限りのポイントというか、論文で主張したいことは、
論文の題が、Generic Parallel Collection Framework
となっているように、2.8までのScalaのコレクションと、共通のインターフェイスで、なおかつコレクションの要素の型についてジェネリックで、他のScalaのコレクションと同じく、immutableなクラスに関しては共変なども考慮している点かと思います。たとえば最初のほうで、

Groovy Parallel Systems uses this parallel array to implement parallel collection processing, but is currently limited to collections based on arrays.

ということが書いてあります。しかしScalaの場合、論文の中に以下のような図が出てくるのですが

単にArrayをデータ構造に使うわけではなく、なにか頑張って複雑なことをしているようです(´・ω・`) *5

そして、その実装を、2.8のcollectionのアーキテクチャと同じように、implicitパラメータとMixinを駆使して、DRYに実装しているようです。以前class図を表示するサイト作ったと言いましたが、DRYになってる代わりに、階層構造がものすごく複雑です・・・(´・ω・`) たとえば、parallel.mutable.ParHashMapを例にとると、合計40以上のclassやtraitを継承しています!!!

あと、去年のScalaDays2010のときのvideoが残っているのでそちらもぜひ(`・ω・´)それと、プレゼンのパワポの資料もあるようです。

簡単に概要つかむだけなら、このパワポの資料見るのがとりあえず手軽でわかりやすいかもしれません。


ただ、論文もそうですが、半年以上の前のもので、実際の実装や設計方針が若干変わっている可能性もあるかもしれませんが、その辺の詳細な事情は知りません*6

というわけでみんなもっと論文読もうぜ!っていうか一緒に論文読まなイカ?(・ω・`)

*1:というか他の言語の開発の状況というか、論文との関係教えて欲しい

*2:それがいいとか悪いとかを主張したいわけではなく。言語を使う側としては、使いやすくて、情報がたくさんあれば、論文があろうがなかろうが、どっちでもいいとは思いますが

*3:Haskellとか.NETに触れたりしていて面白いよ!(*´∀`)

*4: 他の論文でもこういう章があるんですが、scala自体を知らない人にも読めるようにするためって感じなのかな?

*5:自分もひと通り読んだけど、完璧にわかり易く説明する自信がないので、こんな説明ですいません・・・(´・ω・`)

*6: 2.9.0のさらにその次の2.10.0でもparallel collectionはある程度改良(?)されるらしく、なんだかforeachとpforeachがどうのこうの・・・っていう話を聞いたが