Visible to Intel only — GUID: GUID-A99450D1-B411-49E9-A57D-5309A349EE7B
Visible to Intel only — GUID: GUID-A99450D1-B411-49E9-A57D-5309A349EE7B
ATTRIBUTES CONCURRENCY_SAFE
The ATTRIBUTES directive option CONCURRENCY_SAFE specifies that there are no unacceptable side effects and no illegal (or improperly synchronized) memory access interferences among multiple invocations of a routine or between an invocation of the specified routine and other statements in the program if they were executed concurrently.
!DIR$ ATTRIBUTES CONCURRENCY_SAFE [: clause] :: routine-name-list
clause |
Is one of the following:
|
int-cycle-count |
Is an integer scalar constant expression. |
routine-name-list |
Is a comma-separated list of function and subroutine names. |
When a CONCURRENCY_SAFE routine is called from parallelized code, you can ignore assumed cross-block or cross-iteration dependencies and side effects of calling the specified routine from parallelized code.
The profitable clause indicates that the loops or blocks that contain calls to the routine can be safely executed in parallel if the loop or blocks are legal to be parallelized; that is, if it is profitable to parallelize them.
The cost clause indicates the execution cycles of the routine where the compiler can perform parallelization profitability analysis while compiling its enclosing loops or blocks.
The attribute can appear in the declaration of the routine; for example:
function f(x)
!DIR$ attributes concurrency_safe :: f
The attribute can also appear in the code of the caller; for example:
main m
integer f
external f
!dir$ attributes concurrency_safe :: f ! or it could be in an interface block describing f
...
Print *, f(x)
For every routine named in routine-name-list, you should ensure that any possible side effects are acceptable or expected, and the memory access interferences are properly synchronized.