プログラムをマルチスレッド化するときに、Pthread を使うか、OpenMP を使うか迷うところで、OpemMP を用いると簡単にマルチスレッド化できるが、細かい制御があまり出来ないようなイメージがある。しかし、Pthread 風に thread function を作っておいて、その関数を for 文で包んでから
#pragma omp parallel for schedule(static)
とすると、結構いろいろな制御を行うことができる。以下で Pthread と OpenMP の性能比較を行う。gcc 4.1.2 の OpenMP の性能は一般的には良くないのだが、作り方に依存する面も大きいので、以下のように Pthread と OpenMP の性能差がほとんど無いということもある。
---------------------------------------------------------------
○最適化ソフトウェア : 最短路ソルバー msp Ver. 0.21
○計算サーバ
CPU : Intel Xeon 5460 (3.16GHz / 6MB L2 x 2) x 2
Memory : 48GB (12 x 4GB)
gcc : 4.4.3 (デフォルトは 4.1.2)
Intel コンパイラ : 11.1.064
OS : CentOS 5.4 for x86_64
○最短路問題 LKS 1000 クエリ
1: gcc 4.1.2
pthreads: 31.359s
openmp: 34.956s
2: gcc 4.4.3
pthreads: 31.472s
openmp: 34.939s
3: icc 11.1.064
pthreads: 28.198s
openmp: 30.976s
#pragma omp parallel for schedule(static)
とすると、結構いろいろな制御を行うことができる。以下で Pthread と OpenMP の性能比較を行う。gcc 4.1.2 の OpenMP の性能は一般的には良くないのだが、作り方に依存する面も大きいので、以下のように Pthread と OpenMP の性能差がほとんど無いということもある。
---------------------------------------------------------------
○最適化ソフトウェア : 最短路ソルバー msp Ver. 0.21
○計算サーバ
CPU : Intel Xeon 5460 (3.16GHz / 6MB L2 x 2) x 2
Memory : 48GB (12 x 4GB)
gcc : 4.4.3 (デフォルトは 4.1.2)
Intel コンパイラ : 11.1.064
OS : CentOS 5.4 for x86_64
○最短路問題 LKS 1000 クエリ
1: gcc 4.1.2
pthreads: 31.359s
openmp: 34.956s
2: gcc 4.4.3
pthreads: 31.472s
openmp: 34.939s
3: icc 11.1.064
pthreads: 28.198s
openmp: 30.976s
> ソースファイルを拝見しましたが、やはりどちらも pthreads で実行しているようです。再実験しましたので、結果を載せます。gettimeofday で測定した Dijkstra 法の実行時間です。
すいません。別のソースで実験してしまいました。私のソースでも上記とほぼ同じ結果になりました。
> 単に sdpa では pthreads や OpenMP の起動・同期コストが相対的に小さいのだと思います。
起動・同期コストは小さいのかもしれませんが、スレッド内部の処理が複雑なので、まだまだ性能改善の余地があると思います。
1. gcc-4.1.2
pthreads: 31.359s
openmp: 34.956s
gcc-4.4.1
pthreads: 31.472s
openmp: 34.939s
icc-11.1
pthreads: 28.198s
openmp: 30.976s
/home/yasui/projects/sp/source 以下に、サンプルソースが色々あります。
opt:/home/fujisawa/sp/sp_solve/msp/msp-0.21/solve 以下にソースファイルがあります。次の二種類です。
solve-sppaths.c.openmp
solve-sppaths.c.pthread
http://blog.goo.ne.jp/u1low_cheap/e/6c2aba02aa34329d0825f42d124cfbea