| Recommendation: Specify the expected loop trip count | Confidence: | Low |
| Recommendation: Disable unrolling | Confidence: | Medium |
| Recommendation: Use a smaller vector length | Confidence: | Medium |
| Recommendation: Align data | Confidence: | Medium |
| Recommendation: Add data padding | Confidence: | Medium |
| Windows* OS | Linux* OS |
|---|---|
| /Qopt-assume-safe-padding | -qopt-assume-safe-padding |
| Recommendation: Collect trip counts data | Confidence: | Need more data |
| Recommendation: Force vectorized remainder | Confidence: | Medium |
| Recommendation: Use the smallest data type | Confidence: | Low |
| Recommendation: Enable inline expansion | Confidence: | Low |
| Windows* OS | Linux* OS |
|---|---|
| Ob1 or Ob2 | -inline-level=1 or -inline-level=2 |
| Recommendation: Vectorize user function(s) inside loop | Confidence: | Low |
| Target | Directive |
|---|---|
| Source loop | !DIR$ SIMD or !$OMP SIMD |
| Inner function definition or declaration | !$OMP DECLARE SIMD |
| Recommendation: Convert to Fortran SIMD-enabled functions | Confidence: | Low |
| Target | Directive |
|---|---|
| Source loop | !DIR$ SIMD or !$OMP SIMD |
| Inner function definition or declaration | !$OMP DECLARE SIMD |
| Recommendation: Enable inline expansion | Confidence: | Low |
| Windows* OS | Linux* OS |
|---|---|
| Ob1 or Ob2 | -inline-level=1 or -inline-level=2 |
| Recommendation: Vectorize serialized function(s) inside loop | Confidence: | Medium |
| Target | Directive |
|---|---|
| Source loop | !DIR$ SIMD or !$OMP SIMD |
| Inner function definition or declaration | !$OMP DECLARE SIMD |
| Recommendation: Enable inline expansion | Confidence: | Low |
| Windows* OS | Linux* OS |
|---|---|
| Ob1 or Ob2 | -inline-level=1 or -inline-level=2 |
| Recommendation: Use the Intel short vector math library for vector intrinsics | Confidence: | High |
| Recommendation: Use a Glibc library with vectorized SVML functions | Confidence: | Low |
| Recommendation: Vectorize math function calls inside loops | Confidence: | Medium |
| Windows* OS | Linux* OS |
|---|---|
| /Qfast-transcendentals | -fast-transcendentals |
| Recommendation: Change the floating point model | Confidence: | Medium |
| Windows* OS | Linux* OS |
|---|---|
| /fp:fast | -fp-model fast |
| /fp:precise /Qfast-transcendentals | -fp-model precise -fast-transcendentals |
| Recommendation: Remove system function call(s) inside loop | Confidence: | Low |
| Recommendation: Move OpenMP call(s) outside the loop body | Confidence: | Low |
| Target | Directive |
|---|---|
| Outer section | !$OMP PARALLEL SECTIONS |
| Inner section | !$OMP DO NOWAIT |
| Recommendation: Remove OpenMP lock functions | Confidence: | Low |
| Recommendation: Remove indirect call(s) inside loop | Confidence: | Low |
| Recommendation: Improve branch prediction | Confidence: | Low |
| Recommendation: Confirm dependency is real | Confidence: | Need More Data |
| Recommendation: Resolve dependency | Confidence: | Low |
| Recommendation: Enable vectorization | Confidence: | Low |
| Directive | Outcome |
|---|---|
| !DIR$ SIMD or !$OMP SIMD | Ignores all dependencies in the loop |
| !DIR$ IVDEP | Ignores only vector dependencies (which is safest) |
| Recommendation: Decrease unroll factor | Confidence: | Low |
| Recommendation: Split loop into smaller loops | Confidence: | Low |
| Recommendation: Confirm inefficient memory access patterns | Confidence: | Need More Data |
| Recommendation: Use SoA instead of AoS | Confidence: | Low |
| Recommendation: Reorder loops | Confidence: | Low |
| Recommendation: Use the Fortran 2008 CONTIGUOUS attribute | Confidence: | Low |
| Recommendation: Target the AVX2 ISA | Confidence: | Low |
| Windows* OS | Linux* OS |
|---|---|
| /QxCORE-AVX2 or /QaxCORE-AVX2 | -xCORE-AVX2 or -axCORE-AVX2 |
| Recommendation: Target a specific ISA instead of using the xHost option | Confidence: | Low |
| Windows* OS | Linux* OS |
|---|---|
| /QxCORE-AVX2 or /QaxCORE-AVX2 | -xCORE-AVX2 or -axCORE-AVX2 |
| Recommendation: Explicitly enable FMA generation when using the strict floating-point model | Confidence: | Low |
| Windows* OS | Linux* OS |
|---|---|
| /Qfma | -fma |
| Recommendation: Force vectorization if possible | Confidence: | Low |
| Recommendation: Target a specific processor type | Confidence: | High |
| Recommendation: Specify the value of the underlying reference as linear | Confidence: | Low |
| Pattern | Description |
|---|---|
| Invariant | The instruction accesses values in the same memory throughout the loop. |
| Uniform (Horizontal Invariant) | The instruction accesses values in the same memory within the vector iteration. |
| Vertical Invariant | The instruction accesses the memory locations using the same offset across all vector iterations. |
| Unit | The instruction accesses values in contiguous memory throughout the loop, and the stride between vector iterations = vector length. |
| Recommendation: Refactor code with detected regular stride access patterns | Confidence: | Low |
| Variable | Pattern |
|---|---|
| block 0x19fa8866040 allocated at example.cpp:14 | Uniform (Horizontal Invariant) |
| Recommendation: Target the Intel AVX-512 ISA | Confidence: | Low |
| Windows* OS | Linux* OS |
|---|---|
| /QxCOMMON-AVX512 or /QaxCOMMON-AVX512 | -xCOMMON-AVX512 or -axCOMMON-AVX512 |
| Recommendation: Target the AVX-512 Exponential and Reciprocal Instructions ISA | Confidence: | Low |
| Windows* OS | Linux* OS |
|---|---|
| /QxMIC-AVX512 or /QaxMIC-AVX512 | -xMIC-AVX512 or -axMIC-AVX512 |
| Recommendation: Enable the use of approximate reciprocal instructions by fine-tuning precision and floating-point model compiler options | Confidence: | Low |
| Windows* OS | Linux* OS | Comment |
|---|---|---|
| /fp | -fp-model | -fp-model=precise prevents the use of approximate reciprocal instructions. |
| /Qimf-precision | -fimf-precision | Consider using -fimf-precision=medium or -fimf-precision=low . |
| /Qimf-accuracy-bits | -fimf-accuracy-bits | Consider decreasing this setting. |
| /Qimf-max-error | -fimf-max-error | Consider increasing this setting. There is a similar option: -fimf-absolute-error . Avoid using both options at the same time or tune them together. |
| /Qimf-absolute-error | -fimf-absolute-error | Consider using -fimf-max-error instead and set -fimf-absolute-error=0 (default) or increase this setting together with -fimf-max-error . |
| /Qimf-domain-exclusion | -fimf-domain-exclusion | Consider increasing this setting. More excluded classes enable more optimized code. USE WITH CAUTION. This option may cause incorrect behavior if your calculations involve excluded domains. |
| /Qimf-arch-consistency | -fimf-arch-consistency | -fimf-arch-consistency=true may prevent the use of approximate reciprocal instructions. |
| /Qprec-div | -prec-div | -prec-div prevents the use of approximate reciprocal instructions. |
| /Qprec-sqrt | -prec-sqrt | -prec-sqrt prevents the use of approximate reciprocal instructions. |
Intel, and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. *Other names and brands may be claimed as the property of others. © Intel Corporation