MPIが簡単

printf できるし、メモリ保護付いてる環境下で動いてるし、core dump させれば バックトレースも取れるし。


「MPIが簡単」とか言ってしまったので、その真意についてちゃんと書いておこうと思う。


(http://d.hatena.ne.jp/w_o/20151206#1449329985 で書いた内容といくらか通じる部分がある)


まず、多くの人に同意してもらえると思うのは、「MPIには複雑な機能は無い」という点だろう。(openibのコードとか見たらクソ複雑なんだけど)


基本的には、send, recv, barrier, bcast, gather, scatter というプリミティブな処理しかない。(集合通信は処理方法に選択肢あるしプリミティブではない気もするけど…まあ…これも忘れて…)


まあ、性能まで考えれば難しい面があるのは否定しないけど、こんな単純な機能しか無いインターフェースをもって「難しい」と、言っていいのかは疑問である。インターフェースとしては、jqueryのほうがよっぽど何やってるかわからないし難しいんじゃない?


「MPIが難しい」と、言った場合、本質的には、「複雑な処理を単純な機能しかないMPIにマッピングする作業」の難しさが露出していると思う。

GPGPUとかも一緒。GPGPUが難しいか?と、聞かれたら、僕は「難しくない」と答えると思う。GPGPUで書けるプログラムの複雑さなんて、OSとライブラリが複雑に絡みあったプログラムの複雑さに比べると、ずっと少ない。

僕は、GPGPUでできることの少なさをもって、「GPGPUは簡単だ」と、言うと思う。

しかし、それは、「複雑なプログラムを単純な機能しか無いGPGPUマッピングする難しさ」を否定するものではなくて、アルゴリズムによっては、そういう作業が難しく、また場合によってはそもそも不可能な場合もあるだろう。(例えば、圧縮処理を並列化するみたいな)


同じように、アセンブリC言語どっちが難しいか、と言われたら、C言語のほうが「難しい」と俺の中では定義されている。

  • add eax, 1
  • a++;

どっちが難しいか?

アセンブリのほうは、前後の行に関係なく、「raxレジスタの値を一増やした値に32bitのマスクをかけてraxに格納」と、言える。

それに対して、a++ のほうは、「前後の行を見ないとわからん」としか言えない。


これは、ちゃんと区別しておくべきだと思う。


ちゃんと区別しないで、「MPIわからん、難しい、もっと書きやすいものをくれ」とか、言ってしまうから、なんかよくわからないMPIをラップしただけの、「使いやすい並列フレームワーク」みたいなのが無数に登場してしまう。


ちゃんと、「XXXのアルゴリズムは、プリミティブな機能しかないMPIにマップして動かして性能が出すのが大変」と、そういうふうに主張すべきだ。


あと、MPIは、printf できるし、メモリ保護付いてる環境下で動いてるし、core dump させれば バックトレースも取れるので、アクセラレータに乗せるのに比べたら簡単だと思う。