Intel® Fortran Compiler XE 13.1 User and Reference Guides
This topic presents specific Fortran language features that better help to vectorize code. The SIMD vectorization feature is available for both Intel® microprocessors and non-Intel microprocessors. Vectorization may call library routines that can result in additional performance gain on Intel microprocessors than on non-Intel microprocessors. The vectorization can also be affected by certain options, such as /arch or /Qx (Windows) or -m or -x (Linux and OS X).
The __declspec(align(n)) declaration enables you to overcome hardware alignment constraints. The restrict qualifier and the auto-vectorization hints address the stylistic issues due to lexical scope, data dependency, and ambiguity resolution. The SIMD feature's directive allows you to enforce vectorization of loops.
The cDEC$ ATTRIBUTES VECTOR::FUNCTION-NAME-LIST and the cDEC$ ATTRIBUTES VECTOR[:CLAUSES]::FUNCTION-NAME-LIST directives can be used to vectorize user-defined functions and loops. For SIMD usage, the vector function is called from a loop that is being vectorized. The function must be implemented in vector operations as part of the loop.
Using array notations, you can write the same operation regardless of the size of the problem, and let the implementation use the right construct, combining SIMD, loops, and tasking to implement the operation. With these semantics, you can choose more elaborate programming and express a single dimensional operation at two levels, using both task constructs and array operations to force a preferred parallel and vector execution.
The usage model of the VECTOR directive option is that the code generated for the function actually takes a small section (VECTORLENGTH or VECTORLENGTHFOR) of the array, by value, and exploits SIMD parallelism, whereas the implementation of task parallelism is done at the call site.
The following table summarizes the language features that help vectorize code.
|
Language Feature |
Description |
|---|---|
|
cDEC$ ATTRIBUTES VECTOR::FUNCTION-NAME-LIST |
Combines with the map operation at the call site to provide the data parallel semantics. When multiple instances of the vector declaration are invoked in a parallel context, the execution order among them is not sequenced. |
|
cDEC$ ATTRIBUTES VECTOR |
Provides data parallel semantics by combining with the vectorized operations or loops at the call site. When multiple instances of the vector declaration are invoked in a parallel context, the execution order among them is not sequenced.
|
| Auto-vectorization Hints | |
|
!DIR$ IVDEP |
Instructs the compiler to ignore assumed vector dependencies. |
|
!DIR$ VECTOR [ALWAYS] |
Specifies how to vectorize the loop and indicates that efficiency heuristics should be ignored. Using the ASSERT keyword with the VECTOR [ALWAYS] directive generates an error-level assertion message saying that the compiler efficiency heuristics indicate that the loop cannot be vectorized. Use DIR$ IVDEP to ignore the assumed dependencies. |
|
!DIR$ NOVECTOR |
Specifies that the loop should never be vectorized. |
| User-mandated directive | |
|
!DIR$ SIMD |
Enforces vectorization of loops. |