「マルチコアを活かすお手軽並列プログラミング」

今月の情報処理(情報処理学会の会誌)の特集が,「マルチコアを活かすお手軽並列プログラミング」でした.
さすがに知ってる話ばかりかと思ったが,以外と知らない話があって参考になったので紹介.(編集長に「記事の難しさから見て,普通人が「お手軽」にプログラムを作れるわけではなさそう」とかつっこまれてるけど(^^;,)

あ,記事は電子図書館で購入できます.が,1編735円!特集全部ならともかくこれはたけー.図書館とかあれば,そちらを利用する方が良いかも.
([追記] オーム社から買うこともできるみたい.)

  • マルチコア計算機と基本的な並列化技法 (松崎公紀・武市正人)
    • ループの並列化,forkを使った並列化がありますね,といった基本的な話.特集を通じて,N-Queenを例題に使います,という説明があります.特集の枕ですね.
  • GCC上での並列プログラミングサポート (江本健斗)
    • OpenMPSTLの並列実装を使った並列化.OpenMPの方は良く知られていますね.最近は普通にGCCでも使えます.STLの方は,普通に(?)STLでプログラムを書くと,並列に動作するというもの.僕はあまりSTLを使った経験が無いんだけど,transform(xs.begin(), xs.end(), cs.begin(),f);とか書くと,xsの各要素に対してfを実行して,それをcsに入れる,という意味になって,これが並列に実行されるようになるそうな.ん〜,fに副作用があるともちろん駄目なんだけど,それって処理系が自動的に認識してくれる…わけは無いよなぁ.まぁでも,簡単にかけて麗しいことは確か.
  • Javaにおける並列プログラミングサポート (田浦健次朗)
    • Javaにはjava.util.concurrentという便利なライブラリがありますが,Java SE 7以降でその拡張として導入される(ことを目指している)forkjoinという仕組みについての解説.ちとマニアック.話は,再帰的なアルゴリズムだと,再帰の各段階でforkすることで,並列性がたくさん取り出せることが多いですね→スレッドが多すぎてオーバヘッドが…→スレッドプールにすればいいんじゃね?→あれ,ブロックする操作を実行したらそのスレッド止まるの?→スレッドプールのすべてのスレッドがブロックしたらデッドロックになるんですけどどうしましょ?という問題を解決するというもの.forkjoinで行うトリックは,ブロックする操作は,いわゆるfork-joinにおける子供のjoinだけにして,これがブロックしそうになったら,タスクプールから別の処理をもらって来て実行を継続するというもの.PARDSでは,この手の「再帰で大量のタスクを生成」というパターンは無視してるんだよなぁ(プロセスだし).まぁ,手でタスクプールをかけば実現はできるんだが,もう少し真面目に考えないといけないのかなぁ.
  • 並列計算パターン(スケルトン) による並列プログラミング (岩崎英哉・胡振江)
    • 並列計算パターン(map, reduce, scan等)に沿ったライブラリを提供して,それを使って並列プログラミング,という話.著者らが作成したSkeToというライブラリの解説.それと,Intel Threading Building Blocks (TBB)の説明.というか,著者らによると,TBBは並列スケルトンライブラリの一種らしい.本当かよ.って専門家が言うんだからそうんなんだろうけど.
  • dRubyとRinda -Rubyにおける並列計算 (関将俊)
    • Rubyに分散オブジェクト環境を提供したdRubyと,それを使って実装したLindaであるところのRindaの説明.つか,最初のdRubyってわずか200行だったのか.そいつはすごい.あと,dRubyもRindaも実用的に使われてるとのこと.分散GCは実装してないそうだけど,これやろうとすると,Ruby自身に手を入れないといけないだろうなぁ.やり方自身はKL1あたりで死ぬほど研究されてたと思うので,頑張ればできると思うけど.

[追記] 関様,直々にスター,ありがとうございます!