Intel® Fortran Compiler 17.0 Developer Guide and Reference
These attributes ensure that variables and functions are available on the coprocessor.
This topic only applies when targeting Intel® Many Integrated Core Architecture (Intel® MIC Architecture).
The statement following the offload directive is converted into an outlined function that runs on the coprocessor. This code is permitted to call other functions. To ensure that these called functions are also available on the coprocessor, you must specify one of the following special function attributes, using the ATTRIBUTES OFFLOAD directive:
!DIR$ ATTRIBUTES OFFLOAD: target-name :: routine-name[ , routine-name] ... !DIR$ ATTRIBUTES OFFLOAD: target-name :: variable-name[ , variable-name] ...
All functions in the program are always compiled for the CPU and are available to be called on the CPU. However, only functions marked with the special attribute are available to be called by offloaded code, and only these functions can be called on the coprocessor.
Global variables are treated in a similar fashion. All global variables are always present in the CPU code. But only global variables with the target attribute are compiled into the binary offloaded to the coprocessor.
Compiling only functions and data explicitly marked with the target attribute into the Intel® MIC Architecture binary ensures that the code on the coprocessor is as small as possible.
The compiler issues warnings for functions and data referenced within offloaded code that do not have the target attribute.
module offload_test public !DIR$ ATTRIBUTES OFFLOAD:mic :: global_value integer :: global_value contains !DIR$ ATTRIBUTES OFFLOAD:mic :: incr_global integer function incr_global global_value = global_value + 1 incr_global = global_value return end function incr_global end module offload_test program main use offload_test integer i i = incr_global() print *, "global = ", global_value, "i = ", i, " (should be the same)"
The presence of a function call within an offloaded construct with a target attribute does not automatically declare that function as available on that target. The function definition must include the appropriate target attribute to ensure that the function is available on the target.
The definition and all declarations of a variable or function with a target attribute must be consistent with each other across all compilation units.