MSVCRTというマイクロソフトの標準的なCランタイムライブラリ(msvcrt.dllやmsvcr90.dllなど)に「_set_SSE2_enable」という関数がある。この関数を使用することで、MSVCRT内のいくつかの関数がSSE2対応になり高速化される(ただし、初期値でONになっているため通常高速化のために_set_SSE2_enableを使う必要はない)。
今回は、いくつかのプロセッサとOSでSSE2をON/OFFした時に浮動小数点演算の関数が高速化されているかどうか、クロック数を測定して比較してみようと思う。なお、クロック数測定にはRdTscを用いている。
_set_SSE2_enable
MSVCRTの中で_set_SSE2_enableを用いて高速化できる関数は以下の関数とのこと。
- atan … アークタンジェント
- ceil … 切り上げ
- exp … 指数
- floor … 切り捨て
- log … 自然対数
- log10 … 10を底とした対数
- modf … 整数部、小数部の分割
- pow … 累乗
Math Performance
上記関数とさらにSoundEngineなどでもよく使うsin, cos, tan(サイン、コサイン、タンジェント)を加えて計測するアプリケーションを作成して測定してみた。測定では、1024個のランダムな値(64bit浮動小数点型の0.0〜1.0の値)に対して関数を実行し、それを1024セット行う。何度か行って、よくでる結果を測定結果とした。
Pentium-M
Pentium-M 1.3GHz、Windows XP ProfessionalのPCの測定結果
ceil, exp, floor, modfでSSE2を使用した時の高速化度合いが高い。他のCPUより古いため結果的にはそこそこといった感じだろうか。
Core 2 Duo
Core 2 Duo 2.4GHz(E6600)、Windows XP ProfessionalのPCの測定結果
ceil, exp, floor, modfの関数でSSE2を使用した時の高速化度合いが高く、logの関数は逆に遅くなっていることがわかる。また、他のCPUと比べSSE2を使用しない時のクロック数が低いようだ。
Xeon
Xeon 2.4GHz、Windows 2008 ServerのPCの測定結果
ceil, exp, floor, modfでSSE2を使用した時の高速化度合いが高くsin, cos, powもわりとよい。また、他のCPUと比べSSE2を使用しない時のクロック数が高いようだ。
Athlon 64 x2
Athlon 64 x2 2.2GHz(4200+)、Windowx XP x64のPCの測定結果
ceil, exp, floor, modfでSSE2を使用した時の高速化度合いが高い。また、他のCPUと比べSSE2を使用した時にどれも平均的に高速化されており、パフォーマンスもよい。
以上のように、パフォーマンスの良し悪しは、ライブラリとの相性などもあるので他のベンチとはまた違った結果になっていると思う。また、オンラインヘルプに記述されている_set_SSE2_enableで高速化する関数リスト以外の関数(sin, cos, tan)も高速化されているということがわかる。
次回はOpenMPあり・なしでどう高速化されるか見てみたいと思う。