/fp:precise
と/fp:fast
フラグを使用するコードを調べていました。 /fp:precise
ためMSDN documentationによればStrange/fp浮動小数点モデルのフラグの動作
:
FP /付:正確なx86プロセッサ上で、コンパイラが割り当てとキャストのために適切な精度にfloat型の変数に丸めとにパラメータを渡すときに実行するには関数。この丸めによって、データがそのタイプの容量よりも大きな重要性を保持しないことが保証されます。/fp:preciseでコンパイルされたプログラムは、/ fp:preciseを除いてコンパイルされたプログラムよりも遅くて大きくなる可能性があります。/fp:exactは組み込み関数を無効にします。代わりに標準ランタイムライブラリルーチンが使用されます。詳細については、/ Oi(組み込み関数の生成)を参照してください。
0033185D cvtss2sd xmm0,xmm1 00331861 call __libm_sse2_sqrt_precise (0333370h) 00331866 cvtsd2ss xmm0,xmm0
this questionから、私は現代のx86/x64プロセッサは、80ビット・レジスタを(使用していないと考えている:(
x86/Win32
プラットフォームをターゲットに、/arch:SSE2
と呼ばれる)sqrtf
への呼び出しの解体を見てみると
または少なくとも彼らの使用を妨げる)ので、コンパイラは、私が次善のものであると想定するものを行い、64ビットの倍精度で計算を行います。また、組み込み関数が無効になっているので、ライブラリsqrtf関数が呼び出されます。
これで十分ですが、これはドキュメントに記載されている内容に準拠しているようです。
私はx64のアーチ用にコンパイルする場合しかし、奇妙な何かが起こる:
000000013F2B199E movups xmm0,xmm1
000000013F2B19A1 sqrtps xmm1,xmm1
000000013F2B19A4 movups xmmword ptr [rcx+rax],xmm1
計算は64ビット倍精度で実行されていない、と組み込み関数が使用されています。私が知る限り、結果は/fp:fast
フラグが使用された場合とまったく同じです。
なぜ2つの間に相違がありますか? /fp:precise
はx64プラットフォームでは動作しませんか?
ここで、健全性チェックとして、/fp:precise
と/arch:SSE2
というVS2010 x86で同じコードをテストしました。驚くべきことに、sqrtpd
の組み込み関数が使用されていました!
00AF14C7 cvtps2pd xmm0,xmm0
00AF14CA sqrtsd xmm0,xmm0
00AF14CE cvtpd2ps xmm0,xmm0
ここでは何が起こっていますか? VS2010がシステムライブラリを呼び出す間、VS2010は組み込み関数を使用するのはなぜですか?
x64プラットフォームをターゲットとしたVS2010のテストでは、VS2012(/fp:precise
は無視されているようです)と同様の結果が得られます。
古いバージョンのVSにはアクセスできないため、これらのプラットフォームでのテストはできません。
参考までに、私はインテルi5-m430プロセッサー搭載のWindows 7 64ビットでテストを行っています。
これは本当に奇妙です。私は '/ fp:precise'がコンパイラに中間体をより高い精度で裁量的に宣伝させることがあるという事実を知っています。しかし、それはここでのまったく矛盾を説明していません。 – Mysticial
"この質問から、私はx86アーチに80ビットレジスタがないと信じています。 –
奇妙な言葉遣い。その使用に対する一般的な推奨を明確にするために更新されました。 – helloworld922