X10の予習
4/28にX10開発者の一人である Vijay Saraswat氏が早稲田に講義にやってくる。
http://phase.hpcc.jp/phase/swopp-announce/archives/msg03467.html
というわけで、英語の講義を聞いても内容が理解できない恐れがあるので,少し予習した。
Charles, Donawa, Ebcioglu, Grothoff, Kielstra, von Praun, Saraswat, Sarkar. X10 An Object-oriented approach to non-uniform Clustered Computing. OOPSLA 2005.
が一番長い論文みたいなので、これを読んだ。
X10ってなに?
X10はアメリカIBMで開発・研究がされているは並列・分散環境での高速な動作と、高生産性を得ることを目的とした言語だ。X10はJavaを拡張して作られており、逐次的な部分の記法や意味はJavaとほぼ同じだ。
目標は?
- 安全性(Safety)
- ポインタエラーとかやだ
- 生産性のため
- 解析可能性(Analyzability)
- リファクタリングや、最適化がしやすくなる
- スケーラビリティ(Scalability)
- 言語が様々な環境に対してスケーラブルな機能を持つ
- 無理な最適化は必要ないよ(手動のループ展開とか)
- 柔軟性(Flexibility)
- 様々な並列プログラミングモデルの基礎になるよ
で、うまいことバランスをとるとのこと。
並列・分散へのアプローチ
並列・分散に対しX10では言語レベルでのアプローチを取っている。そのため、X10では言語自体に並列・分散の為の機能が備わっている。他のアプローチとしては、ライブラリを使うものや、コメントディレクティブで指定するものがある。簡単に表にするとこのようになる。
アプローチ | 言語/ライブラリなど |
---|---|
言語 | X10, Split-C, CILK, HPF, Co-Array Fortran, Titanium, UPC, ZPL, Chapel, Fortress |
ライブラリ | SHMEM, MPI, PVM |
コメント | OpenMP |
型をがんばっている
もちろん、JavaベースなのでJavaと同じような型システムがある。でも、それに加えて(一部では)デッドロックが起きないように型検査で保証しているようだし、配列の形に対して依存型が使えるみたいだ。
placeによるPGAS(Partitioned Global Address Space)
PGASとは、メモリ空間が特定のスレッドと結びついているモデルらしい。共有メモリモデルではメモリ空間は一様だが、それに局所性を持たせた感じだ。
メモリ空間が一様の共有メモリモデルを使うと、深刻なスケーラビリティの問題が出てくるので、X10ではplaceというのを使ってPGASモデルを導入している。placeによってデータの局所性を明示的に扱う事によって、生産性を多少犠牲にして性能を取っているのだ。
非同期に実行される activity
activityは並行に実行される計算プロセスの事で、必ずいずれかのplaceに属している。属しているplaceは変わることはない。activityを作るには、asyncを使う。
async (P) { // A }
Aに書いたコードは、新しいactivityとしてplace Pで実行される。他にも、foreach, ateachで並行のイテレーションができて、activityが各イテレーションの度に作ることができたりする。
activityは同じplaceにあるデータにしかアクセスできないので、異なるplaceにあるデータにアクセスしたい場合にはそのplaceで新しくactivityを作り、データの変更したり、値を返させたりする。値を返すときにはFutureを使う。