Intel® Fortran Compiler 16.0 User and Reference Guide
OpenMP* Fortran Compiler Directive: Specifies that the current task can be suspended at this point in favor of execution of a different task.
!$OMP TASKYIELD
A taskyield region binds to the current task region. The binding thread set of the taskyield region is the current team.
Because the TASKYIELD construct is a stand-alone directive, there are some restrictions on its placement within a program:
The TASKYIELD directive can only be placed at a point where a Fortran executable statement is allowed.
The TASKYIELD directive cannot be used as the action statement in an IF statement or as the executable statement following a label if the label is referenced in the program.
The TASKYIELD construct includes an explicit task scheduling point in the current task region.
The following example shows use of the TASKYIELD directive. It is non-conforming, because the FLUSH, BARRIER, TASKWAIT, and TASKYIELD directives are stand-alone directives and cannot be the action statement of an IF statement or a labeled branch target.
SUBROUTINE NONCONFORMING_STANDALONE() INTEGER A A = 1 ! the FLUSH directive must not be the action statement in an IF statement ! IF (A .NE. 0) !$OMP FLUSH(A) ! the BARRIER directive must not be the action statement in an IF statement ! IF (A .NE. 0) !$OMP BARRIER ! the TASKWAIT directive must not be the action statement in an IF statement ! IF (A .NE. 0) !$OMP TASKWAIT ! the TASKYIELD directive must not be the action statement in an IF statement ! IF (A .NE. 0) !$OMP TASKYIELD GOTO 100 ! the FLUSH directive must not be a labeled branch target statement ! 100 !$OMP FLUSH(A) GOTO 200 ! the BARRIER directive must not be a labeled branch target statement ! 200 !$OMP BARRIER GOTO 300 ! the TASKWAIT directive must not be a labeled branch target statement ! 300 !$OMP TASKWAIT GOTO 400 ! the TASKYIELD directive must not be a labeled branch target statement ! 400 !$OMP TASKYIELD END SUBROUTINE
The following version of the above example is conforming because the FLUSH, BARRIER, TASKWAIT, and TASKYIELD directives are enclosed in a compound statement.
SUBROUTINE CONFORMING_STANDALONE () INTEGER N N = 1 IF (N .NE. 0) THEN !$OMP FLUSH(N) ENDIF IF (N .NE. 0) THEN !$OMP BARRIER ENDIF IF (N .NE. 0) THEN !$OMP TASKWAIT ENDIF IF (N .NE. 0) THEN !$OMP TASKYIELD ENDIF GOTO 100 100 CONTINUE !$OMP FLUSH(N) GOTO 200 200 CONTINUE !$OMP BARRIER GOTO 300 300 CONTINUE !$OMP TASKWAIT GOTO 400 400 CONTINUE !$OMP TASKYIELD END SUBROUTINE