因此,有一个关于如何处理denorms的英特尔页面。(顺便说一句,我很清楚什么是正态分布,我对IEEE-754浮点标准相当熟悉。)
我有两个问题:
FTZ和DAZ位的系统调用(在Visual中)的名称是什么,以便denorms不会导致异常?FTZ (刷新为零)和DAZ (Denorms为零)位之间有什么区别?DAZ位只是一种解释吗?可控硅被认为是如此罕见,以至于没有必要在硅上进行适当的数字处理吗?为什么这些都有例外呢?(我想这是第三个问题。)
发布于 2016-12-01 02:26:16
在Windows上,您可以执行以下操作:
#include <mmintrin.h>
#define DISABLE_DENORMALS \
int oldMXCSR = _mm_getcsr(); /*read the old MXCSR setting */ \
int newMXCSR = oldMXCSR |= 0x8040; /* set DAZ and FZ bits */ \
_mm_setcsr( newMXCSR ); /* write the new MXCSR setting to the MXCSR */
#define RESTORE_DENORMALS \
_mm_setcsr( oldMXCSR );在Mac (或任何Posix系统)上,您可以这样做
#include <fenv.h>
#define DISABLE_DENORMALS \
fenv_t fenv; \
fegetenv(&fenv); \
fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);
#define RESTORE_DENORMALS \
fesetenv(&fenv);你可以用任何一个作为
processing_function(...)
{
DISABLE_DENORMALS
// signal processing code
RESTORE_DENORMALS
}对于没有反馈的计算,Denorms是非常罕见的;它们是相当退化的。你必须记住,它们对应的值非常小。对于任何计算,您实际上关心的是那些值不会被刷新为零,您可能也不关心处理的效率。
对于音频来说,将Denormals刷新为零是正确的做法;由于音频算法中的反馈结构趋于衰变,它们的出现频率也比人们预期的要高。
FTZ使得计算的结果被设置为零,如果结果是正态的;它确保你不生成正态。
DAZ使得你的计算的输入被视为零,如果它们是正态的;它确保如果传递给你的输入包含正态,你的计算不会慢下来。
https://softwareengineering.stackexchange.com/questions/337246
复制相似问题