Assembly 苏格兰和南方能源公司;非规范化是零”;选项

Assembly 苏格兰和南方能源公司;非规范化是零”;选项,assembly,x86,x86-64,Assembly,X86,X86 64,我刚刚通过使用\u mm\u setcsr(\u mm\u getcsr()| 0x40)设置此选项来尝试SSE选项“非规范值为零” 我发现了一件有趣的事情:当两个操作数都是非非规范的时,这并不能阻止SSE生成非规范化! 它只是使SSE考虑非正规操作数,好像它们是零。 正如我所解释的,我知道这个选项的作用。 但是这个选择有什么好处呢 补遗 我刚刚读了用户nucleon链接的。 我很好奇非规范化对SSE计算的性能影响 所以我写了一个小Windows程序来测试这个: #包括 #包括 #包括 使用名

我刚刚通过使用
\u mm\u setcsr(\u mm\u getcsr()| 0x40)
设置此选项来尝试SSE选项“非规范值为零”

我发现了一件有趣的事情:当两个操作数都是非非规范的时,这并不能阻止SSE
生成
非规范化!
它只是使SSE考虑非正规操作数,好像它们是零。
正如我所解释的,我知道这个选项的作用。
但是这个选择有什么好处呢


补遗 我刚刚读了用户nucleon链接的。 我很好奇非规范化对SSE计算的性能影响

所以我写了一个小Windows程序来测试这个:

#包括
#包括
#包括
使用名称空间std;
联合数据库
{
德沃德朗左值;
双重价值;
};
int main()
{
德沃德朗德尔提克;
DBL-d;
双和;
dwlTicks=uu rdtsc();
对于(d.dwlValue=0,sum=0.0;d.dwlValue<100000000;d.dwlValue++)
总和+=d.值;
dwlTicks=uu rdtsc()-dwlTicks;

cout表示,更严格的设置似乎是
刷新到零(FTZ)
。我的猜测是,使用非规范化作为输入操作数比使用普通操作数计算生成非规范化要昂贵。因此
非规范化为零(DAZ)
是一种折衷,它比非FTZ快,但比FTZ慢。最重要的是:如果使用FTZ,设置DAZ应该不会有任何效果,除非您访问在设置FTZ之前计算的非规范值。谢谢核子。英特尔的文章非常有趣!我更新了我的帖子,对非规范值进行了一些测试。另请参阅:。当它们运行缓慢时英特尔CPU,这是因为CPU陷阱到微码辅助。AMD CPU通常总是在硬件中处理它们,并且没有速度损失。