Fortran Language and OpenMP* Features Implemented in Intel® Fortran Compiler (Beta)

Published: 12/02/2020   Last Updated: 06/28/2021

The Intel® Fortran Compiler (Beta) is our new compiler based on the Intel® Fortran Compiler Classic (ifort) frontend and runtime libraries. This new compiler uses the Intel Fortran Front End along with the LLVM framework.  The driver for this new compiler is named ‘ifx’.  

At this time ifx supports features of the Fortran 95 language and most of the OpenMP 4.5 directives and offloading features. This article describes additional Fortran language and OpenMP* features that are implemented in each release.

Similar information for Intel® oneAPI DPC++/C++ Compiler (DPCPP and ICX) regarding the OpenMP implementation.

Fortran 95

Fortran 95 is fully implemented, as are previous Fortran standards.

Fortran 2003

Feature 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
Procedure pointers No No No
Finalization Yes Yes Yes*
Procedures bound by name to a type Yes Yes Yes
The PASS attribute Yes Yes Yes
Procedures bound to a type as operators Yes Yes Yes*
Type extension Yes Yes Yes
Overriding a type-bound procedure Yes Yes Yes
Enumerations Yes Yes Yes
ASSOCIATE construct Yes Yes Yes*
Typed polymorphic entities Yes Yes Yes*
Unlimited polymorphic entities Yes Yes No
SELECT TYPE construct Yes Yes Yes
Deferred bindings and abstract types Yes Yes Yes
Allocatable scalars Yes Yes Yes
Deferred-length allocatable scalars Yes Yes Yes
Miscellaneous Enhancements      
Structure constructors Yes Yes No
Generic procedure interfaces named as type Yes Yes Yes
The ALLOCATE statement Yes Yes Yes
Assignment to an allocatable array Yes Yes Yes
Transferring an allocation Yes Yes Yes
Assignment to an allocatable array Yes Yes Yes
Transferring an allocation Yes Yes Yes
More control of access from a module Yes Yes Yes
Renaming operators on the USE statement Yes Yes Yes
Pointer assignment Yes Yes Yes
Pointer INTENT Yes Yes No
The VOLATILE attribute YES No No
The IMPORT statement Yes Yes Yes
Intrinsic modules Yes Yes Yes
Access to the computing environment Yes Yes Yes
Support for international character sets No No No
Lengths of names and statements Yes Yes Yes
Binary, octal and hex constants Yes Yes Yes
Array constructor syntax Yes Yes Yes
Specification and initialization expressions Yes Yes Yes
Complex constants Yes Yes Yes
Changes to intrinsic functions Yes Yes No
Controlling IEEE underflow Yes Yes No
Another IEEE class value No No No
Input/Output Enhancements      
Derived type input/output No No No
Asynchronous input/output YES No No
FLUSH statement Yes Yes Yes
IOMSG= specifier Yes Yes Yes
Stream access input/output Yes Yes Yes
ROUND= specifier Yes Yes Yes
DECIMAL= specifier Yes Yes Yes
SIGN= specifier Yes Yes Yes
Kind type parameters of integer specifiers Yes Yes Yes
Recursive input/output Yes Yes Yes
Intrinsic function for newline character Yes Yes Yes
Input and output of IEEE exceptional values Yes Yes Yes
Comma after a P edit descriptor Yes Yes Yes
Interoperability with C      
Interoperability of intrinsic types Yes Yes Yes
Interoperability with C pointers Yes Yes Yes
Interoperability of derived types Yes Yes Yes**
Interoperability of variables Yes Yes Yes
Interoperability of procedures Yes Yes Yes
Interoperability of global data 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

