6.3.2 C*$* assert do (concurrent)

The C*$* assert do (concurrent) assertion tells KAP to prefer to ignore assumed dependencies and to execute the DO loop immediately following this assertion in parallel.

This assertion says nothing about the concurrency threshold for the loop. This means KAP continues to honor the dependencies it finds. For example, in the following loop KAP ignores C*$* assert do (concurrent) because there is a dependence on A :

C*$* ASSERT DO (CONCURRENT)
        DO 100 I = 4, N
            A (I) = A (I-4) + B (I)
    100 CONTINUE

Strictly speaking, you could parallelize the loop enabling KAP to put the entire loop body inside a critical section. The parallelized loop would run more slowly than the original serial version, however.

The following code example shows how C*$* assert do (concurrent) tells KAP to ignore an assumed dependence, the I+M array index, and to make the stride-1 loop concurrent:

        PROGRAM TEST
        REAL A(100,100)
C*$* ASSERT DO (CONCURRENT)
          DO 11 I = 1,N
            DO 12 J = 1,N
                A(I,J) = A(I+M,J)
12      CONTINUE
11      CONTINUE
        END

Using the assertion and processing with /unroll=1 and /conc , KAP generates the following code:

       PROGRAM TEST

         REAL A(100,100)
         SAVE M, N
         EXTERNAL PKTEST0
         INTEGER II5, II4
         PARAMETER (II5 = 1, II4 = 3)
C*$* ASSERT DO( CONCURRENT )
         CALL mppfrk (PKTEST0,II4,N,A,M)
         CALL mppend
       END

       SUBROUTINE PKTEST0 (MPPID, MPPNPR, N, A, M )
       AUTOMATIC II3, II2, II1, J, I
       INTEGER II3, II2, II1, J, I, MPPNPR, MPPID, M, N
       REAL A(100,100)
       INTEGER II5, II4
       PARAMETER (II5 = 1, II4 = 3)
       II3 = (N - 1) / MPPNPR + II5
       II1 = (MPPID * II3) + 1
       II2 = MIN0 (N, II1 + II3 - II5)
       DO 2 I=II1,II2,II5
        DO 2 J=1,N
           A(I,J) = A(I+M,J)
    2      CONTINUE
       END

Another example of when to use C*$* assert do (concurrent) follows. The DO loop can execute safely in parallel, given the value of M is greater than the value of N . Preceding the loop with C*$* assert do (concurrent) allows parallel execution to happen.

C*$*    ASSERT DO (CONCURRENT)
        DO I = 1,N
           X(I) = X(I+M)
        ENDDO

KAP does not generate parallel code if you use the /noconcurrent command-line qualifier.


Previous Page | Next Page | Contents | Index |
Command-Line Qualifiers