2007-05-19から1日間の記事一覧

VC8とVC7の比較

気になるのが、VC7.1ではぶっちぎりに速い組み込み関数版が、VC8ではなぜそんなに遅いのか。コードを比較してみる。 ; process<1> (VC8) fld DWORD PTR _f$[ebp] fmul ST(0), ST(0) fstp DWORD PTR _f$[ebp] movss xmm0, DWORD PTR _f$[ebp] cvttss2si ecx, …

ベンチマーク

次の様なコードを書いてベンチマークを取りました。 #include <stdio.h> #include <stdlib.h> #include <xmmintrin.h> #include <windows.h> template<int N> int f2i(float f) { return (int)f; } template<> int f2i<1>(float f) { return _mm_cvttss_si32(_mm_load_ss(&f)); } template<> int f2i<2>(float f</int></windows.h></xmmintrin.h></stdlib.h></stdio.h>…

cvttss2si

仕方がないので、アセンブラにご登場いただくことに。 int f2i(float f) { _asm {cvttss2si eax, f} } int main(int argc, char* argv[]) { float f = atof(argv[1]); return f2i(f); } そうすると、意外にもコンパクトなコードが生成されました。 mov eax, …

_mm_cvttss_si32

かといって、過度に_asmしちゃうと、他の部分の最適化を妨害するわけで、それはやりたくない。と思って、いろいろ眺めていると、xmmintrin.hの組み込み関数の中に、_mm_cvttss_si32という奴がいることに気づいた。こいつは、SSEのcvttss2siの組み込み関数版…

float -> int キャスト

Visual C++では一般的に、 int main(int argc, char* argv[]) { float f = atof(argv[1]); return (int)f; } といった類の命令は遅いとされているが、実は、VC8では、この処理が高速化されたらしい。 ということで、VC8で、/Oxでビルドしてみた結果のコード…