Fortranコンパイルオプションにはきをつけませう・・・

ごめんなさい・・・ほんとごめんなさい・・・||llorz


コンパイルオプションを甘く見ていました。
結構前に、コンパイルオプションを色々変えつつ姫野benchを実行してみたんですね。
でも、MFLOPSの値は、
ifort ****.f
の値より、オプションをつけて
ifort -xW -O3 ****.f
とかしたときの方が微遅だったんですよ。つけたほうが、少しMFLOPSが下がるか、同じくらいでした。
姫野ベンチで-xWとかつけると、loopがベクトル化されました、とかいうコンパイル時メッセージ(remark:LOOP WAS VECTORIIZED.)が出てはいたんですが・・・それでも少し落ちる、と。
つまり、あまりオプションつけても変わらないなー、むしろつけないほうが最適化されてていんじゃないの?とか思っちゃっていまして、結局今日の今日までオプションをつけずに過ごしていました。


今日、また色々試してみたんですが、同じような結果ではあったんです。
が。
姫野ベンチではなく、実際に動かす数値計算プログラムの方に、オプション付きコンパイルを適用したらば・・・

激             速

数値計算のループさせる数を数桁減らしてのお試し運転をやってみたんですね。そして、計測対象は、プログラムが始まってから終わるまでの、純粋な時間です。
CPUはPentium 4 2.8GHz Northwood。メモリはDDR PC2700 512MB。
コンパイルオプションの説明は、下の方にifort --helpから一部抜粋してあります。
結果としては
・オプションなし(ifort)・・・50sくらい
・オプションなしを2つ同時実行:各66sくらい
・ifort -O3・・・50sくらい
・ifort -xK -O3・・・50sくらい
・ifort -xB -O3・・・33sくらい
・ifort -xW -O3・・・27sくらい
・ifort -xW -O3を2つ同時実行:各78sくらい
です。もう、アホみたいに速くなっているのがお分かりかと思います。
ごめんなさい、以後-xW -O3でこれからはコンパイルするように勤めます。ビバ!ベクトル化!

ちなみに、Prescott用の-xPオプションでは、コンパイルはできましたが、実行すると
おんどりゃシステムのプロセッサで走るようになっとらんのじゃボケェ(註:意訳です)
と怒られます。そらNorthwoodですから。(*'-')


上に、2つ同時に実行した際のデータが入っていますが・・・その意味を言おうかなと。
オプションなしでコンパイルしていた当時、プログラムがベクトル化されずにいた訳ですので、HTの恩恵を十分に受けることができていないと思われる訳ですね。その結果、例えばGNOMEのシステムモニタなんぞを見ていると、CPUの稼働率が、片方しか100%になっていなかった訳です。
で、単純に「片方CPU空いているなら、同時に2つ走らせても大丈夫なんとちゃうやろか?」とか思い・・・走らせてみたのです。
結果・・・上のものを見てみると分かるように、オプションなしを2つ連続で走らせる(2*50s)より、同時に2つ実行(66s)した方が結構速くなってしまっていました。で、2つ同時に実行させるとGNOMEのシステムモニタでも、CPUの使用率が2CPUともに100%になっており、個人的には非常に満足していたわけです。

・・・本日。コンパイルオプションに気づいてから。ベクトル化オプションありのプロセスを2つ連続で走らせる(2*27s)のと、同時に2つ走らせる(78s)のを比べると・・・明らかに、連続で走らせた方が速くなっていますね。さらに、ベクトル化しない、オプションなしで2つ同時に走らせたとき(66s)よりさえもかなり速いです。ただ、GNOMEシステムモニタは片方しか100%いってませんでしたけど。
すごいんですねぇ、ベクトル化ってo...rz


結論:
コンパイルオプションは、実際に走らせるプログラムで試して決めましょう。
たりめーじゃねぇか!ヽ(;´д`)ノ


追伸:
PrescottのPCもあったので、-xWと-xPで比べてみましたが・・・あまり変わりませんでした。




ifort コンパイルオプション抜粋
-O1 enable optimizations (DEFAULT)
-O2 same as -O1
-O3 enable -O2 plus more aggressive optimizations that may not improve performance for all programs
-O0 disable optimizations
-O same as -O1
-ax generate code specialized for processors specified by while also generating generic IA-32 code. includes one or more of the following characters:
K Intel Pentium III and compatible Intel processors
W Intel Pentium 4 and compatible Intel processors
N Intel Pentium 4 and compatible Intel processors
P Intel processors code-named Prescott
B Intel Pentium M and compatible Intel processors
-x generate specialized code to run exclusively on processors indicated by as described above.
-xWと-xNの違いはなんじゃらほい?*1-xと-axの違いも、よく分かってないしー。

*1:今、もしかしてNorthwoodのNかWかどっち取るか決めかねたもの、という気がしてきた。