Intel® Fortran Compiler Classic and Intel® Fortran Compiler Developer Guide and Reference

ID 767251
Date 9/08/2022
Public

A newer version of this document is available. Customers should click here to go to the newest version.

Document Table of Contents

SCOPE

OpenMP* Fortran Compiler Directive: Specifies a block of code to be executed by all threads in a team; it may contain additional OpenMP constructs. This feature is only available for ifx.

Syntax

!$OMP SCOPE [clause[[,] clause]... ]

   loosely-structured-block

!$OMP END SCOPE [NOWAIT]

-or-

!$OMP SCOPE [clause[[,] clause]... ]

   strictly-structured-block

!$OMP END SCOPE [NOWAIT]

clause

Is one or more of the following:

loosely-structured-block

Is a structured block (section) of statements or constructs. You cannot branch into or out of the block.

strictly-structured-block

Is a Fortran BLOCK construct. You cannot branch into or out of the BLOCK construct.

Description

The binding thread set for the SCOPE region is the current team.

The SCOPE region binds to the innermost parallel region in which it is enclosed. All threads of a team that execute the binding parallel region, and only those threads, execute the statements of the block. The block may contain additional OpenMP constructs.

If NOWAIT is not specified, the participating threads execute an implicit barrier at the end of the SCOPE block.

Example

The following code performs a reduction on the array arr. Each thread produces a sum of the elements dispatched to it. The SCOPE directive is used to perform a reduction of each partial sum. The sum of the array, and the number of threads that participate, is printed.

SUBROUTINE sum_reduce (arr) IMPLICIT NONE REAL,DIMENSION(:) :: arr REAL :: sum = 0.0, partial_sum = 0.0 INTEGER :: i, num_threads = 0 !$omp PARALLEL FIRSTPRIVATE (partial_sum), SHARED (num_threads, arr) !$omp DO DO i = 1, SIZE (arr) partial_sum = partial_sum + arr(i) END DO !$omp END DO !$omp SCOPE reduction (+ : sum, num_threads) sum = sum + partial sum num_threads = num_threads + 1 !$omp END SCOPE !$omp END PARALLEL PRINT *, "sum of arr = ", sum, " number of threads participating = ", num_threads RETURN END SUBROUTINE