An `!$acc routine` directive placed directly within an interface block (as an interface-specification, e.g. preceding the interface body it names) failed to parse and produced a misleading cascade of errors. Accept the OpenACC ROUTINE directive as an additional interface-specification alternative, mirroring the existing extension that allows a ROUTINE directive in a module subprogram part / at the top level. The grammar is widened narrowly to the ROUTINE construct only (not the whole OpenACC declarative construct). A named directive applies to the interface body it names; name resolution already runs in a separate pass after the interface-body symbols are created, so the directive-before-body ordering resolves correctly and the ROUTINE information is attached to the named procedure's symbol. This is documented as a Flang extension in OpenACC-extensions.md. Assisted-by: AI
4.6 KiB
OpenACC Extensions in Flang
---
local:
---
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 routinedirectives can be placed directly within an interface block (i.e. as an interface-specification, such as preceding the interface body they name). The OpenACC specification only permits the namedroutinedirective in the specification part of a subroutine, function, or module, and the unnamed form within an interface body; Flang additionally accepts aroutinedirective between theINTERFACEstatement and the interface bodies, applying a named directive to the interface body it names.!$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.