小编oyd*_*d11的帖子

浮点C++编译器选项| 防止a/b - > a*(1/b)

我正在用C++编写实时数字软件,目前用Visual-C++ 2008编译它.现在使用'快速'浮点模型(/fp:fast),各种优化,其中大部分都是有用的,但具体来说:

a/b -> a*(1/b) Division by multiplicative inverse
Run Code Online (Sandbox Code Playgroud)

对于我的很多计算来说,数字上太不稳定了.

(请参阅:Microsoft Visual C++浮点优化)

切换到/fp:precise使我的应用程序运行速度超过两倍.是否可以微调优化器(即禁用此特定优化),或以某种方式手动绕过它?

- 实际最小代码示例: -

void test(float a, float b, float c,
    float &ret0, float &ret1) {
  ret0 = b/a;
  ret1 = c/a;
} 
Run Code Online (Sandbox Code Playgroud)

[我的实际代码主要是矩阵相关算法]

输出:VC(cl,版本15,0x86)是:

divss       xmm0,xmm1 
mulss       xmm2,xmm0 
mulss       xmm1,xmm0 
Run Code Online (Sandbox Code Playgroud)

有一个div,而不是两个是数字上的一个大问题,(xmm0,从RAM预加载1.0f),因为取决于xmm1,2的值(可能在不同的范围内),你可能会失去很多精度(没有SSE编译,输出类似的stack-x87-FPU代码).

用函数包装函数

#pragma float_control( precise, on, push )
...
#pragma float_control(pop)
Run Code Online (Sandbox Code Playgroud)

是否解决了精度问题,但首先,它只能在功能级别(全局范围)上使用,其次,它会阻止函数内联,(即速度惩罚太高)

'精确'输出正在被来回'加倍'来回:

 divsd       xmm1,xmm2 
 cvtsd2ss    xmm1,xmm1 
 divsd       xmm1,xmm0 
 cvtpd2ps    xmm0,xmm1 
Run Code Online (Sandbox Code Playgroud)

c++ floating-point optimization floating-accuracy visual-c++

8
推荐指数
1
解决办法
1605
查看次数