代码之家  ›  专栏  ›  技术社区  ›  Vojtěch Melda Meluzín

刷新到零非规格化-它可靠吗?

  •  0
  • Vojtěch Melda Meluzín  · 技术社区  · 7 年前

    对于信号处理来说,这一直是一个问题,比如“永远正确”,我仍然在采取预防措施,在可能发生非规范化时添加一个小常数,例如:

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

    这显然是不理想的,但在过去,我有许多问题,即使我试图设置自由贸易区,它实际上没有工作在一些计算机上显然。目前我使用的英特尔IPP如下:

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

    那么这有多可靠呢?有更好的办法吗?可靠的方法?不幸的是,我需要像所有古老的cpu一样支持Core2duo、Windows和OSX。不过,我通常使用SSE2和更新的-mfpmath=sse和-ffast math。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Peter Cordes    7 年前

    您可以说“一般”,但x87 math在MXCSR中没有任何与FTZ/DAZ位等效的值。只有SSE/AVX数学有这些。因此,如果您曾经使用x87数学编译遗留的32位代码,您可能仍然会从次规范中得到慢化,因为硬件无法为它们禁用渐进下溢(x87在NaN/Inf上也很慢,而SSE则不是。)

    一般来说,与 -ffast-math


    至于使用独立的FP math动态更改和编译时重新排序函数调用,编译器可以假设没有任何东西会动态更改FP舍入模式,除非使用 #pragma STDC FENV_ACCESS ON

    Does FENV_ACCESS pragma exist in C++11 and higher?

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


    但是是的,有了FTZ和DAZ集,在运行SSE/AVX数学指令时,现有的x86硬件将不会有任何FP-assist慢化。