Feature Status in  2021.3.x Status in 2021.2.x Status in 2021.1.x
Coarrays No No No
Allocatable or pointer components of derived type coarrays No No No
Performance Enhancements      
do concurrent Yes Yes No
Contiguous attribute Yes Yes Yes
Simply contiguous arrays Yes Yes Yes
Data Declaration      
Maximum rank + corank <= 15 Yes Yes Yes
Long integers (18 digits or 64 bits) Yes Yes Yes
Allocatable components of recursive type Yes Yes No
Implied-shape array Yes Yes Yes
Pointer initialization YES No No
Data statement restrictions lifted Yes Yes Yes
Kind of a forall index Yes Yes Yes
Type statement for intrinsic types TYPE (intrinsic type) specifier Yes Yes Yes
Declaring type-bound procedures No No No
Value attribute is permitted for any nonallocatable nonpointer noncoarray Yes Yes Yes
In pure procedure intent of an argument with VALUE attribute not needed Yes Yes Yes
Allocating a polymorphic variable No No No
Accessing Data Objects       
Accessing real and imaginary parts Yes Yes Yes
Pointer function reference is a variable No No No
Elemental dummy arguments restrictions lifted Yes Yes Yes
Input/Output      
Finding a unit when opening a file Yes Yes Yes
g0 edit descriptor No No No
Unlimited format item Yes Yes No
Recursive input/output No No No
Execution Control      
The block construct No No No
Exit statement Yes Yes No
Stop code Yes Yes Yes
ERROR STOP Yes Yes Yes
Intrinsic Procedures for Bit Processsing      
Bit sequence comparison Yes Yes Yes
Combined shifting No No No
Counting bits Yes Yes Yes
Masking bits Yes Yes Yes
Shifting bit Yes Yes No
Merging bits Yes Yes No
Bit transformational functions Yes Yes No
Intrinsic Procedures and Modules      
Storage size Yes Yes Yes
Optional argument radix added to selected real kind Yes Yes Yes
Extensions to trigonometric and hyperbolic intrinsic functions No No No
Selecting a real kind Yes Yes Yes
Hyperbolic intrinsic functions Yes Yes Yes
Bessel functions YES No No
Error and gamma functions Yes Yes Yes
Euclidean vector norm No No No
Parity Yes Yes Yes
Execute command line No No No
BACK argument to MINLOC and MAXLOC No No No
Find location in an array No No No
String comparison Yes Yes No
Constants Yes Yes Yes
COMPILER_VERSION Yes Yes Yes
COMPILER_OPTIONS Yes Yes Yes
Function for C sizeof Yes Yes Yes
Added optional argument for ieee_selected_real_kind Yes Yes Yes
Programs and Procedures      
SAVE attribute for module and submodule data Yes Yes No
Empty contains section Yes Yes Yes
Form of the end statement for an internal or module procedure Yes Yes Yes
Internal procedure as an actual argument Yes Yes Yes
Generic resolution by pointer or allocatable attribute Yes Yes No
Null pointer or unallocated allocatable as a missing dummy argument Yes Yes No
Elemental procedures that are not pure Yes Yes Yes
Entry statement becomes obsolescent Yes Yes Yes
Source Form      
Semicolon at line start Yes Yes Yes

Fortran 2018

