next up previous contents
Next: !HPF$ INDEPENDENT Up: Paralelní práce procesorů Previous: Paralelní práce procesorů   Obsah


FORALL

Příkaz FORALL je vlastně alternativou ke smyčce DO. Jím uvozené operace se ale smí provádět v pořadí nezávislém na indexu, takže výpočet může probíhat paralelně na několika procesorech. Je však třeba dodržovat určitá pravidla, aby nedocházelo ke kolizím. FORALL má (stejně jako IF) dvě možné podoby. První, kratší z nich, má syntaxi

\begin{eqnarray*}
&&\mbox{{\tt FORALL ( }{\it rozsah\_prvního\_indexu }{\tt , }...
...sledního\_indexu }{\tt , }
{\it maska }{\tt ) }{\it přiřazení}}
\end{eqnarray*}



kde rozsah má tvar

\begin{eqnarray*}
&&\mbox{{\it řídící\_proměnná }{\tt = }{\it počáteční\_hodnota }{\tt : }
{\it konečná\_hodnota }{\tt : }{\it krok }}
\end{eqnarray*}



přičemž krok je jako obvykle nepovinný, implicitně 1. Přiřazení (aritmetických výrazů nebo ukazatelů) se provede pro každý prvek, který se nachází v určeném rozsahu pole, není-li vyloučen maskou. V následujících příkladech se prvkům MATICE1 přiřadí součet jejich indexů, vynuluje se levý dolní trojúhelník MATICE2 a diagonála MATICE3 se nahradí jedničkami:

FORALL (I=1:M, J=1:N)      MATICE1(I,J) = I+J
FORALL (I=1:N, J=1:N, I<J) MATICE2(I,J) = 0.0
FORALL (I=1:N)             MATICE3(I,I) = 1.0
Bloková verze konstruktu, řekněme

FORALL (I=2:M-1, J=2:N-1)
   A(I,J) = 0.25 * ( A(I,J-1) + A(I,J+1) + A(I-1,J) + A(I+1,J) )
   B(I,J) = A(I,J)
END FORALL
se zpracovává ve stejném pořadí, jako by se jednalo o sled jednoduchých příkazů FORALL. Tím je zajištěna jednoznačnost výsledku.



Pavel Vachal
2001-05-31