さっそくGeekになるための修行を始めましょう。
まずは古式ゆかしき方法に則り、コードを書いてみましょう。
001-1.c
#include<stdio.h>
int main(int argc,char *argv[])
{
printf("hello world!!\n");
return 0;
}
これをコンパイルしてみます。
$ gcc 001-1.c -o 001-1
それを実行してみましょう。
$ ./001-1
hello world!!
では、これにちょっと手を加えてOpenMPっぽくしてみましょう。
001-2.c
#include<stdio.h>
#include<omp.h>
int main(int argc,char *argv[])
{
int my;
#pragma omp parallel
{
my = omp_get_thread_num();
printf("hello world!! I'm %d !!\n",my);
}
return 0;
}
普通にコンパイルしてみましょう。
$ gcc 001-2.c -o 001-2
/tmp/ccrWewTT.o: In function `main':
001-2.c:(.text+0x10): undefined reference to `omp_get_thread_num'
collect2: error: ld returned 1 exit status
(ノ∀`)アチャー。怒られてしまいました。ここでOpenMPには独自のライブラリがあってそれをコンパイル時に使わないとイケナイのです。
それは-foepmpというオプションになります。実際やってみましょう。
$ gcc -fopenmp 001-2.c -o 001-2
これでうまくコンパイルできていると思います。では実行してみましょう。
$ ./001-2
hello world!! I'm 0 !!
hello world!! I'm 3 !!
hello world!! I'm 6 !!
hello world!! I'm 1 !!
hello world!! I'm 5 !!
hello world!! I'm 4 !!
hello world!! I'm 2 !!
hello world!! I'm 7 !!
なんとなく並列化された気になります。(並列化されています)
これで、めでたくOpenMPコードのコンパイルができたと言うことです。
では次に、並列実行数を制御してみましょう。そのためには環境変数 $OMP_NUM_THREADS を使います。
$ export OMP_NUM_THREADS=2
これで先ほどの001-2を実験してみると…
$ ./001-2
hello world!! I'm 0 !!
hello world!! I'm 1 !!
・・・と実行されている数が変わってきます。
$OMP_NUM_THREADS という環境変数でスレッド数を制御でき、並列実行の数が変化します。
今日はここまで。