11.3.9 Parallel Directive Examples (VAX only)

The following examples show valid applications of parallel directives.

In Example 11-1, assignment to the context-shared variables SUMA and SUMB must be guarded from multiple processes attempting to write to the variable at the same time. The LOCKON and LOCKOFF directives accomplish this task by ensuring scalar execution of the statements.

Example 11-1 Using the LOCKON and LOCKOFF Directives (VAX only)

CPAR$ PRIVATE I
CPAR$ SHARED /COM1/
CPAR$ CONTEXT_SHARED SUMA, SUMB

        COMMON/COM1/A, B
        INTEGER A(1000), B(1000), SUMA, SUMB
        LOGICAL *4 LCK_VAR

CPAR$ DO_PARALLEL
        DO I = 1, 1000
        CALL CALCULATE (I)

CPAR$ LOCKON LCK_VAR             ! Guard against multiple processes
        SUMA = SUMA + A(I)       !   writing to the context-shared
        SUMB = SUMB + B(I)       !   variable at the same time.

CPAR$ LOCKOFF LCK_VAR
        ENDDO

        PRINT*, 'SUM A=', SUMA
        PRINT*, 'SUM B=', SUMB

        END

Example 11-2 shows the SHARED, CONTEXT_SHARED, and PRIVATE directives.

Example 11-2 Using the SHARED, CONTEXT_SHARED, and PRIVATE Directives (VAX only)

        INTEGER A(1000), B(100))
        COMMON/COM1/B

        PARAMETER (N = 1000)

CPAR$ SHARED_ALL           ! Reinforces the SHARED default for
                           !   common blocks.
CPAR$ CONTEXT_SHARED_ALL   ! Reinforces the CONTEXT_SHARED default
                           !   for local symbols.

CPAR$ PRIVATE I            ! Loop control must be private.

CPAR$ DO_PARALLEL
        DO 10 I = 1, N
         . . .
        A(I)  = A(I) + I
        B(I)  = A(I)
         . . .

10      CONTINUE
        CALL SUBR(A, N)
        WRITE (5,*) A, B
        END
C
C
        SUBROUTINE SUBR(A, N)
        INTEGER A(N),  B(1000)
        COMMON/COM1/B

CPAR$ SHARED /COM1/        ! The common block must be SHARED.
CPAR$ PRIVATE_ALL          ! Make the default PRIVATE.

CPAR$ DO_PARALLEL N/2      ! Distributes half of the iterations to
        DO J = 1, N        !   each of two processors.
         . . .
        A(J)  = B(J) + J
         . . .
        ENDDO

        RETURN
        END


Previous Page Next Page Table of Contents