齐零归零-是否可靠?

时间:2018-10-19 17:57:25

标签: optimization floating-point avx sse2 intel-ipp

对于信号处理,这一直是一个问题,永远如此,我仍然在采取预防措施,只要出现异常,例如,添加一个小常量,例如:

float coef = 0.9f;
for (int i=0; i<cnt; i++) dst[i] = state = state * 0.9f + 1E-15f;

这显然不是很理想,但是在过去,我遇到了很多问题,即使我尝试设置FTZ,它实际上显然也不能在某些计算机上运行。目前,我正在像这样使用Intel IPP:

ippSetDenormAreZeros(b);
const int success = ippSetFlushToZero(b, NULL) == ippStsNoErr;

那么这有多可靠?有没有更好的办法?一种可靠的方法?不幸的是,我需要像Core2duo,Windows和OSX一样支持所有古老的CPU。但是,我通常使用SSE2和更高版本以及CLANG和-mfpmath = sse和-ffast-math。

1 个答案:

答案 0 :(得分:0)

您通常说“”,但是x87数学在MXCSR中没有任何FTZ / DAZ位。只有SSE / AVX数学具有这些。因此,如果您曾经使用x87数学来编译旧的32位代码,由于硬件无法禁用渐进下溢,您可能仍然会因次标准而变慢。 (而且在没有SSE的NaN / Inf上x87也很慢)。

通常,与-ffast-math链接将使您的编译器链接进入设置那些MXCSR位的CRT启动代码中,但是在共享库函数中,除非您自己进行设置,否则不能假定它们将被设置。 (请记住,它们是每个线程的。我不确定新线程是从父线程继承还是以默认设置开头。)


对于使用独立的FP数学进行动态更改和函数调用的编译时重新排序,除非您在C中使用#pragma STDC FENV_ACCESS ON,否则编译器可以假设没有任何动态更改FP舍入模式。

但是根据Does FENV_ACCESS pragma exist in C++11 and higher?

,这仅存在于C语言中,而不存在于C ++中

实际上,编译器可能并不完美。我真的不知道希望其他人对此有更具体的答案。


但是,是的,设置了FTZ和DAZ时,运行SSE / AVX数学指令时,任何现有的x86硬件都不会出现任何FP辅助速度降低的情况。