Intel から MathKernelLibirary を評価版で download してきて、こいつを使って、 windows でも高速化が得られるか調べていたんだが、どうにも全然駄目…。
VC++, Intel C++の組み合わせに、 BLAS あり/なし、さらには、計算のコアだけ取り出したものと実行ファイル作りまくって調べてみると、一番早いのは VC++ BLASなし、しかし GUI つきというのはどういうことよ……。
gcc では2倍近く高速化できていたのは、元が遅かったからと考えられなくもないが、 windows では BLAS 使うほうが全体として遅い。 で、 Intel C++ で、最適化のオプションをいろいろ弄っても、どうしても VC++ より速くならん…。
よっぽどCPU を選ぶのかいな?
一定ステップの計算にかかった計算時間/min (数値が小さいほど高速) 実行環境は、 Pentium M 1.1GHz
GUIあり
BLASなし | BLASあり | 最適化オプション | |
VC++ | 6 | 7 | /Ox /GL /LTCG |
Intel C++ (1) | 8 | 9 | /Ox /Og /GL |
Intel C++ (2) | 11 | 9 | /O3 /Og /QxN |
worker thread で計算コアを実行して、 GUI ではプログレスバーを描いている。 これをコアだけのプログラムにするとかえって遅くなる…。
GUIなし
BLASなし | BLASあり | 最適化オプション | |
VC++ | 7 | 12 | /Ox /GL /LTCG |
Intel C++ (1) | 12 | 9 | /Ox /Og /GL |
Intel C++ (2) | 13 | 10 | /O3 /Og /QxN |
gcc + ATLAS | 16 | 53 | (colinux) |
gcc + ATLAS | 47 | 40 | (FreeBSD, PenIII 800) |
特筆すべきは gcc+ATLAS でコンパイルして colinux 上で実行したもので、このテストケースの要素数では死ぬ程遅くなってやがる…。別の計算機では、このような悪化は見られないので、 OS よりの問題のようだが…。
BLAS の利用だけじゃなくて、ループの廻しかたや境界条件処理も変えたから、一概には言えないが、 BLAS の所為というよりオブジェクトを返すようなコードになったことによる生成消滅のコストなんだろうか
colinux の件を、無名のオブジェクトの生成は諦めるとしても、その演算は減らす方向でオブジェクトの計算を明示的にバラしてみたらこうなった。
gcc + ATLAS | 16 | 9 | (colinux) |
こんなのをバラしたのが一番効いたようだ。
C = (A.f1()/a1 + A.f2()/a2 + A.f3()/a3) / B
しかし、見た目はかっちょ悪い。
さらに、元のコード(俺が書いたんぢゃねー)で、データクラスPの中に
for (int i=0;i<P.number();i++)
とか満載だったところを全部即値に修正。ここまで修正したら gcc で 7分台。さらにこれを windows へ持っていって Intel C++ でコンパイルしてやったら……
VC | Intel (2) | gcc (colinux) | |
BLASなし | 6 | 10 | 15 |
BLASあり | 6 | 5 | 7 |
という結果に(VCで変化がないように見えるが20秒弱短縮されてる)。
やっと BLAS の効果が出た&&Intel でコンパイルして速くなった。やれやれだぜ。しかし VC++ に対して 5/6 か…。
[referer: [an error occurred while processing this directive]]