mam*_*sun 3 floating-point x86 multithreading sse nan
我想启用临时FTZ/ DAZ模式,以获得一些代码,其中严格遵守性能增益IEEE 754标准是不是一个问题,在不改变其他线程,它可以执行的代码,其中,遵守是重要的行为.
我一直在阅读本关于如何启用/禁用这些模式和这对非规格化处理对性能的影响,但不幸的是我有在多线程环境下的混合代码,我不能让这些模式一劳永逸.
我的理解是,由于MXCSR寄存器的标志决定了硬件的行为,并且由于每个线程都有自己的寄存器上下文,因此设置这些标志只会影响当前线程的行为.
这是对的吗?
是的,MXCSR是上下文切换保存/恢复的每线程架构状态的一部分,以及xmm/ymm/zmm和x87堆栈寄存器(使用xsave/ xrstor).不同的线程有自己的FPU状态.
有趣的想法,我总是认为DAZ只有在你有非常规常量或某些东西(或文件中的数据)时才有用,但是让其他线程在没有FTZ的情况下运行是另一个非正规源.
您可能还希望使用-ffast-math这些选项或其中一部分编译一些文件.需要注意的是联同-ffast-math在GCC将包括CRT函数之前设置DAZ/FTZ main(),所以不这样做.
快速数学启用的优化大多与非正规数是否被刷新为正交.哪怕只是-fno-math-errno让更多的数学函数内联(更好的/不惜一切),例如sqrtf,是完全安全的,如果你不关心errno被设置,以及获得NaN的结果.