D言語のparallelism

D言語の強力なparallel機構

D言語OpenMPと似たようなことをやろうと思ったところ、parallelismというライブラリをTwitterで勧められたのでやってみた。

こんな感じ

http://dlang.org/phobos/std_parallelism.html

ちゃんと読んでないので詳しいところは分からないが、OpenMPにある単純なforの並列化とmap reduce辺りなら簡単にできそう。

for文を並列化してみよう!

まずはpoolを初期化する

auto pool = new TaskPool();

Thread数は適当に内部で良きに図らってくれるっぽいので、特に面倒なことをする必要はない(勿論してもいい)

実際の処理はこんな感じ

foreach(d; pool.parallel(data, 10)){
    d_ = d*2;
}

dataは配列、10は並列実行の粒度だと思われる。

そのままdに代入したいならref使えばいい

foreach(ref d; pool.parallel(data, 10)){
    d = d*2;
}

突然の死

とまぁ楽しんでた訳だが、

foreach(ref d[]; pool.parallel(data, 10){
    d[] = d[] * 2;
}

とか書いたらエラーで死んでしまった。2次元配列が計算できないとすると割と残念なことになってしまうのだがどうやってやったら良いんだろうか。ちなみにrefを外しても駄目だった。