並列化に向いている言語とは
ついでに書いておこう。僕は並列化に向いている言語というのは、
- そもそも並列化しないでもC言語と同じくらい速い
- きちんとした定義がある
の二点であると考えている。
まず、「C言語と同じくらい速い」という点について。
並列化は高速化が目的である以上、「Cで書いた直列プログラムより遅い並列プログラム」では存在理由が無い。
なので、「並列言語」にとって、「C言語と同じくらい速い」ことは必要条件だろう。
で、次、「きちんとした定義がある」という点。
並列化は、大胆にプログラムを書き換える必要があるので、「その変換ってほんとに正しいの?」というような状況がでてくる。
そういうときに、きちんとした言語仕様が無いと、「正しいとも正しくないとも言えない」という感じになる。
例えば、Cで
for (int i=0; i<n; i++) { a[i] = func(...) }
こういうプログラムがあったとして、これを並列化すると、配列"a"のメモリ書きかえの順序が変わってしまう。
メモリ書きかえ順序が変わる場合、それ正しいと言えるの言えないの?は、C言語では「正しい」、だと思うけど、それだと、
for (int i=0; i<n; i++) { a[i] = func(...) } flag = 1; /* 他のスレッドが見てるフラグ */
これを
flag = 1; /* 他のスレッドが見てるフラグ */ for (int i=0; i<n; i++) { a[i] = func(...) }
こう書きかえた場合に正しい?正しくない?というのはなんか曖昧になってくる。
GCCの場合は、asm("":::"memory")を入れると、よろしくやってくれる気がしてて、実際にはメモリバリアが入るはずなのでまあ、多分それでよいのだが、C標準として決まってる動作ではない。
自動並列化する場合は、「何が正しい変換なのか?」という基準が欲しくなるのである。