我正在用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++