並列処理の分類

並列処理とかスーパーコンピューティングとかいうと、地球シミュレータのような大型のコンピュータの技術がPCなどに使えれば、と思われることが時々ある。しかし、このようなスーパーコンでやっている処理は、PCでやっている処理とは性質が異なるのだ、という話。

このようなスーパーコンで主に行われている処理は、「数値演算」系のものが主である。数値演算系って何かというと、偏微分方程式を解いたり、FFTしたり、連立一次方程式を解いたり、とか言うものだけど、要するメモリいっぱいに配列をいくつか確保して、それらを足したり掛けたり引いたりというのを繰り返すのが典型的な処理。で、この手の計算は、並列処理に非常に向いているのです。

というのも、巨大な配列に対する計算は、かなりの場合で要素ごとの演算として並列化できる。単純にできない場合も、気合で並列化する方法が知られていたりもする。並列処理の粒度もメモリいっぱいの配列を相手にするので、おおむね十分な大きさがある。時間がかかる処理のコアになる部分は、うっかりするとほんの一部だったりするので、コンパイラで自動的に並列化できたりもする。まぁ、もちろんそううまく行かない場合もあるんだけど。

それに対して、PCでやっている処理というのは、Webを見たり、メールを書いたり、ゲームをしたりというもの。これらには、数値演算が持つ単純な構造は無い。ので、スーパーコンを持ってきても速くならないのでした。(メディア処理(動画・画像・音声)系や3D処理なんかは、数値演算に近い性質を持つけど。)

これまでは、ほうっておいてもCPUの速度が勝手に速くなったので、アプリ側はCPU速度のことを考えなくてもよかったけど、そろそろ1CPUの速度は頭打ちになってきている。そうすると、複数のCPUをつかって並列処理したくなるのだが、今のところは頑張って手で並列化するしかない。

PARDSはその手間をできるだけ省力化するためのものなんだけど、本当の理想は並列化のことなんか考えないで書いたプログラムが勝手に並列に動作すること。しかし、これはなかなか難しい。日記に書いた並列論理型言語や関数型言語を使えば並列に動作させることは可能なんだけど、やはりプログラミングが難しくなる。それに、同じ内容をCで書いたのに比べて(並列に動作させても)高速に動作するかというと、必ずしもそうとも言えないかも知れない。パズルのような、プログラムは単純だけど計算量が多い、というものなら速くなるだろうけど、例えばオフィスアプリを書いたらどうか?Cで書いたものに比べてきびきび動くだろうか?いや、速いかも知れないけどさ。

余談だが、学生時代研究していたFlengという言語では、コンパイラもFlengで記述していた。PIE64という専用並列機上(http://www.ipsj.or.jp/katsudou/museum/paper/magazine/IPSJ-MGN430212.pdf)で動作すると、コンパイラもちゃんと並列動作し、高速化されていた。それを考えるとこの方向性も間違ってはいないのかも知れないが…

いずれにしても、未だにチャレンジングな目標であることに違いは無い。細かい粒度の並列処理でも効率が出るよう、アーキテクチャ側からのサポートも必要だろうし。