The discretion of a man deferreth his anger

; and it is his glory to pass over a transgression (Prov. 19:11 KJV) - このブログは基本的に画像処理やRTMなど技術に関することを書き連ねていきます。

OpenMP on Mac

MacOS X上でOpenMPを動かすテスト。

林檎生活100
http://applelife100.blogspot.com/2008/08/openmp-1.html

上記サイトを参考にとりあえずOpenMPで動くものを組んでみる。
上記サイトから頂いたとりあえずPGはこちら。

#include
#include

int main(void)
{
int nthreads;
int tid;

#pragma omp parallel private(tid)
{
tid = omp_get_thread_num();
printf("Hello World from thread = %d\n", tid);

if (tid == 0) {
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
}

return 0;
}

Eclipse中でやる場合は、Properties->C/C++ Build->Settings->MacOSX C LinkerのMiscellaneousにあるLinker flagsに-fopenmp, GCC C Compiler中のOptimizationにあるOther optimization flagsにも-fopenmpと入れる。MacOS Pantherなら、Commandはgccではなくて、gcc-4.2と入れておくと上手くいくっぽい(gcc-4.0で試してないです。あと、GCC C CompilerとMacOS X C Linkerの両方を確認)。
Tigerだとgcc4.0までしかないっぽいので、http://hpc.sourceforge.netからgcc-4.3のコンパイル後データを落としてくると出来た。

さて、自分のMac Pro上で動かしてみると、スレッドが勝手に4つ立ち上がってくれた。つまるところ4コアだからだろうなぁと思っていたんだが、同じ4コアなXserve君では1つしか動いてくれない(しかもコンパイル時に変なエラーも…)。
一応、コンパイル時のdylibにつながってないよーエラーも克服しても動いてくれない様子。
で、やっとOpenMP関連のドキュメントを見たわけだけど・・・どうやらスレッドは環境変数でコントロールできるっぽいですね。
export OMP_NUM_THREADS 4
としてやると、あっさり4スレッド分動きました。

そのあと、作成中の2DCDPのマルチスレッド化みたいなのをやった結果、
約220%速度UP。
さすがですねー。4コアしっかり使ってるはずなのに220%も(しか)速度がUPしてる(してない)。
んー。。。どうも物理メモリ周りでのアサインが高速化のボトルネックになってる・・・?