2

我正在使用一些代码,这些代码使用内联 Intel X86_64 程序集来设置处理器的 SSE 标志,以包括 flush-denormal-to-zero 和 Treat-denormals-as-zero:stmxcsr然后ldmxcsr.

我不是特别喜欢这种方法(我们将其称为方法 1)。Wikipedia page on denormals建议了其他一些选项:

  1. 使用环境变量:
#include <fenv.h>
// ...
fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);
  1. 使用 XMM 寄存器的标头之一:
#include <xmmintrin.h>
// ...
_mm_setcsr( _mm_getcsr() | 0x0040 | 0x8000 );
  1. 使用更多标题和一些宏:
#include <pmmintrin.h>
_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
#include <xmmintrin.h>
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);

...但我也不太喜欢这些。它们不在任何通用/标准库中;当然,它们是特定于英特尔的。如果我在 ARM 上怎么办?我可能还想这样做。我也不确定其中哪些将与哪个编译器一起使用(维基百科说其中一些它们“可能工作”)。

那么,我应该如何最好地告诉我的处理器将非规范化刷新为零?

注意:我的问题并没有真正区分 C 和 C++。我对 C++ 习语感兴趣,但如果只有“C'ish”习语,我可以接受。

4

0 回答 0