Visible to Intel only — GUID: GUID-4F810265-FA83-497D-8094-0D0877848E09
Visible to Intel only — GUID: GUID-4F810265-FA83-497D-8094-0D0877848E09
ASSUME
General Compiler Directive: Provides heuristic information to the compiler optimizer.
!DIR$ ASSUME (scalar-Boolean-expression)
scalar-Boolean-expression |
Is any expression that evaluates to .TRUE. or .FALSE. at run time. |
At compile time, the scalar-Boolean-expression is always presumed to be true and may be used by the optimizer to generate better code.
At runtime, the ASSUME directive is evaluated at the point where it is located in the source.
If the check assume option is specified and scalar-Boolean-expression does not evaluate to .TRUE. at run time, an error message is displayed and execution is aborted. If the check assume option is not specified and scalar-Boolean-expression does not evaluate to .TRUE. at run time, program behavior is undefined.
In the example below, the compiler is told that A is aligned on a 32-byte boundary using the ASSUME_ALIGNED directive. The ASSUME directive says that the length of the first dimension of A is a multiple of 8. Therefore the optimizer knows that A(I,J+1) and A(I,J-1) are 0 mod 64 bytes away from A(I,J) and are therefore also aligned on 32-byte boundaries. This information helps the optimizer in generating efficiently vectorized code for these loops.
SUBROUTINE F (A, NX,NY,I1,I2,J1,J2)
REAL (8) :: A (NX,NY)
!DIR$ ASSUME_ALIGNED A:32
!DIR$ ASSUME (MOD(NX,8) .EQ. 0)
! ensure that the first array access in the loop is aligned
!DIR$ ASSUME (MOD(I1,8) .EQ. 1)
DO J=J1,J2
DO I=I1,I2
A(I,J) = A(I,J) + A(I,J+1) + A(I,J-1)
ENDDO
ENDDO
END SUBROUTINE F