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