Developer Guide and Reference

Contents

Setting the FTZ and DAZ Flags

In Intel® processors, the flush-to-zero (
FTZ
) and
denormals
-are-zero (
DAZ
) flags in the
MXCSR
register are used to control floating-point calculations. Intel® Streaming SIMD Extensions (Intel® SSE) and Intel® Advanced Vector Extensions (Intel® AVX) instructions, including scalar and vector instructions, benefit from enabling the
FTZ
and
DAZ
flags. Floating-point computations using the Intel® SSE and Intel® AVX instructions are accelerated when the
FTZ
and
DAZ
flags are enabled. This improves the application's performance.
Use the
[Q]ftz
option to flush
denormal
results to zero when the application is in the gradual underflow mode. This option may improve performance if the
denormal
values are not critical to the application's behavior. The
[Q]ftz
option, when applied to the main program, sets the
FTZ
and the
DAZ
hardware flags. The negative forms of the
[Q]ftz
option (
-no-ftz
for Linux* and macOS*, and
/Qftz-
for Windows*) leave the flags as they are.
The following table describes how the compiler processes
denormal
values based on the status of the
FTZ
and
DAZ
flags:
Flag
When set to ON, the compiler...
When set to OFF, the compiler...
Supported on
FTZ
...sets
denormal
results from floating-point calculations to zero.
...does not change the
denormal
results.
Intel® 64 and some IA-32 architectures
DAZ
...treats
denormal
values used as input to floating-point instructions as zero.
...does not change the
denormal
instruction inputs.
Intel® 64 and some IA-32 architectures
  • FTZ
    and
    DAZ
    are not supported on all IA-32 architectures. The
    FTZ
    flag is supported only on IA-32 architectures that support Intel® SSE instructions.
  • On systems based on the IA-32 and Intel® 64 architectures,
    FTZ
    only applies to Intel® SSE and Intel® AVX instructions. If the application generates
    denormals
    using x87 instructions,
    FTZ
    does not apply.
  • DAZ
    and
    FTZ
    flags are not compatible with the IEEE 754 standard, and should only be enabled when compliance to the IEEE standard is not required.
Options for
[Q]ftz
are performance options. Setting these options does not guarantee that all
denormals
in a program are flushed to zero. They only cause
denormals
generated at run-time to be flushed to zero.
On Intel® 64 and IA-32 systems, the compiler, by default, inserts code into the main routine to set the
FTZ
and
DAZ
flags. When the
[Q]ftz
option is used on IA-32 systems with the option
–msse2
or
/arch:sse2
, the compiler inserts code to that conditionally sets the
FTZ
/
DAZ
flags based on a run-time processor check. Using the negative form of
[Q]ftz
prevents the compiler from inserting any code that sets
FTZ
or
DAZ
flags.
When the
[Q]ftz
option is used in combination with an Intel® SSE-enabling option on systems based on the IA-32 architecture (for example,
-msse2
or
/arch:sse2
), the compiler inserts code in the main routine to set
FTZ
and
DAZ
. When the option
[Q]ftz
is used without an Intel® SSE-enabling option, the compiler inserts code that conditionally sets
FTZ
or
DAZ
based on a run-time processor check. The negative form of
[Q]ftz
prevents the compiler from inserting any code that might set
FTZ
or
DAZ
.
The
[Q]ftz
option only has an effect when the main program is being compiled. It sets the
FTZ
/
DAZ
mode for the process. The initial thread, and any subsequently created threads, operate in the
FTZ
/
DAZ
mode.
On systems based on Intel® 64 and IA-32 architectures, every optimization option
O
level, except
O0
, sets
[Q]ftz
.
If this option produces undesirable results of the numerical behavior of the program, turn the
FTZ
/
DAZ
mode off by using the negative form of
[Q]ftz
in the command line while still benefitting from the
O3
optimizations.
Manually set the flags with the following macros:
Feature
Examples
Enable
FTZ
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON)
Enable
DAZ
_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON)
The prototypes for these macros are in
xmmintrin.h
(
FTZ
) and
pmmintrin.h
(
DAZ
).