Exemples
Exemple 1 : Addition d'une matrice et de sa transposée
A = matrix :: A
T = A transp C = add (A /&/ T) |
La première équation est une précondition sur le champ de donnée en entrée A. Elle exprime que A n'est pas modifié par l'application du changement de base matrix.
La deuxième équation définit le champ T par une opération de routage appliquée sur A. Les valeurs placées aux points de coordonnées (i,j) dans T sont celles placées en (j,i) dans le champ A.
La troisième équation définit le champ de données en sortie C. La partie droite définit la superposition de A et T. L'opération fonctionnelle définie ici consiste en l'application de la fonction add à tous les éléments de ce champ.
Exemple 2 : Changement de base
|
|
|
|
|
|
|
|
|
Exemple 4 : Réduction géométrique
|
|
|
Exemple 5 : Opération fonctionnelle
|
|
|
Exemple 6 : Sémantique d'une équation
La sémantique de E est
Exemple 7 : Interprétation fonctionnelle d'un champ résultat
P: V B
V = align :: M
A = M spread B = inc A |
De la première équation, on tire vV = vM o align-1 et V = M o align-1. Il n'y a pas de changement de base entre les champs A, B et M donc A = B = M.
[[B]] = [[inc A]]
et finalement vB = inc o vV o align o spread
Exemple 8 : Raffinement d'un programme
P2: X Y
|
P3: X Y
transp = (i,j)|(0<=i,j<n).(j,i) |
Exemple 9 : Méthodes de raffinement
Raffinement par introduction d'un champ intermédiaire
P2: X Y
|
P3: X Y
|
P4: X Y
|
P5: X Y
|
P6: X Y
vecteur :: Z = X
Y = vecteur :: Z |
Exemple 10 : Construction
d'un programme de multiplication de matrices avec VPEI
Exemple 11 : Transformation par changement de base
Le programme Gauss1 fait appel à des opérations de type diffusion, comme par exemple la fonction pivot, en choisissant l'axe k comme direction d'ordonnancement.
Le programme Gauss2 est une version systolique du programme Gauss1, obtenu par un nombre fini d'applications successives des règles de raffinement, définissant ainsi une stratégie bientôt implantée dans l'environnement de transformation.
Gauss1 : (A,B) (XN,YN)
A = alignx :: X
B = aligny :: Y C = el (X /&/ Y /&/ (C pre) /&/ (C cp) /&/ (C lp) /&/ (C pivot)) XN = C last1 YN = C last2 |
Gauss2 : (A,B) (XN,YN)
A = alignx' :: X
B = aligny' :: Y C = el (X /&/ Y /&/ (C pre') /&/ (C cp') /&/ (C lp') /&/ (C pivot')) XN = C last1' YN = C last2' |
Exemple 12 : Simplification des communications - application au produit matrice-vecteur
Dans le programme Matvect1,
le vecteur b est initialement placé sur la diagonale de la
matrice A. A chaque étape indexée par k, on
effectue n produits pii = Ai,i x bi
sur la diagonale. Tous les éléments de A sont ensuite
décalés vers la gauche, et les éléments de
b sont décalés le long de la diagonale, vers le haut
à gauche, les bords étant bouclés toroïdalement.
Au bout de n étapes, on possède l'ensemble des produits
sur le plan (i = j) du cube.
|
B0 = cube :: B0 M = aligna :: A0 V = alignb :: B0 A = A0 /&/ (A left) B = B0 /&/ (B upleft) P = prod ((A /&/ B) diag) |
left = | (i,j,k)|(0<=k<n).(i,(j+1) mod n,k) o |
(i,j,k)|(0<k<n & 0<=i,j<n).(i,j,k-1) | |
= | g o prev |
upleft = | (i,j,k)|(0<=k<n).(i,(j+1) mod n,k) o |
(i,j,k)|(0<=i,j<n).((i+1) mod n,j,k) o | |
(i,j,k)|(0<=i,j<n & 0<k<n).(i,j,k-1) | |
= | g o up o prev |
A = A0 /&/ (A left) | h :: A = (h :: A0) /&/ ((h :: A) prev) |
B = B0 /&/ (B upleft) | h :: B = (h :: B0) /&/ ((h :: B) up o prev) |
On doit ensuite exprimer les champs M
et V, qui dépendent de A0
et B0 en fonction de h
:: A0 et h :: B0, soit :
M = (aligna o h-1 o h) :: A0 | M = aligna o h-1 :: (h :: A0) |
V = (alignb o h-1 o h) :: B0 | V = alignb o h-1 :: (h :: B0) |
Enfin, il faut introduire h :: A
et h :: B dans l'équation
définissant, ce qui donne, après transformations :
P = prod ((A /&/ B) diag) | h :: P = prod (((h :: A) /&/ (h :: B)) diag') |
On obtient ainsi le programme Matvect1'
:
h :: A0 = cube :: (h
:: A0)
h :: B0 = cube :: (h :: B0) M = aligna :: (h :: A0) V = alignb :: (h :: B0) h :: A = h :: A0 /&/ ((h :: A) prev) h :: B = h :: B0 /&/ ((h :: B) up o prev) h :: P = prod (((h :: A) /&/ (h :: B)) diag') |
cube | = (i,j,k)|(0<=i,j,k<n).(i,j,k) |
prev | = (i,j,k)|(0<=i,j<n & 0<k<n).(i,j,k-1) |
up | = (i,j,k)|(0<=i,j<n).((i+1) mod n,j,k) |
aligna | = (i,j,k)|(0<=i,j<n & k=0).(i,j) |
alignb | = (i,j,k)|(0<=i,j<n & i=j & k=0).(i) |
prod | = (a;b).(a*b) |
diag' | = (i,j,k)|(i=(j-k) mod n) |
M = aligna :: A0
V = alignb :: B0 A = A0 /&/ (A prev) B = B0 /&/ (B up o prev) P = prod (A /&/ B) diag' |
prev | = (i,j,k)|(0<=i,j<n & 0<k<n).(i,j,k-1) |
up | = (i,j,k)|(0<=i,j<n).((i+1) mod n,j,k) |
aligna | = (i,j,k)|(0<=i,j<n & k=0).(i,j) |
alignb | = (i,j,k)|(0<=i,j<n & i=j & k=0).(i) |
prod | = (a;b).(a*b) |
diag' | = (i,j,k)|(i=(j-k) mod n) |
Exemple 13 : Introduction d'une diffusion - application au produit matrice-vecteur
M = aligna :: A0
V = alignb :: B0 A = A0 spreada B = B0 spreadb P = prod ((A /&/ B) diag') |
spreada | = (i,j,k)|(0<=i,j,k<n).(i,j,0) |
spreadb | = (i,j,k)|(0<=i,j,k<n).((i+k) mod n,j,0) |
aligna | = (i,j,k)|(0<=i,j<n & k=0).(i,j) |
alignb | = (i,j,k)|(0<=i,j<n & i=j & k=0).(i) |
prod | = (a;b).(a*b) |
diag' | = (i,j,k)|(i=(j-k) mod n) |
Exemple 14 : Cadencement des équations récurrentes - processus de diffusion discrète
( | t
p |
) = ( | 1 1
1 0 |
) ( | i
j |
) |
Exemple 15 : Traduction d'un changement de base en HPF
Enoncé PEI | Traduction en HPF |
X = matrix :: X
Y = transl :: X transl = (i,j)|(1<=i,j<=n).(i+1,j) matrix = (i,j)|(1<=i,j<=n).(i,j) |
type X(1:n), type Y(2:n+1)
template T(n+1,n) align X(i,j) with T(i,j) align Y(i,j) with T(i+1,j) forall (i=1:n,j=1:n) Y(i+1,j) = X(i,j) |
Exemple 16 : Traduction d'une réduction géométrique combinée avec une opération fonctionnelle en HPF
Enoncé PEI |
|
|||
Y = sum (red
; X)
sum = id # (a;b).(a+sum(b)) red = (i,j)|(1<=i,j<=3).(i,i) |
|
[ | 1 2 3
1 2 3 1 2 3 |
]) |
Exemple 17 : Traduction d'une définition récursive en HPF
Enoncé PEI | Traduction en HPF |
Y' = f
(X' /&/ (Y' g1) /&/
(Y' g2))
g1 = (t,p)|(1<=p<=n & 1<=t-p<=n).(t-1,p-1) g2 = (t,p)|(1<=p<=n & 1<=t-p<=n).(t-1,p) |
forall
(t=1, p=0:1) Y'(t,p) = X(t,p)
do t = 2,2*n forall (p=max(1,t-n):min(n,t-1)) & Y'(t,p) = f(X'(t,p),Y'(t-1,p-1),Y'(t-1,p)) enddo |