OpenACC Extensions in Flang¶
Flang is more lenient than the OpenACC specification requires for purposes of compatibility. This document describes extensions to the OpenACC specification. There are a couple of known places where the Flang compiler intentionally deviates from the standard by being more strict than the specification; these are currently listed in OpenACC.md.
Extensions always active¶
These extensions require no flag.
The end directive for combined constructs can omit the
loopkeyword.An
!$acc routinewith no parallelism clause is treated as if theseqclause were present.!$acc end loopdoes not trigger a parsing error and is silently ignored.The restriction on required clauses for
!$acc datais emitted as a portability warning rather than an error, matching the behavior of other compilers.The
ifclause accepts scalar integer expressions in addition to scalar logical expressions.!$acc routinedirectives can be placed at the top level.!$acc cachedirectives accept scalar variables.!$acc cachedirectives are accepted outside of a loop construct.The
!$acc declaredirective accepts assumed-size array arguments fordeviceptrandpresentclauses.The OpenACC specification disallows a variable from appearing multiple times in clauses of
!$acc declaredirectives for a function, subroutine, program, or module, but Flang permits it with a warning when the same clause is used.The REDUCTION clause accepts a MINUS “-” operator which is not permitted in the OpenACC specification. A warning is issued for this use.
The
collapseclause may be applied to aDO CONCURRENTloop, which the OpenACC specification does not permit. The collapse value must equal the number ofDO CONCURRENTcontrols; the construct then lowers like the equivalent perfectly-nestedDOloops. A portability warning is issued for this use (-Wportability, also enabled by-pedantic; suppress with-Wno-portability).
Extensions enabled by default¶
-fopenacc-multiple-names-in-routine — !$acc routine(<name>[, <name>]*) <clause-list>¶
The ROUTINE directive accepts a parenthesized list of more than one name
(e.g. !$acc routine(foo, bar) seq). The OpenACC specification permits only a
single name; this extension is equivalent to writing one ROUTINE directive
per name, each with identical clauses. A BIND clause may not be combined
with multiple names. A warning is emitted for each such directive
(-Wopenacc-multiple-names-in-routine; suppress with
-Wno-openacc-multiple-names-in-routine). This extension may be disabled with
-fno-openacc-multiple-names-in-routine.
Pre-OpenACC-3.2 scalar behavior under DEFAULT(NONE)¶
OpenACC version 3.2 (section 1.16, change 733) clarified that the
default(none) clause applies to scalar variables. Prior to version 3.2,
default(none) did not impose a data-clause requirement on scalar variables.
By default, Flang uses the pre-3.2 behavior: scalar variables referenced inside
a default(none) compute region without an explicit data clause do not produce
an error. Instead, Flang infers implicit data attributes for those scalars via
the same implicit-copy logic applied in regions without default(none).
Array variables always require an explicit data clause under default(none)
regardless of this extension.
When a scalar is implicitly attributed under this extension, a warning is
emitted by default (-Wopenacc-default-none-scalars-strict; suppress with
-Wno-openacc-default-none-scalars-strict). Use
-fopenacc-default-none-scalars-strict to enforce the OpenACC 3.2 behavior and
produce an error for scalar variables that are not listed in an explicit data
clause. -fno-openacc-default-none-scalars-strict preserves the default
pre-3.2 behavior explicitly.