This article describes the Fortran language and OpenMP* features that are implemented in the Intel Fortran Compiler (ifx) by release.
The Intel® Fortran Compiler (ifx) version 2023.1.0, released in the Intel® oneAPI HPC Toolkit 2023.1, achieved feature parity with Intel® Fortran Compiler Classic (ifort). ifx is based on the Intel® Fortran Compiler Classic (ifort) frontend and runtime libraries, but uses LLVM-based backend compiler technology.
These features are now implemented in the Intel Fortran Compiler (ifx) 2023.2.0 which is part of oneAPI 2023.2.
- Completely implements FORTRAN 77, Fortran90/95, Fortran 2003, Fortran 2008 and Fortran 2018 language standards.
- Adds these OpenMP* 5.1/5.2 Features:
- ALLOCATORS directive
Specifies memory allocators to be used to allocate variables in the associated Fortran ALLOCATE statement and to use in
their deallocation. - TILE directive
Tiles (or blocks) one or more loops of a loop-nest. - Optional END DISPATCH directive on the DISPATCH construct
- END construct directives are now optional on OpenMP constructs that contain only a strictly-structured-block (a Fortran BLOCK construct).
- ALLOCATORS directive
Other useful information:
- ifx and ifort are binary (.o/.obj) and module file (.mod) compatible. Binaries and libraries generated with ifort can be linked with binaries and libraries built with ifx. .mod files generated with one compiler can be used by the other (64-bit targets only).
- Both compilers use the the same runtime libraries.
- ifx may or may not match performance of ifort compiled applications. Performance improvements will be coming in ifx with each update throughout 2023.
Similar information for Intel® oneAPI DPC++/C++ Compiler (DPCPP and ICX) regarding the OpenMP implementation.
Features Available in oneAPI 2023
Beginning with ifx version 2023.0.0 these Fortran standards are completely implemented:
- Fortran 95
- Fortran 2003
- Fortran 2008
- Fortran 2018
OpenMP 4.5
All features are implemented beginning with with oneAPI 2023.0 (compiler version 2023.0.0), except
- HINT clauses
- Privatization of variable-length arrays at the TEAMS level on GPU offload
OpenMP 5.0/5.1
(bold indicates new features in this release)
Feature | Status in Compiler Version 2023.2.0 | Status in Compiler Version 2023.1.0 | Status in Compiler Version 2023.0.0 |
---|---|---|---|
if (parallel: scalar-logical-expression) | Yes | Yes | Yes |
REDUCTION clause on TEAMS | Yes | Yes | Yes |
ALLOCATE clause | Yes | Yes | Yes |
!$omp loop | Yes | Yes | Yes |
!$omp teams loop (combined directive) | Yes | Yes | Yes |
!$omp parallel loop (combined directive) | Yes | Yes | Yes |
!$omp target teams loop (combined directive) | Yes | Yes | Yes |
!$omp parallel target teams loop (combined directive) | Yes | Yes | Yes |
NONTEMPORAL clause on !$omp simd | Yes | Yes | Yes |
IN_REDUCTION clause | Yes | Yes | Yes |
USE_DEVICE_ADDR clause | Yes | Yes | Yes |
TASK_REDUCTION clause on !$omp taskgroup | Yes | Yes | Yes |
!$omp allocate | Yes | Yes | Yes |
!$omp declare variant | Yes | Yes | Yes |
if (simd: scalar-logical-expression) | Yes | Yes | Yes |
!$omp scan | Yes | Yes | YES |
!$omp requires | Yes | Yes | Yes |
!$omp tile | Yes | No | No |
Metadirectives | No | No | No |
“task” reduction-modifier | Yes | Yes | Yes |
"scan" and "default" reduction-modifier | Yes | Yes | Yes |
“conditional” lastprivate-modifier | No | No | No |
ORDER clause (enabled on OMP LOOP) | Yes | Yes | YES |
"mutexinoutset" and "depobj” dependence-type | Yes | Yes | YES |
“in“, “out“ and “inout“ dependence-type | Yes | Yes | Yes |
AFFINITY clause | No | No | No |
DETACH clause | No | No | No |
USES_ALLOCATORS clause | No | No | No |
DECLARE MAPPER and mapper-identifier | No change | No change | for scalar variables, fixed length arrays |
DEVICE_TYPE clause | No | No | No |
!$omp parallel master (combined directive) | Yes | Yes | Yes |
!$omp master taskloop (combined directive) | Yes | Yes | Yes |
!$omp master taskloop simd (combined directive) | Yes | Yes | Yes |
!$omp parallel master taskloop (combined directive) | Yes | Yes | Yes |
!$omp parallel master taskloop simd (combined directive) | Yes | Yes | Yes |
!$omp parallel masked (combined directive) | Yes | Yes | Yes |
!$omp masked taskloop (combined directive) | Yes | Yes | Yes |
!$omp masked taskloop simd (combined directive) | Yes | Yes | Yes |
!$omp parallel masked taskloop (combined directive) | Yes | Yes | Yes |
!$omp parallel masked taskloop simd (combined directive) | Yes | Yes | Yes |
DEPEND clause on !$omp taskwait | No change | No change | DEPEND types mutexinoutset, inoutset, and depopbj |
“acq_rel“, “release“, “acquire“ and “relaxed” memory-order clauses on !$omp atomic | Yes | Yes | Yes |
"seq_cst" memory-order clause on !$omp atomic | Yes | Yes | Yes |
HINT clause on !$omp atomic | No | No | No |
“acq_rel“, “release“ and “acquire” memory-order clauses on !$omp flush | No | No | No |
!$omp depobj | Yes | Yes | YES |
if (cancel: scalar-logical-expression) | No | No | No |
FILTER clause on the MASKED construct | Yes | Yes | Yes |
UNROLL construct | Yes | Yes | Yes |
SCOPE construct | Yes | Yes | YES |
ASSUMES directive | Yes | YES | No |
ERROR directive | Yes | YES | No |
NOTHING directive | Yes | YES | No |
LINK and INDIRECT for directive DECLARE TARGET | Yes | YES | No |
Iterators in the DEPEND clause | Yes | YES | No |
Optional END construct directives with strictly structured block construct bodies | Yes | YES | No |
OpenMP 5.2
(bold indicates new features in this release)
Feature | Status in Compiler Version 2023.2.0 | Status in Compiler Version 2023.1.0 | Status in Compiler Version 2023.1.0 |
---|---|---|---|
Any clause allowed on an OpenMP END directive can be specified on the corresponding construct directive | No | No | No |
LINEAR clause changes, including the STEP modifier | No | No | No |
ENTER clause as a synonym for the TO clause on DECLARE TARGET | Yes | YES | No |
Metadirectives, ASSUME, NOTHING, ERROR, and loop transformation constructs are allowed in PURE procedures | No | No | No |
ALLOCATORS construct | YES | No | No |
Optional END DISPATCH directive | No | No | No |
Support ALLOCATE and FIRSTPRIVATE on the SCOPE directive | No | No | No |
The DOACROSS clause is a synonym for the DEPEND clause | No | No | No |
Allow dummy arguments as linear-step in a LINEAR clause of a DECLARE SIMD | No | No | No |
ORDER clause | No | No | No |
Optional maptype on TARGET ENTER|EXIT DATA directives | No | No | No |
OpenMP 6.0
(bold indicates new features in this release)
Feature | Status in Compiler Version 2023.2.0 | Status in Compiler Version 2023.1.0 | Status in Compiler Version 2023.0.0 |
---|---|---|---|
INTEROP on DISPATCH | Yes | Yes | YES |
PREFER_TYPE in the APPEND_ARGS clause of DECLARE VARIANT | Yes | Yes | YES |
Features in oneAPI 2022
Fortran 95
Fortran 95 is fully implemented, as are previous Fortran standards.
Fortran 2003
Implementation complete including parameterized derived types (PDTs) as of compiler version 2022.1.0.
Fortran 2008
Implementation is complete including coarrays as of compiler version 2022.2.0.
Fortran 2018
Feature | Status in Compiler Version 2022.2.0 | Status in Compiler Version 2022.1.0 | Status in Compiler Version 2022.0.0 |
---|---|---|---|
Coarray Features | |||
Coarray teams FORM TEAM, CHANGE TEAM construct, SYNC TEAM | YES | No | No |
Coarray intrinsics TEAM_NUMBER, GET_TEAM, STOPPED_IMAGES, FAIL_IMAGES, COSHAPE,and IMAGE_STATUS | YES | No | No |
TEAM and/or TEAM_NUMBER argument in NUM_IMAGES, IMAGE_INDEX, THIS_IMAGE intrinsic functions | YES | No | No |
TEAM or TEAM_NUMBER specifiers in image selectors | YES | No | No |
STAT and ERRMSG arguments to MOVE_ALLOC and specifiers in image selectors and in CRITICAL constructs | YES | No | No |
FAILed IMAGEs | YES | No | No |
Atomic subroutine | YES | No | No |
Collective subroutines | YES | No | No |
EVENTs | YES | No | No |
EXIT from a CRITICAL construct | YES | No | No |
Intrinsic Function Enhancements | |||
The DIM argument to the intrinsic functions ALL, ANY, IALL, IANY, IPARITY, MAXLOC, MAXVAL, MINLOC, MINVAL, NORM2, PARITY, PRODUCT, SUM, and THIS_IMAGE may now be a present OPTIONAL dummy argument. | Yes | YES | No |
VALUE dummy arguments to PURE procedures may appear in variable definition contexts. | Yes | YES | No |
ERRMSG argument to the intrinsic procedures GET_COMMAND_ARGUMENT, GET_ENVIRONMENT_VARIABLE, and GET_COMMAND | Yes | YES | No |
OUT_OF_RANGE intrinsic function | Yes | YES | No |
RANDOM_INIT intrinsic subroutine | Yes | YES | No |
REDUCE intrinsic function | No | No | No |
New form of CMPLX function without KIND= | Yes | YES | No |
SIGN function arguments can be of different KINDs | Yes | YES | No |
INTEGER and LOGICAL arguments to intrinsics need not be default kind | Yes | YES | No |
I/O Enhancements | |||
E and D, EN, ES, and G allow a field width of zero | Yes | YES | No |
The exponent width e in a data edit descriptor can now be zero. | Yes | YES | No |
The RN edit descriptor now rounds to nearest as specified by Fortran 2018 and ISO/IEC/IEEE 60559:2011. | Yes | YES | No |
The EX edit descriptor allows for hexadecimal data | Yes | YES | No |
SIZE= can be specified for non-advancing I/O | Yes | YES | No |
Execution/Control Enhancements | |||
QUIET specifier in STOP or ERROR STOP | Yes | YES | No |
Variable STOP and ERROR STOP codes | Yes | YES | No |
ERROR STOP in PURE procedures | Yes | YES | No |
VALUE Dummy argument of PURE procedure may be defined | Yes | YES | No |
Declaration/Specification Changes | |||
Constant properties of an object can be used in the objects initialization | Yes | YES | No |
Specification expressions can contain references to transformational intrinsics from IS0_C_BINDING, IEEE_ARITHMETIC, and IEEE_EXCEPTIONS intrinsic modules | Yes | YES | No |
Transformational intrinsic functions from the intrinsic modules ISO_C_BINDING, IEEE_ARITHMETIC, and IEEE_EXCEPTIONS are now allowed in specification expressions | Yes | YES | No |
Defined assignment and operator procedure dummy arguments with VALUE attribute need not be INTENT(IN) | Yes | YES | No |
Implied-do loop of array constructors and data statements can specify loop variable kind and type. | Yes | YES | No |
IMPLICIT NONE (EXTERNAL) | Yes | YES | No |
GENERIC statement can be used to declare generic interfaces | Yes | YES | No |
Locality of variables on a DO CONCURRENT statement | YES | No | No |
Non-standard intrinsics and module are diagnosed as non-standard | Yes | YES | No |
IMPORT ALL, IMPORT NONE, and IMPORT ONLY in internal procedures and BLOCK constructs | Yes | YES | No |
Module names in PUBLIC and PRIVATE statements | Yes | YES | No |
NON_RECURSIVE keyword | Yes | YES | No |
Default recursion (when assume recursion option specified) | Yes | YES | No |
ISO/IEC/IEEE 754 2011 Floating Point Bindings | |||
assume ieee_compare option for floating point compares with signaling NaNs | Yes | Yes | Yes |
New procedures: IEEE_SET_ROUNDING_MODE, IEEE_FMA, IEEE_SIGNBIT, IEEE_NEXT_UP, IEEE_NEXT_DOWN, IEEE_GET_MODES and IEEE_SETMODES, IEEE_MAX_NUM, IEEE_MAX_NUM_MAG, IEEE_MIN_NUM, IEEE_MIN_NUM_MAG, IEEE_QUIET_EQ, ITTE_QUIET_GE, IEEE_QUIET_GT, IEEE_QUIET_LE, IEEE_QUIET_LT, IEEE_QUIET_NE, IEEE_SIGNALING_EQ, IEEE_SIGNALING_GE, IEEE_SIGNALING_GT, IEEE_SIGNALING_LE, IEEE_SIGNALING_LT, IEEE_QUIET_NE, IEEE_SIGNALING_NE, IEEE_INT and IEEE_REAL, and IEEE_SUPPORT_NORMAL | YES | No | No |
Named constants IEEE_ROUND_TYPE and IEEE_AWAY added to IEEE_ARITHMETIC intrinsic module | YES | No | No |
Optional ROUND argument to the IEEE_RINT function | YES | No | No |
Derive type IEEE_EXCEPTIONS defined in module IEEE_EXCEPTIONS | YES | No | No |
SUBNORMAL is synonymous with DENORMAL | YES | No | No |
Optional RADIX argument to IEEE_GET_ROUNDING_MODE and IEEE_SET_ROUNDING_MODE | YES | No | No |
Enhanced C Interoperability | |||
C_PTRDIFF_T kind type in ISO_C_BINDING | Yes | YES | No |
All intrinsic procedures in ISO_C_BINDING except C_F_PROCPOINTER are PURE | Yes | Yes | Yes |
Assumed rank arrays and types | Yes | Yes | Yes |
SELECT RANK construct | Yes | Yes | Yes |
Language Evolution | |||
Non-block DO and arithmetic IF are deleted features (retained as Intel extensions) | Yes | Yes | Yes |
COMMON, EQUIVALENCE, and BLOCKDATA are obsolescent | Yes | Yes | Yes |
Labeled form a DO loop is obsolescent | Yes | Yes | Yes |
Specific names of procedures are obsolescent | Yes | Yes | Yes |
OpenMP 4.5
All features are implemented beginning with the oneAPI 2021.4 release (compiler version 2021.3.0), except nowait, depend, hint clauses and depend clause modifiers. complex type for reduction is implemented in the compiler version 2022.2.0.
OpenMP 5.0/5.1
Feature | Status in Compiler Version 2022.2.0 | Status in Compiler Version 2022.1.0 | Status in Compiler Version 2022.0.0 |
---|---|---|---|
if (parallel: scalar-logical-expression) | Yes | Yes | Yes |
REDUCTION clause on TEAMS | Yes | Yes | Yes |
ALLOCATE clause | Yes | Yes | Yes |
!$omp loop | Yes | Yes | Yes |
!$omp teams loop (combined directive) | Yes | Yes | Yes |
!$omp parallel loop (combined directive) | Yes | Yes | Yes |
!$omp target teams loop (combined directive) | Yes | Yes | Yes |
!$omp parallel target teams loop (combined directive) | Yes | Yes | Yes |
NONTEMPORAL clause on !$omp simd | Yes | Yes | Yes |
IN_REDUCTION clause | Yes | Yes | Yes |
USE_DEVICE_ADDR clause | Yes | Yes | Yes |
TASK_REDUCTION clause on !$omp taskgroup | Yes | Yes | Yes |
!$omp allocate | Yes | Yes | Yes |
!$omp declare variant | Yes | Yes | Yes |
if (simd: scalar-logical-expression) | YES | No | No |
!$omp scan | No | No | No |
!$omp requires | Yes | Yes | Yes |
Metadirectives | No | No | No |
“task” reduction-modifier | Yes | Yes | Yes |
"scan" and "default" reduction-modifier | Yes | Yes | Yes |
“conditional” lastprivate-modifier | No | No | No |
ORDER clause (enabled on OMP LOOP) | No | No | No |
"mutexinoutset" and "depobj” dependence-type | No | No | No |
“in“, “out“ and “inout“ dependence-type | Yes | Yes | Yes |
AFFINITY clause | No | No | No |
DETACH clause | No | No | No |
USES_ALLOCATORS clause | No | No | No |
DECLARE MAPPER and mapper-identifier | for scalar variables | for scalar variables | No |
DEVICE_TYPE clause | No | No | No |
!$omp parallel master (combined directive) | Yes | Yes | Yes |
!$omp master taskloop (combined directive) | Yes | Yes | Yes |
!$omp master taskloop simd (combined directive) | Yes | Yes | Yes |
!$omp parallel master taskloop (combined directive) | Yes | Yes | Yes |
!$omp parallel master taskloop simd (combined directive) | Yes | Yes | Yes |
!$omp parallel masked (combined directive) | Yes | Yes | Yes |
!$omp masked taskloop (combined directive) | Yes | Yes | Yes |
!$omp masked taskloop simd (combined directive) | Yes | Yes | Yes |
!$omp parallel masked taskloop (combined directive) | Yes | Yes | Yes |
!$omp parallel masked taskloop simd (combined directive) | Yes | Yes | Yes |
DEPEND clause on !$omp taskwait | No | No | No |
“acq_rel“, “release“, “acquire“ and “relaxed” memory-order clauses on !$omp atomic | Yes | Yes | Yes |
"seq_cst" memory-order clause on !$omp atomic | Yes | Yes | Yes |
HINT clause on !$omp atomic | No | No | No |
“acq_rel“, “release“ and “acquire” memory-order clauses on !$omp flush | No | No | No |
!$omp depobj | No | No | No |
if (cancel: scalar-logical-expression) | No | No | No |
FILTER clause on the MASKED construct | YES | No | No |
UNROLL construct | YES | No | No |
Features in oneAPI 2021
Fortran 95
Fortran 95 is fully implemented, as are previous Fortran standards.
Fortran 2003
SUMMARY: Implementation complete with the exception of parameterized derived types and user defined I/O (also known as derive type I/O or recursive I/O).
Feature | Status in 2021.4.x | Status in 2021.3.x | Status in 2021.2.x | Status in 2021.1.x |
---|---|---|---|---|
Data Enhancements and Object Orientation | ||||
Parameterized derived types | No | No | No | No |
Procedure pointers | No | No | No | No |
Finalization | Yes | Yes | Yes | Yes* |
Procedures bound by name to a type | Yes | Yes | Yes | Yes |
The PASS attribute | Yes | Yes | Yes | Yes |
Procedures bound to a type as operators | Yes | Yes | Yes | Yes* |
Type extension | Yes | Yes | Yes | Yes |
Overriding a type-bound procedure | Yes | Yes | Yes | Yes |
Enumerations | Yes | Yes | Yes | Yes |
ASSOCIATE construct | Yes | Yes | Yes | Yes* |
Typed polymorphic entities | Yes | Yes | Yes | Yes* |
Unlimited polymorphic entities | Yes | Yes | Yes | No |
SELECT TYPE construct | Yes | Yes | Yes | Yes |
Deferred bindings and abstract types | Yes | Yes | Yes | Yes |
Allocatable scalars | Yes | Yes | Yes | Yes |
Deferred-length allocatable scalars | Yes | Yes | Yes | Yes |
Miscellaneous Enhancements | ||||
Structure constructors | Yes | Yes | Yes | No |
Generic procedure interfaces named as type | Yes | Yes | Yes | Yes |
The ALLOCATE statement | Yes | Yes | Yes | Yes |
Assignment to an allocatable array | Yes | Yes | Yes | Yes |
Transferring an allocation | Yes | Yes | Yes | Yes |
Assignment to an allocatable array | Yes | Yes | Yes | Yes |
Transferring an allocation | Yes | Yes | Yes | Yes |
More control of access from a module | Yes | Yes | Yes | Yes |
Renaming operators on the USE statement | Yes | Yes | Yes | Yes |
Pointer assignment | Yes | Yes | Yes | Yes |
Pointer INTENT | Yes | Yes | Yes | No |
The VOLATILE attribute | Yes | Yes | No | No |
The IMPORT statement | Yes | Yes | Yes | Yes |
Intrinsic modules | Yes | Yes | Yes | Yes |
Access to the computing environment | Yes | Yes | Yes | Yes |
Support for international character sets | No | No | No | No |
Lengths of names and statements | Yes | Yes | Yes | Yes |
Binary, octal and hex constants | Yes | Yes | Yes | Yes |
Array constructor syntax | Yes | Yes | Yes | Yes |
Specification and initialization expressions | Yes | Yes | Yes | Yes |
Complex constants | Yes | Yes | Yes | Yes |
Changes to intrinsic functions | Yes | Yes | Yes | No |
Controlling IEEE underflow | Yes | Yes | Yes | No |
Another IEEE class value | No | No | No | No |
Input/Output Enhancements | ||||
Derived type input/output | No | No | No | No |
Asynchronous input/output | Yes | Yes | No | No |
FLUSH statement | Yes | Yes | Yes | Yes |
IOMSG= specifier | Yes | Yes | Yes | Yes |
Stream access input/output | Yes | Yes | Yes | Yes |
ROUND= specifier | Yes | Yes | Yes | Yes |
DECIMAL= specifier | Yes | Yes | Yes | Yes |
SIGN= specifier | Yes | Yes | Yes | Yes |
Kind type parameters of integer specifiers | Yes | Yes | Yes | Yes |
Recursive input/output | Yes | Yes | Yes | Yes |
Intrinsic function for newline character | Yes | Yes | Yes | Yes |
Input and output of IEEE exceptional values | Yes | Yes | Yes | Yes |
Comma after a P edit descriptor | Yes | Yes | Yes | Yes |
Interoperability with C | ||||
Interoperability of intrinsic types | Yes | Yes | Yes | Yes |
Interoperability with C pointers | Yes | Yes | Yes | Yes |
Interoperability of derived types | Yes | Yes | Yes | Yes** |
Interoperability of variables | Yes | Yes | Yes | Yes |
Interoperability of procedures | Yes | Yes | Yes | Yes |
Interoperability of global data | Yes | Yes | Yes | Yes |
Yes* implies that there are known bugs.
Yes** with the exception of passing derived types by value to C structs
Fortran 2008
SUMMARY: Implementation is complete with the exception of coarrays and POINTER result functions used as variables.
Feature | Status in 2021.4.x | Status in 2021.3.x | Status in 2021.2.x | Status in 2021.1.x |
---|---|---|---|---|
Coarrays | No | No | No | No |
Allocatable or pointer components of derived type coarrays | No | No | No | No |
Performance Enhancements | ||||
do concurrent | Yes, serial only | Yes, serial only | Yes, serial only | Yes, serial only |
Contiguous attribute | Yes | Yes | Yes | Yes |
Simply contiguous arrays | Yes | Yes | Yes | Yes |
Data Declaration | ||||
Maximum rank + corank <= 15 | Yes | Yes | Yes | Yes |
Long integers (18 digits or 64 bits) | Yes | Yes | Yes | Yes |
Allocatable components of recursive type | Yes | Yes | Yes | No |
Implied-shape array | Yes | Yes | Yes | Yes |
Pointer initialization | Yes | Yes | No | No |
Data statement restrictions lifted | Yes | Yes | Yes | Yes |
Kind of a forall index | Yes | Yes | Yes | Yes |
Type statement for intrinsic types TYPE (intrinsic type) specifier | Yes | Yes | Yes | Yes |
Declaring type-bound procedures | No | No | No | No |
Value attribute is permitted for any nonallocatable nonpointer noncoarray | Yes | Yes | Yes | Yes |
In pure procedure intent of an argument with VALUE attribute not needed | Yes | Yes | Yes | Yes |
Allocating a polymorphic variable | No | No | No | No |
Accessing Data Objects | ||||
Accessing real and imaginary parts | Yes | Yes | Yes | Yes |
Pointer function reference is a variable | No | No | No | |
Elemental dummy arguments restrictions lifted | Yes | Yes | Yes | Yes |
Input/Output | ||||
Finding a unit when opening a file | Yes | Yes | Yes | Yes |
g0 edit descriptor | No | No | No | No |
Unlimited format item | Yes | Yes | Yes | No |
Recursive input/output | No | No | No | No |
Execution Control | ||||
The block construct | Yes | No | No | No |
Exit statement | Yes | Yes | Yes | No |
Stop code | Yes | Yes | Yes | Yes |
ERROR STOP | Yes | Yes | Yes | Yes |
Intrinsic Procedures for Bit Processsing | ||||
Bit sequence comparison | Yes | Yes | Yes | Yes |
Combined shifting | No | No | No | No |
Counting bits | Yes | Yes | Yes | Yes |
Masking bits | Yes | Yes | Yes | Yes |
Shifting bit | Yes | Yes | Yes | No |
Merging bits | Yes | Yes | Yes | No |
Bit transformational functions | Yes | Yes | Yes | No |
Intrinsic Procedures and Modules | ||||
Storage size | Yes | Yes | Yes | Yes |
Optional argument radix added to selected real kind | Yes | Yes | Yes | Yes |
Extensions to trigonometric and hyperbolic intrinsic functions | No | No | No | No |
Selecting a real kind | Yes | Yes | Yes | Yes |
Hyperbolic intrinsic functions | Yes | Yes | Yes | Yes |
Bessel functions | Yes | Yes | No | No |
Error and gamma functions | Yes | Yes | Yes | Yes |
Euclidean vector norm | No | No | No | No |
Parity | Yes | Yes | Yes | Yes |
Execute command line | Yes | No | No | No |
BACK argument to MINLOC and MAXLOC | Yes | No | No | No |
Find location in an array | Yes | No | No | No |
String comparison | Yes | Yes | Yes | No |
Constants | Yes | Yes | Yes | Yes |
COMPILER_VERSION | Yes | Yes | Yes | Yes |
COMPILER_OPTIONS | Yes | Yes | Yes | Yes |
Function for C sizeof | Yes | Yes | Yes | Yes |
Added optional argument for ieee_selected_real_kind | Yes | Yes | Yes | Yes |
Programs and Procedures | ||||
SAVE attribute for module and submodule data | Yes | Yes | Yes | No |
Empty contains section | Yes | Yes | Yes | Yes |
Form of the end statement for an internal or module procedure | Yes | Yes | Yes | Yes |
Internal procedure as an actual argument | Yes | Yes | Yes | Yes |
Generic resolution by pointer or allocatable attribute | Yes | Yes | Yes | No |
Null pointer or unallocated allocatable as a missing dummy argument | Yes | Yes | Yes | No |
Elemental procedures that are not pure | Yes | Yes | Yes | Yes |
Entry statement becomes obsolescent | Yes | Yes | Yes | Yes |
Source Form | ||||
Semicolon at line start | Yes | Yes | Yes | Yes |
Fortran 2018
Feature | Status in 2021.4.x | Status in 2021.3.x | Status in 2021.2.x | Status in 2021.1.x |
---|---|---|---|---|
Coarray Features | ||||
Coarray teams FORM TEAM, CHANGE TEAM construct, SYNC TEAM | No | No | No | No |
Coarray intrinsics TEAM_NUMBER, GET_TEAM, STOPPED_IMAGES, FAIL_IMAGES, COSHAPE,and IMAGE_STATUS | No | No | No | No |
TEAM and/or TEAM_NUMBER argument in NUM_IMAGES, IMAGE_INDEX, THIS_IMAGE intrinsic functions | No | No | No | No |
TEAM or TEAM_NUMBER specifiers in image selectors | No | No | No | No |
STAT and ERRMSG arguments to MOVE_ALLOC and specifiers in image selectors and in CRITICAL constructs | No | No | No | No |
FAILed IMAGEs | No | No | No | No |
Atomic subroutine | No | No | No | No |
Collective subroutines | No | No | No | No |
EVENTs | No | No | No | No |
EXIT from a CRITICAL construct | No | No | No | No |
Intrinsic Function Enhancements | ||||
The DIM argument to the intrinsic functions ALL, ANY, IALL, IANY, IPARITY, MAXLOC, MAXVAL, MINLOC, MINVAL, NORM2, PARITY, PRODUCT, SUM, and THIS_IMAGE may now be a present OPTIONAL dummy argument. | No | No | No | No |
VALUE dummy arguments to PURE procedures may appear in variable definition contexts. | No | No | No | No |
ERRMSG argument to the intrinsic procedures GET_COMMAND_ARGUMENT, GET_ENVIRONMENT_VARIABLE, and GET_COMMAND | No | No | No | No |
OUT_OF_RANGE intrinsic function | No | No | No | No |
RANDOM_INIT intrinsic subroutine | No | No | No | No |
REDUCE intrinsic function | No | No | No | No |
New form of CMPLX function without KIND= | No | No | No | No |
SIGN function arguments can be of different KINDs | No | No | No | No |
INTEGER and LOGICAL arguments to intrinsics need not be default kind | No | No | No | No |
I/O Enhancements | ||||
E and D, EN, ES, and G allow a field width of zero | No | No | No | No |
The exponent width e in a data edit descriptor can now be zero. | No | No | No | No |
The RN edit descriptor now rounds to nearest as specified by Fortran 2018 and ISO/IEC/IEEE 60559:2011. | No | No | No | No |
The EX edit descriptor allows for hexadecimal data | No | No | No | No |
SIZE= can be specified for non-advancing I/O | No | No | No | No |
Execution/Control Enhancements | ||||
QUIET specifier in STOP or ERROR STOP | No | No | No | No |
Variable STOP and ERROR STOP codes | No | No | No | No |
ERROR STOP in PURE procedures | No | No | No | No |
VALUE Dummy argument of PURE procedure may be defined | No | No | No | No |
Declaration/Specification Changes | ||||
Constant properties of an object can be used in the objects initialization | No | No | No | No |
Specification expressions can contain references to transformational intrinsics from IS0_C_BINDING, IEEE_ARITHMETIC, and IEEE_EXCEPTIONS intrinsic modules | No | No | No | No |
Transformational intrinsic functions from the intrinsic modules ISO_C_BINDING, IEEE_ARITHMETIC, and IEEE_EXCEPTIONS are now allowed in specification expressions | No | No | No | No |
Defined assignment and operator procedure dummy arguments with VALUE attribute need not be INTENT(IN) | No | No | No | No |
Implied-do loop of array constructors and data statements can specify loop variable kind and type. | No | No | No | No |
IMPLICIT NONE (EXTERNAL) | No | No | No | No |
GENERIC statement can be used to declare generic interfaces | No | No | No | No |
Locality of variables on a DO concurrent statement | No | No | No | No |
Non-standard intrinsics and module are diagnosed as non-standard | No | No | No | No |
IMPORT ALL, IMPORT NONE, and IMPORT ONLY in internal procedures and BLOCK constructs | No | No | No | No |
Module names in PUBLIC and PRIVATE statements | No | No | No | No |
NON_RECURSIVE keyword | No | No | No | No |
Default recursion (when assume recursion option specified) | No | No | ||
ISO/IEC/IEEE 754 2011 Floating Point Bindings | ||||
assume ieee_compare option for floating point compares with signaling NaNs | Yes | No | No | No |
New procedures: IEEE_SET_ROUNDING_MODE, IEEE_FMA, IEEE_SIGNBIT, IEEE_NEXT_UP, IEEE_NEXT_DOWN, IEEE_GET_MODES and IEEE_SETMODES, IEEE_MAX_NUM, IEEE_MAX_NUM_MAG, IEEE_MIN_NUM, IEEE_MIN_NUM_MAG, IEEE_QUIET_EQ, ITTE_QUIET_GE, IEEE_QUIET_GT, IEEE_QUIET_LE, IEEE_QUIET_LT, IEEE_QUIET_NE, IEEE_SIGNALING_EQ, IEEE_SIGNALING_GE, IEEE_SIGNALING_GT, IEEE_SIGNALING_LE, IEEE_SIGNALING_LT, IEEE_QUIET_NE, IEEE_SIGNALING_NE, IEEE_INT and IEEE_REAL, and IEEE_SUPPORT_NORMAL | No | No | No | No |
Named constants IEEE_ROUND_TYPE and IEEE_AWAY added to IEEE_ARITHMETIC intrinsic module | No | No | No | No |
Optional ROUND argument to the IEEE_RINT function | No | No | No | No |
Derive type IEEE_EXCEPTIONS defined in module IEEE_EXCEPTIONS | No | No | No | No |
SUBNORMAL is synonymous with DENORMAL | No | No | No | No |
Optional RADIX argument to IEEE_GET_ROUNDING_MODE and IEEE_SET_ROUNDING_MODE | No | No | No | No |
Enhanced C Interoperability | ||||
C_PTRDIFF_T kind type in ISO_C_BINDING | '[No | No | No | No |
All intrinsic procedures in ISO_C_BINDING except C_F_PROCPOINTER are PURE | No | No | No | No |
Assumed rank arrays and types | No | No | No | No |
SELECT RANK construct | No | No | No | No |
Language Evolution | ||||
Non-block DO and arithmetic IF are deleted features (retained as Intel extensions) | No | No | No | No |
COMMON, EQUIVALENCE, and BLOCKDATA are obsolescent | No | No | No | No |
Labeled form a DO loop is obsolescent | No | No | No | No |
Specific names of procedures are obsolescent | No | No | No | No |
OpenMP 4.5
All features were implemented in the 2021.4.0 release, except nowait, depend, hint clauses, complex type for reduction and depend clause modifiers.
OpenMP 5.0/5.1
Feature | Status in 2021.4.x | Status in 2021.3.x | Status in 2021.2.x | Status in 2021.1.x |
---|---|---|---|---|
if (parallel: scalar-logical-expression) | Yes | Yes | Yes | Yes |
REDUCTION clause on TEAMS | Yes | Yes | Yes | Yes |
ALLOCATE clause | Yes | Yes | Yes | Yes |
!$omp loop | Yes | Yes | Yes | Yes |
!$omp teams loop (combined directive) | Yes | Yes | Yes | Yes |
!$omp parallel loop (combined directive) | Yes | Yes | Yes | Yes |
!$omp target teams loop (combined directive) | Yes | Yes | Yes | Yes |
!$omp parallel target teams loop (combined directive) | Yes | Yes | Yes | Yes |
NONTEMPORAL clause on !$omp simd | Yes | Yes | Yes | Yes |
IN_REDUCTION clause | Yes | No | No | No |
USE_DEVICE_ADDR clause | Yes | Yes | Yes | Yes |
TASK_REDUCTION clause on !$omp taskgroup | Yes | Yes | Yes | Yes |
!$omp allocate | Yes | Yes | Yes | No |
!$omp declare variant | Yes | Yes | Yes* | No |
if (simd: scalar-logical-expression) | No | No | No | No |
!$omp scan | No | No | No | No |
!$omp requires | No | No | No | No |
Metadirectives | No | No | No | No |
“task” reduction-modifier | No | No | No | No |
"scan" and "default" reduction-modifier | Yes | Yes | Yes | Yes |
“conditional” lastprivate-modifier | No | No | No | No |
ORDER clause (enabled on OMP LOOP) | No | No | No | No |
"mutexinoutset" and "depobj” dependence-type | No | No | No | No |
“in“, “out“ and “inout“ dependence-type | Yes | Yes | Yes | Yes |
AFFINITY clause | No | No | No | No |
DETACH clause | No | No | No | No |
USES_ALLOCATORS clause | No | No | No | No |
DECLARE MAPPER and mapper-identifier | No | No | No | No |
DEVICE_TYPE clause | No | No | No | No |
!$omp parallel master (combined directive) | Yes | No | No | No |
!$omp master taskloop (combined directive) | Yes | No | No | No |
!$omp master taskloop simd (combined directive) | Yes | No | No | No |
!$omp parallel master taskloop (combined directive) | Yes | No | No | No |
!$omp parallel master taskloop simd (combined directive) | Yes | No | No | No |
!$omp parallel masked (combined directive) | Yes | No | No | No |
!$omp masked taskloop (combined directive) | Yes | No | No | No |
!$omp masked taskloop simd (combined directive) | Yes | No | No | No |
!$omp parallel masked taskloop (combined directive) | Yes | No | No | No |
!$omp parallel masked taskloop simd (combined directive) | Yes | No | No | No |
DEPEND clause on !$omp taskwait | No | No | No | No |
“acq_rel“, “release“, “acquire“ and “relaxed” memory-order clauses on !$omp atomic | No | No | No | No |
"seq_cst" memory-order clause on !$omp atomic | Yes | Yes | Yes | Yes |
HINT clause on !$omp atomic | No | No | No | No |
“acq_rel“, “release“ and “acquire” memory-order clauses on !$omp flush | No | No | No | No |
!$omp depobj | No | No | No | No |
if (cancel: scalar-logical-expression) | No | No | No | No |
Yes* Only a limited form is implemented.
References
Fortran Standards
For more information about the Fortran Standards visit wg5-fortran.org.
OpenMP* Specification
The OpenMP* specifications are available at openmp.org.
Intel Documentation
Intel Fortran Compiler for oneAPI Developer Guide and Reference