next up previous contents
Next: Reprezentace polí v paměti Up: Paralelní práce procesorů Previous: FORALL   Obsah

!HPF$ INDEPENDENT

Představme si situaci


      INTEGER, DIMENSION (5) :: IND
      REAL, DIMENSION (10)   :: A
      REAL, DIMENSION (5)    :: B = (/ 10.0, 20.0, 30.0, 40.0, 50.0 /)
      FORALL (I=1,5)
          A(IND(I)) = B(I)
      END FORALL
Jestliže vektor indexů IND je prostým zobrazením, bude vše v pořádku. Má-li však několik jeho prvků stejnou hodnotu, můžeme dostat různé výsledky. Mějme například $IND = (1, 2, 3, 2, 1)$. Provádí-li se smyčka v pořadí $i = 1,2,3,4,5$, dostaneme $A = (50.0, 40.0, 30.0, \dots)$, zatímco při zpracování $i = 5,4,3,2,1$ je výsledek $A = (10.0, 20.0, 30.0, \dots)$.

Tomuto konfliktu zabráníme přidáním direktivy


      !HPF$ INDEPENDENT
bezprostředně před začátek cyklu. Ta automaticky ohlídá, že Direktivu INDEPENDENT lze umístit také před příkaz DO. Aplikujeme-li ji na smyčky DO FORALL se stejným obsahem, budou tyto ekvivalentní.

Jestliže má být nezávislá pouze některá část zahnízděné smyčky, přidává se ještě specifikátor NEW. Všimněme si, že v


!HPF$ INDEPENDENT, NEW(I2)
      DO I1=1,N1
!HPF$    INDEPENDENT, NEW(I3)
         DO I2=1,N2
!HPF$       INDEPENDENT, NEW(I4)
            DO I3=1,N3
               DO I4=1,N4
                  A(I1,I2,I3) = A(I1,I2,I3) + B(I1,I2,I4) * C(I2,I3,I4)
               ENDDO
            ENDDO
         ENDDO
      ENDDO
není nejvnitřnější smyčka nezávislá, protože se přiřazení každého prvku matice A provádí několikrát (pro všechny hodnoty indexu $I4$).



Pavel Vachal
2001-05-31