Надежный портативный способ установить нулевые значения flush-denormals?
Я работаю с некоторым кодом, который использует встроенную сборку Intel X86_64 для установки флагов SSE процессора, чтобы включить flush-denormal-to-zero и Treat-denormals-as-zero: stmxcsr
а потом ldmxcsr
.
Мне не особенно нравится этот подход (который мы обозначим как подход 1). На странице Википедии о денормальных величинах предлагается несколько других вариантов:
- Использование переменной окружения:
#include <fenv.h>
// ...
fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);
- Используя один из заголовков регистров XMM:
#include <xmmintrin.h>
// ...
_mm_setcsr( _mm_getcsr() | 0x0040 | 0x8000 );
- Использование дополнительных заголовков и некоторых макросов:
#include <pmmintrin.h>
_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
#include <xmmintrin.h>
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
... но мне это тоже не очень нравится. Их нет ни в одной общей / стандартной библиотеке; и, конечно же, они специфичны для Intel. Что если я на ARM? Возможно, я все еще хочу это сделать. Я также не уверен, какие из них будут работать с каким компилятором (Википедия говорит о некоторых из них, что они "могут работать").
Итак, как мне лучше всего сказать моему процессору (-ам) сбросить денормальные значения в ноль?
Примечание. В моем вопросе нет различий между C и C++. Меня интересует идиома C++, но если есть только идиома "C'ish", я могу с ней жить.