Next: Visualization of INDEPENDENT Up: The INDEPENDENT Directive Previous: The INDEPENDENT Directive
!HPF INDEPENDENT FORALL ( i=2:n ) a(i) = b(i-1) + b(i) + b(i+1) This example is equivalent in all respects to the first example.
!HPF INDEPENDENT, NEW (i2) DO i1 = 1,n1 !HPF INDEPENDENT, NEW (i4) DO i3 = 1,n3 DO i4 = 1,n4 ! The inner loop is NOT independent! a(i1,i2,i3) = a(i1,i2,i3) + b(i1,i2,i4)*c(i2,i3,i4) END DO END DO END DO END DO The inner loop is not independent because each element of is assigned repeatedly. However, the three outer loops are independent because they access different elements of . The NEW clauses are required, since the inner loop indices are assigned and used in different iterations of the outermost loops.
!HPF INDEPENDENT, NEW(vl, vr, ul, ur) DO j = 2 , 100, 2 vl = p(i,j) - p(i-1,j) vr = p(i+1,j) - p(i,j) ul = p(i,j) - p(i,j-1) ur = p(i,j+1) - p(i,j) p(i,j) = f(i,j) + p(i,j) + 0.25 * (vr - vl + ur - ul) END DO END DO Without the NEW option on the loop, neither loop would be independent, because an interleaved execution of loop iterations might cause other values of , , , and to be used in the assignment of than those computed in the same iteration of the loop. The NEW option, however, specifies that this is not true if distinct storage units are used in each iteration of the loop. Using this implementation makes iterations of the loops independent of each other. Note that there is no interference due to accesses of the array because of the stride of the DO loop (i.e. and are always even, therefore , etc. are always odd.)
!HPF INDEPENDENT DO i = 1, 10 WRITE (iounit(i),100) a(i) END DO 100 FORMAT ( F10.4 ) If evaluates to a different value for every , then the loop writes to a different I/O unit (and thus a different file) on every iteration. The loop is then properly described as independent. On the other hand, if for all , then the assertion is in error and the loop is not HPF-conforming.