AO benchを実装してみた

Dycoon2009-02-21


Ambient Occlusionをレイトレースで求めるプログラムをいろんな環境に移植してみようという
AO benchというプロジェクトがあるようです。

http://lucille.atso-net.jp/aobench/

最近こちらのAO benchを自分で実装してどのくらい速度が出るかなどいろいろ試していました。
とりあえず実装してみたのをおいておきます。

  • VC++版をマルチスレッド化してみたもの(スレッド4本)(ソースコードおよび実行ファイル)

http://www.rmake.net/dycoon/files/aobench/aobench.zip

私の環境(Athlon X2 Dual 4800+ 2.42GHz)で2.1秒くらいかかっていたのが1.3秒くらいになりました。
QuadコアなCPUとかだともう少し速度が出るかもしれません。
Visual Studio 2005のVC++を使用しています。そろそろ2008に移行したいところではあります。

ただ、プロジェクトの趣旨が言語ごとでの性能の比較っぽいのでマルチスレッド化は趣旨に合わない
のではないかという気がしないでもありませんが。

  • 自分で使っているライブラリを使って実装したもの(スレッド4本)(実行ファイルのみ)

http://www.rmake.net/dycoon/files/aobench/aobenchDycClib3.zip

こちらは自分のライブラリを使って実装してみたものです。
1秒くらいで描画の計算が終わるようです。

計算精度がfloatなどの関係で速くなっているようです。
(計算も等価ではないのでそこら辺もあるかもしれません)

ただ、最初のうちは速度が出ず私のライブラリで計算したほうが遅いという結果になっていました。
アセンブルしてみるとメモリーへのStoreがやけに多い様子。

調べてみると、C++のコード生成で浮動小数点モデルをpreciseにしていると
関数などが値を返すときなどに、(inline関数であっても)
精度をfloatに落とすためにメモリーへのStoreをしているのではないかと思われました。

http://msdn.microsoft.com/ja-jp/library/e7s85ffb(VS.80).aspx

fastにすることでメモリーへのStoreを減らすことができ速度が得られるようになったようです。
Visual Studio 2008でも同様のオプションがあるようなのでVS2008でも通用しそうな話ではあります。

http://msdn.microsoft.com/ja-jp/library/e7s85ffb.aspx

AO benchを通してここら辺のことを気づくことができたのは有意義ではありました。