X10雑感

IBMが作っている X10 という並列計算向けの言語があるんだけれども、これが結構面白い。MPIでガリガリ書くのと比べるとゲノム解析との相性がずいぶん良さそうだ。いくつか不満点があるのでメモがわりに並べておく。

async の実装がタスクスチールではなくタスクキューになっているためか Cilk Plus 等と比べると少しタスク生成がやや重いように感じられる。ちゃんとベンチマーク取ってないけど体感で Cilk Plus 比で 5〜10 倍ぐらい粒度大きくしないとスケールしない感じである。

C++バックエンドを使った場合でも X10 ではガベージコレクションをする。実装は Boehm GC の保守的 GC を使っているようだ。先頭ポインタを必ず残す実装になっているようなのでそこまで効率悪くないのだろう。ガベージコレクションを行う実装、ということは頑張ればある程度スタックレスにする実装もできるのだとは思うが at 呼び出しでは呼び出し先・呼び出し元の両者でスタックを使っているようだ。何が言いたいかというと at をあまり連続で使えないのが結構不便である。段数が深くなると落ちるので、例えば巨大グラフを複数のマシンに分散しておいて、その上で DFS をするときにマシンを跨ぐ際に at で呼び出す、というのはできなかった。マシンを数百回またぐと落ちてしまう。

あとは、at 呼び出しはレイテンシが大きいのでこれをなんとかして隠蔽したい。具体的には async で作った大量のスレッドから出てくる複数の at 呼び出しをまとめてレイテンシを隠蔽、というのをやりたいんだが今のところこれは自分で書くしかない。TCP の nagle アルゴリズムみたいに自動でやるのはパフォーマンスをきっちり出すのが難しそうなので、プログラマがちょっとディレクティブを書いて複数区間の at を溜めてから実際に呼び出しを行うようにできると良いな、と思う。

最後に、「計算中に必要な並列度が変化するため、動的に Place を増減したい」というのが今の X10 だとできない。特に I/O で時間食ってる間は CPU を解放して(Sun Grid Engine 等のバッチスケジューラーに返して)おきたいんだけれどもそれはできない仕組みになっている。これは何れは実装されるのだとは思うが増やす方も減らす方も相当に実装が面倒なのが見えているので時間かかるだろうな。