Skip to main content

ログ取得ツール (移転先予定地)

OpenMPのreduction

やっぱ今後やたらにコアは増えまくるから困るねえ、と思って並行コンピューティング技法(Amazon)という本を買ってパラパラと読んでみたが、reductionの処理の並列化は面倒だからIntel TBBやOpenMPのreductionを使うべし、と書いてあった。

実際はOpenMPのreductionは制限がきつくてまともに使える気はしない。任意の関数や式でreduceしたいのだが、+や-などだけ(しかもC++のoperator+すらダメ)ではほとんど何もできない。かと言って普段はせいぜい8コアくらいまでしか使わないのにreductionの並列化なんて毎回やってられない。ただ、重いreduceをしたいことも時々あり、そういうときは並列化したくなることも。intの+や-といった軽いreduceを並列化したところで効果はほとんどないので、やはりOpenMPのreductionの仕様は馬鹿だと思う。

Intel TBBもけっこう単純な内容でSEGV食うことがあるので、あまり頼りになる感じがしない。STLだとvalgrind経由で動かしても大丈夫なプログラムなんだけどな。

本にチラッと書いてあったのだけど、Cilk++というのがあるらしい。調べてみるとC++ベースで、かなり単純な構文でマルチコアを生かせる。やってることはOpenMPよりも単純で、構文が3つしかない。forループ、それから再帰で書いたプログラムを得意としているような感じに見える。今はIntelが買い取ってプッシュしている。ただバイナリ配布しかないし、あまり気軽に試す気になれないな。

そう言えばPythonのスレッドはGILのせいで性能が出ないんですよね。そもそも演算性能を目指していないということもあるのだろう。2.6でmultiprocessingが入って巻き返そうとしているけど、あんまり流行ってないね。