みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

OSによる演算速度の違い

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

OSによる演算速度の違い

投稿記事 by みけCAT » 12年前

この前、型による演算速度の違いという日記を書きました。
しかし、同じマシンでも、OSが違えば実行速度が違う、ということはあるのでしょうか?
では、試してみましょう。

検証環境
プロセッサ: Intel(R) Core(TM)2 Duo CPU T8100 @ 2.10GHz 2.10GHz
メモリ(RAM): 4.00GB

エントリーNo.1 : Windows Vista Home Premium Service Pack 2 / gcc4.7.2
エントリーNo.2 : Ubuntu 10.10 / gcc4.4.5
エントリーNo.3 : MIKO GNYO/LINUX 5.0 / gcc4.6.3

検証1 : 前の日記のコードを改良したコード
► スポイラーを表示
結果は、

CODE:

           空転 :   3079.913000ms
  long long加算 :   7006.405000ms
  long long減算 :   7002.811000ms
  long long乗算 :   9194.985000ms
  long long除算 :  13414.261000ms
となりました。やはり、この時long longの乗算は加減算より遅く、Windowsのlong longよりも遅くなりました。最適化がかかっていたようです。

続いて、実数を見てみましょう。
まず、Windowsの実数計算は、他に比べて全て遅いです。特に、Ubuntuと比べてもdoubleの遅さが目立ちます。
WindowsがUbuntuに勝っているのはlong doubleの除算だけです。多分誤差でしょう。横着して1回しか測定していないので。
そして、巫女ぐにょの実数計算は速いです。floatはUbuntuとそれほど変わりませんが、doubleとlong doubleがかなり速くなっています。
この結果が真実で実用的なら、おそらく巫女ぐにょでPrimeGridのLLRをすればWindowsよりかなり捗るでしょう。LLRは倍精度の実数が必要なようですから。
追記:実際に巫女ぐにょでPrimeGridをしてみましたが、実行速度はWindowsと全く変わりませんでした。
それにしても、なぜWindowsのdoubleはこんなに遅いのでしょうか…前の日記ではこんなに差がつかなかったのに、コンパイラの差でしょうか?それとも???

最後に、Three-way Branchを見てみましょう。
最適化なしではUbuntuよりWindowsの方がかなり遅いですが、最適化ありではWindowsの方が速いです。
おそらく、コンパイラがかなり改良されている、ということを意味しています。
そして、やっぱり巫女ぐにょは超速い!!!
この問題、本来は7秒以内に実行が終わらないと時間切れ失格なのですが、今回見た中で巫女ぐにょのみ制限をクリアしています。
最適化しなくても速いですし、最適化するとさらに速くなっています。
型ごとの演算速度で見た「(intの範囲)×(intの範囲)」のlong longの計算を多用しているコードのため、速くなったのでしょう。
ちなみにこのコードをAOJで実行した時のタイムは5.73秒でした。
(AOJの当時のスペックはDual Core Intel(R) Xeon(R) E3113 3GHz / gcc 4.3.0)

しかし、反省点があります。
それはOSによってgccのバージョンがバラバラだったこと。そのおかげで、おそらくOSの勝負ではなくgccの勝負になってしまいました。
Windowsでコンパイルしたアセンブリを用意したのですが、Ubuntuでコンパイルするときにエラーになってしまったので使用しませんでした。
次はコンパイルできるアセンブリを用意して実験したいと思います。
最後に編集したユーザー みけCAT on 2013年3月29日(金) 22:53 [ 編集 1 回目 ]
理由: 巫女ぐにょでPrimeGridをした結果を追記

コメントはまだありません。