並列化に向いている言語とは

ついでに書いておこう。僕は並列化に向いている言語というのは、

  • そもそも並列化しないでも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標準として決まってる動作ではない。


自動並列化する場合は、「何が正しい変換なのか?」という基準が欲しくなるのである。