New in the Intel Fortran Compiler (ifx) 2024
-
- Completely implemented FORTRAN 77, Fortran90/95, Fortran 2003, Fortran 2008 and Fortran 2018 language standards beginning with Intel Fortran Compiler (ifx) 2023.0.0.
- Implementation of some features of Fortran 2023. Click here
- New OpenMP features:
- OpenMP 5.1
- The THREAD_LIMIT clause is now accepted on the TEAMS and TARGET constructs.
- OpenMP 5.2.
- You can now specify the MAP map-type-modifier PRESENT in the DECLARE MAPPER directive.
- COPYPRIVATE and NOWAIT can now be specified on directives that begin a construct, not just on the END directive of the construct.
- Suppport of the LINEAR clause with linear-step and linear-modifier.
-
Ifx now supports the OpenMP runtime library extensions ompx_target_register_host_pointer, omp_target_unregister_host_pointer, ompx_target_aligned_alloc, ompx-target_aligned_alloc_device, ompx_target_alloc_host, ompx_target_aligned_alloc_shared, ompx_target_aligned_alloc_shared_with_hint, ompx_target_realloc, ompx_target_realloc_device, ompx_target_realloc_host, ompx_target_realloc_shared, ompx_get_device_from_ptr, and ompx_get_num_subdevices.
See Intel® Compiler Extension Routines to OpenMP* in the Fortran Developer Guide and Reference for more information.
- OpenMP 5.1
- Fortran Language Standards
- Completely implemented FORTRAN 77, Fortran90/95, Fortran 2003, Fortran 2008 and Fortran 2018 language standards beginning with Intel Fortran Compiler (ifx) 2023.0.0.
- Implementation of some features of Fortran 2023. Click here.
- New OpenMP features:
- OpenMP 5.2 Specify an ALLOCATE clause in the SCOPE directive.
- OpenMP 5.0 Specify a HINT clause in the ATOMIC and CRITICAL directives.
- OpenMP 5.1 METADIRECTIVE directive (subset)
- Specifies variant OpenMP directives, one of which may conditionally replace the metadirective based on the OpenMP context enclosing the metadirective.
- OpenMP 5.2. You can now specify the MAP map-type-modifier PRESENT in the MAP clause on the DECLARE MAPPER directive.
- Fortran Language Standards
- Completely implemented FORTRAN 77, Fortran90/95, Fortran 2003, Fortran 2008 and Fortran 2018 language standards beginning with Intel Fortran Compiler (ifx) 2023.0.0.
- Implementation of some features of Fortran 2023.
- New OpenMP* 5.0/5.1/5.2/6.0 Features:
- The MATCH clause is now permitted in the DECLARE VARIANT directive. (OpenMP 5.0)
- The DESTROY clause of the DEPOBJ construct now requires a destroy-var modifier (OpenMP 5.1)
- The STRICT modifier can now be specified for the GRAINSIZE and NUM_TASK clauses of the TASKLOOP directive. (OpenMP 5.1)
- The optional ORDER clause modifiers REPRODUCIBLE and UNCONSTRAINED can be specified for the CONCURRENT argument to specify the ordering of iterations of a loop. (OpenMP 5.2)
- The ORDER clause may now be specified on the DISTRIBUTE construct. (OpenMP 5.1)
- The GROUPPRIVATE directive specifies variables to be shared by the threads of a context group, but each context group has a private copy. (OpenMP 6.0)
- You can now specify a DEVICE_TYPE clause on the DECLARE TARGET directive. DEVICE_TYPE (HOST) compiles the body of the construct for host device only, DEVICE_TYPE(NOHOST) compiles the body for the target device, and DEVICE_TYPE(ANY) compiles the body for both host and target. (OpenMP 5.0).
Features in the Intel Fortran Compiler 2024 and 2023
Fortran Standards
Beginning with ifx version 2023.0.0 these Fortran standards are completely implemented:
- Fortran 95
- Fortran 2003
- Fortran 2008
- Fortran 2018
These features from Fortran 2023 are implemented in ifx 2024.0.0:
- The REDUCE locality spec on DO CONCURRENT
- BOZ constants on RHS of INTEGER and REAL assignment statements
- BOZ constants as INTEGER and REAL values in PARAMETER statements
- BOZ constants as INTEGER or REAL as array constructor values
- BOZ constants as INTEGER values in ENUMERATION statements
- Intrinsic trigonometric functions returning degrees ACOSD(X), ASIND(X), ATAND(X), ATAN2D(Y, X), COSD(X), SIND(X), and TAND(X)
These features from Fortran 2023 are implemented in ifx 2024.1.0:
- Source input lines in free format can have up to 10,000 characters.
- A Fortran statement can contain up to 1,000,000 characters.
- New named constants LOGICAL8, LOGICAL16, LOGICAL32, LOGICAL64, and REAL16 in the intrinsic module ISO_FORTRAN_ENV.
- New procedures C_F_STRPOINTER and F_C_STRING for C interoperability have been added to the intrinsic module ISO_C_BINDING.
- Optional argument LOWER to subroutine C_F_POINTER in the intrinsic module ISO_C_BINDING, which allows specifying lower
- bounds for the fptr array pointer argument.
- Two argument form of the intrinsic trigonometric function ATAND (Y, X) whose arguments are in degrees.
OpenMP 4.5
All features are implemented beginning with Intel Fortran Compiler 2023.0
OpenMP 5.0/5.1
(bold indicates new features in this release)
Feature | Status in Compiler Version 2024.2.0 |
Status in Compiler Version 2024.1.0 |
Status in Compiler Version 2024.0.0 | Status in Compiler Version 2023.2.0 | Status in Compiler Version 2023.1.0 | Status in Compiler Version 2023.0.0 |
---|---|---|---|---|---|---|
omp_all_memory reserved locator |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
adjust_args, append_args for declare variant |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
dispatch construct |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
thread_limit clause for target |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
has_device_addr for target |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
nowait clause for taskwait depend |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
default(private) and default(firstprivate) |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
defaultmap(present) |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
align clause for allocate directive align modifier for allocate clause |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
OMP_DISPLAY_ENV |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
OMP_SET_NUM_TEAMS OMP_GET_MAX_TEAMS OMP_SET_TEAMS_THREAD_LIMIT |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
OMP_TARGET_MEMCPY_ASYNC OMP_TARGET_MEMCPY_RECT_ASYNC |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
OMP_GET_MAPPED_PTR OMP_TARGET_ASSOCIATE_PTR OMP_TARGET_DISASSOCIATE_PTR |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
OMP_NUM_TEAMS OMP_TEAMS_THREAD_LIMIT |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
if (parallel: scalar-logical-expression) | Yes | Yes | Yes | Yes | Yes | Yes |
REDUCTION clause on TEAMS | Yes | Yes | Yes | Yes | Yes | Yes |
ALLOCATE clause | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp loop | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp teams loop (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp parallel loop (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp target teams loop (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp parallel target teams loop (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
NONTEMPORAL clause on !$omp simd | Yes | Yes | Yes | Yes | Yes | Yes |
IN_REDUCTION clause | Yes | Yes | Yes | Yes | Yes | Yes |
USE_DEVICE_ADDR clause | Yes | Yes | Yes | Yes | Yes | Yes |
TASK_REDUCTION clause on !$omp taskgroup | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp allocate | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp declare variant | Yes | Yes | Yes | Yes | Yes | Yes |
MATCH clause on declare variant | Yes | Yes | Yes | No | No | No |
if (simd: scalar-logical-expression) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp scan | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp requires | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp tile | Yes | Yes | Yes | Yes | No | No |
Metadirectives | Yes, a subset | Yes, a subset | No | No | No | No |
“task” reduction-modifier | Yes | Yes | Yes | Yes | Yes | Yes |
"scan" and "default" reduction-modifier | Yes | Yes | Yes | Yes | Yes | Yes |
“conditional” lastprivate-modifier | No | No | No | No | No | No |
ORDER clause (enabled on OMP LOOP) | Yes | Yes | Yes | Yes | Yes | Yes |
ORDER clause (enabled on OMP DISTRIBUTE) | Yes | Yes | Yes | No | No | No |
UNCONSTRAINED and REPRODUCIBLE order-modifiers in the ORDER clause | Yes | Yes | Yes | No | No | No |
"mutexinoutset" and "depobj” dependence-type | Yes | Yes |
Yes |
Yes | Yes | Yes |
“in“, “out“ and “inout“ dependence-type | Yes | Yes | Yes | Yes | Yes | Yes |
AFFINITY clause | No | No | No | No | No | No |
DETACH clause | No | No | No | No | No | No |
USES_ALLOCATORS clause | No | No | No | No | No | No |
DECLARE MAPPER and mapper-identifier | No change | No change | No change | No change | for allocatable and variable length arrays | for scalar variables, fixed length arrays |
DEVICE_TYPE clause | on GROUPPRIVATE | No | No | No | No | No |
!$omp parallel master (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp master taskloop (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp master taskloop simd (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp parallel master taskloop (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp parallel master taskloop simd (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp parallel masked (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp masked taskloop (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp masked taskloop simd (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp parallel masked taskloop (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
!$omp parallel masked taskloop simd (combined directive) | Yes | Yes | Yes | Yes | Yes | Yes |
DEPEND clause on !$omp taskwait | Yes | Yes | iterators added | No change | No change | DEPEND types mutexinoutset, inoutset, depobj, in, out, and inout |
“acq_rel“, “release“, “acquire“ and “relaxed” memory-order clauses on !$omp atomic | Yes | Yes | Yes | Yes | Yes | Yes |
"seq_cst" memory-order clause on !$omp atomic | Yes | Yes | Yes | Yes | Yes | Yes |
HINT clause on !$omp atomic | Yes | Yes | No | No | No | No |
“acq_rel“, “release“ and “acquire” memory-order clauses on !$omp flush | No | No | No | No | No | No |
!$omp depobj | Yes | Yes | Yes | Yes | Yes | Yes |
Required destory-var modifer for DESTORY clause on depobj | Yes | Yes | Yes | No | No | No |
if (cancel: scalar-logical-expression) | No | No | No | No | No | No |
FILTER clause on the MASKED construct | Yes | Yes | Yes | Yes | Yes | Yes |
UNROLL construct | Yes | Yes | Yes | Yes | Yes | Yes |
SCOPE construct | Yes | Yes | Yes | Yes | Yes | Yes |
ASSUMES directive | Yes | Yes | Yes | Yes | Yes | No |
ERROR directive | Yes | Yes | Yes | Yes | Yes | No |
NOTHING directive | Yes | Yes | Yes | Yes | Yes | No |
LINK and INDIRECT for directive DECLARE TARGET | Yes | Yes | Yes | Yes | Yes | No |
Iterators in the DEPEND clause | Yes | Yes | Yes | Yes | Yes | No |
Optional END construct directives with strictly structured block construct bodies | Yes | Yes | Yes | Yes | Yes | No |
STRICT modifier for GRAINSIZE and NUM_TASK clauses on TASKLOOP | Yes | Yes | Yes | No | No | No |
OpenMP 5.2
(bold indicates new features in this release)
Feature | Status in Compiler Version 2024.2.0 | Status in Compiler Version 2024.1.0 | Status in Compiler Version 2024.0.0 | Status in Compiler Version 2023.2.0 | Status in Compiler Version 2023.1.0 | Status in Compiler Version 2023.0.0 |
---|---|---|---|---|---|---|
Any clause allowed on an OpenMP END directive can be specified on the corresponding construct directive | Yes | No | No | No | No | No |
LINEAR clause changes, including the STEP modifier | Yes | Yes | No | No | No | No |
ENTER clause as a synonym for the TO clause on DECLARE TARGET | Yes | Yes | Yes | Yes | Yes | No |
Metadirectives, ASSUME, NOTHING, ERROR, and loop transformation constructs are allowed in PURE procedures | Yes | Yes | Yes | No | No | No |
ALLOCATORS construct | Yes | Yes | Yes | Yes | No | No |
Optional END DISPATCH directive | Yes | Yes | Yes | Yes | No | No |
Support ALLOCATE and FIRSTPRIVATE on the SCOPE directive | Yes | Yes, allocate | No | No | No | No |
The DOACROSS clause is a synonym for the DEPEND clause | Yes | Yes | Yes | No | No | No |
Allow dummy arguments as linear-step in a LINEAR clause of a DECLARE SIMD | No | No | No | No | No | No |
Optional maptype on TARGET ENTER|EXIT DATA directives | Yes | Yes | Yes | No | No | No |
PRESENT map-type-modifer on MAP clause of DECLARE MAPPER directive. | Yes | Yes | No | No | No | No |
UNCONSTRAINED and REPRODUCIBLE order-modifers in the ORDER clause | Yes | Yes | Yes | No | No | No |
OpenMP 6.0
(bold indicates new features in this release)
Feature | Status in Compiler Version 2024.0.0 | Status in Compiler Version 2023.2.0 | Status in Compiler Version 2023.1.0 | Status in Compiler Version 2023.0.0 |
---|---|---|---|---|
GROUPPRIVATE directive | Yes | No | No | No |
INTEROP on DISPATCH | Yes | Yes | Yes | Yes |
PREFER_TYPE in the APPEND_ARGS clause of DECLARE VARIANT | Yes | Yes | Yes | Yes |
Other useful information:
- ifx and ifort are binary (.o/.obj) and module file (.mod) compatible unless built with compiler option -ipo. 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. This is available for 64-bit targets only.
- Both compilers use the same runtime libraries.
- ifx may or may not match the performance of ifort compiled applications. Performance improvements in ifx come with each update.
Similar information for Intel® oneAPI DPC++/C++ Compiler (DPCPP and ICX) regarding the OpenMP implementation.
Features in the Intel Fortran Compiler 2022 and 2021
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 |
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