Feature 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
Coarray intrinsics TEAM_NUMBER, GET_TEAM, STOPPED_IMAGES, FAIL_IMAGES, COSHAPE,and IMAGE_STATUS No No No
TEAM and/or TEAM_NUMBER argument in NUM_IMAGES, IMAGE_INDEX, THIS_IMAGE intrinsic functions No No No
TEAM or TEAM_NUMBER specifiers in image selectors No No No
STAT and ERRMSG arguments to MOVE_ALLOC and specifiers in image selectors and in CRITICAL constructs No No No
FAILed IMAGEs No No No
Atomic subroutine No No No
Collective subroutines No No No
EVENTs No No No
EXIT from a CRITICAL construct 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
VALUE dummy arguments to PURE procedures may appear in variable definition contexts. No No No
ERRMSG argument to the intrinsic procedures GET_COMMAND_ARGUMENT, GET_ENVIRONMENT_VARIABLE, and GET_COMMAND No No No
OUT_OF_RANGE intrinsic function No No No
RANDOM_INIT intrinsic subroutine No No No
REDUCE intrinsic function No No No
New form of CMPLX function without KIND= No No No
SIGN function arguments can be of different KINDs No No No
INTEGER and LOGICAL arguments to intrinsics need not be default kind No No No
I/O Enhancements      
E and D, EN, ES, and G allow a field width of zero No No No
The exponent width e in a data edit descriptor can now be zero. 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
The EX edit descriptor allows for hexadecimal data No No No
SIZE= can be specified for non-advancing I/O No No No
Execution/Control Enhancements      
QUIET specifier in STOP or ERROR STOP No No No
Variable STOP and ERROR STOP codes No No No
ERROR STOP in PURE procedures No No No
VALUE Dummy argument of PURE procedure may be defined No No No
Declaration/Specification Changes      
Constant properties of an object can be used in the objects initialization 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
Transformational intrinsic functions from the intrinsic modules ISO_C_BINDING, IEEE_ARITHMETIC, and IEEE_EXCEPTIONS are now allowed in specification expressions No No No
Defined assignment and operator procedure dummy arguments with VALUE attribute need not be INTENT(IN) No No No
Implied-do loop of array constructors and data statements can specify loop variable kind and type. No No No
IMPLICIT NONE (EXTERNAL) No No No
GENERIC statement can be used to declare generic interfaces No No No
Locality of variables on a DO concurrent statement No No No
Non-standard intrinsics and module are diagnosed as non-standard No No No
IMPORT ALL, IMPORT NONE, and IMPORT ONLY in internal procedures and BLOCK constructs No No No
Module names in PUBLIC and PRIVATE statements No No No
NON_RECURSIVE keyword No No No
Default recursion (when assume recursion option specified) No    
ISO/IEC/IEEE 754 2011 Floating Point Bindings      
assume ieee_compare option for floating point compares with signaling NaNs 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
Named constants IEEE_ROUND_TYPE and IEEE_AWAY added to IEEE_ARITHMETIC intrinsic module No No No
Optional ROUND argument to the IEEE_RINT function No No No
Derive type IEEE_EXCEPTIONS defined in module IEEE_EXCEPTIONS No No No
SUBNORMAL is synonymous with DENORMAL No No No
Optional RADIX argument to IEEE_GET_ROUNDING_MODE and IEEE_SET_ROUNDING_MODE No No No
Enhanced C Interoperability      
C_PTRDIFF_T kind type in ISO_C_BINDING No No No
All intrinsic procedures in ISO_C_BINDING except C_F_PROCPOINTER are PURE No No No
Assumed rank arrays and types No No No
SELECT RANK construct No No No
Language Evolution      
Non-block DO and arithmetic IF are deleted features (retained as Intel extensions) No No No
COMMON, EQUIVALENCE, and BLOCKDATA are obsolescent No No No
Labeled form a DO loop is obsolescent No No No
Specific names of procedures are obsolescent No No No

OpenMP 4.5

All features implemented in version 2021.1, except user-defined reductions.

OpenMP 5.0/5.1

Feature Status in 2021.3.x Status in 2021.2.x Status in 2021.1.x
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 No No No
USE_DEVICE_ADDR clause Yes Yes Yes
TASK_REDUCTION clause on !$omp taskgroup Yes Yes Yes
!$omp allocate  Yes Yes No
!$omp declare variant Yes Yes* No
if (simd: scalar-logical-expression) No No No
!$omp scan No No No
!$omp requires No No No
Metadirectives No No No
“task” reduction-modifier  No No No
"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 No No No
DEVICE_TYPE clause No No No
!$omp parallel master (combined directive) No No No
!$omp master taskloop (combined directive) No No No
!$omp master taskloop simd (combined directive) No No No
!$omp parallel master taskloop (combined directive) No No No
!$omp parallel master taskloop simd (combined directive) No No No
DEPEND clause on !$omp taskwait No No No
“acq_rel“, “release“, “acquire“ and “relaxed” memory-order clauses on !$omp atomic No No No
"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

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

 

 

Product and Performance Information

1

Performance varies by use, configuration and other factors. Learn more at www.Intel.com/PerformanceIndex.