ブログランキング・にほんブログ村へ


iPhone/iPad用潜水艦ゲームアプリ ソナーエコー iTunesにて公開中

2012年04月20日

OpenMP マルチコア マルチスレッド 並列処理

最近のCPUはマルチコア流行りである。
マルチコアにあらずんば人(CPU)に非ず、といった空気さえある。
マルチコアといえばなんだかかっこいいかもしれないが、要するにCPU1コアのクロックアップが難しいから並列化することでこれをなカバーしようということである。
4コアにしなくてもCPUのクロックを4倍にして、従来のインタラプトでスレッド処理すれば同じ効果が得られるのに、それはもうできないってことだ。
ペンティアムの33Mhzあたりから始まったクロックアップインフレ時代は終焉を迎えたということなのかもしれない。

ないものは仕方がない。マルチコアをパフォーマンス改善のために使うようにプログラマが積極的に対応していくしかない。
そんなマルチコア(スレッド)を便利に使う仕組みというのが色々考案されていて、表題のOpenMPもその1つ。
だいぶ前になるが自分はWindows Visual C++ 2005で使った。

色々使い方があるが、一番簡単に使えるのは

#include <omp.h>
:
:
#pragma omp parallel for
for( int i=0;i<n;i++ ){
job( i );
}

とやると、
job( 0 );
job( 1 );
job( 2 );
:
:
job( n-1 );
をスレッド(コア)に適当に割り振ってうまいこと並列処理してくれる仕組みだ。この仕組みをLinuxのptheradとかWindowsのCreateThreadで書くことを考えたら、どんだけこれが便利かわかろうというもの。

ただ、自分が試したときは、まだ本物のマルチコアがあまり市場に出回ってなくてハイパースレッディングの時代だった。ハイパースレッディングだと、妙なウエイトがかかってOpenMPの並列処理がきちんと並列にならず、実行速度の向上につながらなかった。その証拠にほんとうのマルチコアCPU(たしかその当時のAMD CPU)ではちゃんと速くなった。

上の例ではもし将来100コアCPUというものができてn=100なら、job(0)〜job(99)は一斉に開始され、一回もループ処理はされないことになる。それは速そうだ。


将来的に技術が革新されて再び大幅なクロックアップが始まることもあるかもしれないがそれまではコアが増えるだけの時代が続くのだろうか。

もしこの先1000コアとか1万コアとかいう時代がきたら、コーディングスタイルやプログラムの記述概念は根底から変わってしまうような気がする。例えば1ピクセルごとに1コアCPUが付いている液晶ディスプレイとか。
シリコンチップのまま光学コンピュータとか量子コンピュータとかの世界に近寄って行くのだろうか?

みてみたいようなそうでないような。
posted by みこあいさ at 15:52| C++