2008年8月10日日曜日

OpenMP 入門 #1

OpenMP やろうぜ!最近の CPU はマルチコアだから,「見せてもらおうか、Intel のデュアルコア CPU の性能とやらを」的なノリで始めてみた.大学の講義で,OpenMP と MPI を勉強する機会があったのが大きいけどねw

とりあえず,本家からリンクの張られている OpenMP Tutorial を読みつつ勉強してる.まあ,林檎生活的には,ソースコードとか載せつつ,僕が理解したことを書いていこうと思ってるのでよろしく.間違ってたら教えてね.

OpenMP に正式に対応したのは,4.2 あたりからだとのこと.僕の現在の環境 Mac OS X Leopard (10.5.4) では,GCC 4.0.1 と GCC 4.2.1 が入ってるみたいで,一応コンパイル環境は整っているみたい.GCC がインストールされているかどうかは,実際に次のようにコマンドを打ってみるとわかると思う.(ちなみに cc と gcc は,gcc-4.0 へのシンボリックリンクとなっている.)

$ gcc-4.0 --version
i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5484)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc-4.2 --version
i686-apple-darwin9-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5564)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$


対応するようになったのはわりと最近なので,新しいのを使えばいいことあるかなぁってことで,GCC 4.3.1 と GCC 4.4.0 20080801 をインストールしてみた.その比較とかもやっていけたらなぁと思ってる.インストールは,お約束の MacPorts で♪

$ sudo port -c install gcc43
.
.
.
$ sudo port -c install gcc44
.
.
.
$


時間がかなりかかるので注意.無理していれる必要はないと思う.バージョンはこんなかんじ.

$ gcc-mp-4.3 --version
gcc-mp-4.3 (GCC) 4.3.1
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc-mp-4.4 --version
gcc-mp-4.4 (GCC) 4.4.0 20080801 (experimental)
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$


さて,インストールして終わりってのもあれなので,上述のチュートリアルに出てくるプログラムをちょっと改造したものをコンパイルして実行してみよう.ソースはこんなかんじ.

#include <stdio.h>
#include <omp.h>

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;
}


コンパイルはこう.-fopenmp をつけてコンパイルするのがポイント.

$ gcc-4.2 -fopenmp parallel_region.c


次のように実行すると,スレッドごとに自分のスレッド番号を表示し,最後にマスタースレッドだけがスレッド数を表示する.

$ ./a.out
Hello World from thread = 0
Hello World from thread = 1
Number of threads = 2
$


今回はここまで,なんか面白い例題を見つけて,このくらい性能があがりますよってやりたいなぁ.そして,8コアの Mac Pro が欲しくなるという流れになるというかんじでw

0 件のコメント: