• Aucun résultat trouvé

CHAPITRE 2 Revue de littérature

2.3 Modèle polyèdral et dépendances de données

2.3.2 Dépendances de données

Banerjee, dans [11], a présenté les enjeux reliés à l’analyse de dépendance de données. Dans ce livre, il définit qu’une dépendance entre deux énoncés T et S d’un code se décrit comme suit : on dit que T dépend de S, S < T, si l’exécution de l’énoncé T requiert la valeur générée par l’énoncé S. On dira que T dépend lexicographiquement de

S si l’exécution de S doit toujours précéder celle de T, dans l’espace de valeurs possibles

des indices d’itération. En effet, dans certains cas, la dépendance pourrait ne pas être vraie selon l’espace des indices d’itération.

Banerjee [11] décrit quatre types de dépendances qui sont :

Dépendance de flot : si l’énoncé S(i) écrit dans M et que T(j) lit la valeur de M, M étant une case mémoire ou une variable temporaire.

Anti-dépendance : si S(i) lit M et que T(j) écrit dans M.

Dépendance de sortie : si S(i) et T(j) écrivent tous les deux dans M. Dépendance d’entrée : si S(i) et T(j) lisent dans M.

Une dépendance peut être transportée par la boucle (« loop-carried ») ou elle peut être indépendante de la boucle (« loop-independent »). Une dépendance transportée par la boucle est telle que, pour toute paire (S(i), T(j)), T(j) dépend de S(i) quel que soit l’espace des valeurs d’indices d’itération des indices i et j. Cette dépendance stipule que l’exécution de T à l’itération j dépend de l’exécution de S à l’itération i. Une dépendance indépendante de la boucle est une dépendance qui existe seulement dans une itération précise à savoir que T(i) dépend de S(i) (i.e. j=i).

Plusieurs types de graphe ont été proposés pour représenter les dépendances d’un nid de boucles comme l’ont montré Darte et al. [45]. Un graphe très utilisé est le graphe étendu de dépendances (EDG), aussi appelé le graphe de dépendances au niveau instruction. Un EDG, G, est un graphe tel que :

Pour chaque variable Vi(p) qui dépend de Vk(p-dk,i), il y aura une transition entre

les noeuds vi et vk et la transition aura un poids dk,i, en sachant que dk,i est le vecteur de

distance de la dépendance ente les variables Vi et Vk (vecteur de distance : différence

entre les fonctions d’accès initiales de Vi et celle de Vk).

Le EDG a d’abord été introduit pour représenter des systèmes d’équations uniformes récurrentes (SURE) proposés par Karp et al. [83]. Les SURE ont été proposés pour mieux comprendre la structure des calculs dans un contexte répétitif et régulier en vue d’une parallélisation. Étant donné que les SURE ne permettaient pas de définir des systèmes répétitifs et irréguliers, un autre type de système a été proposé. Il s’agit des systèmes d’équations affines récurrentes (SARE). Les SARE peuvent être générés à partir d’un EDG. Les SARE ont été proposés en premier pour la conception d’architectures systoliques [145, 148, 189]. Dans le chapitre 6, une des étapes du processus d’estimation du temps d’exécution d’un nid de boucles consiste à générer le SARE correspondant. Une équation d’un SARE se formule comme suit :

.))

(w[g[x],..

F

v[f(x)]

:

I

x

S

=

v

(

(1)

Une équation d’un SARE définit les dépendances d’une variable ou d’un énoncé d’un programme selon un domaine d’itérations IS. Ainsi, l’équation 1 stipule que pour x compris dans le polyèdre IS, la valeur de v à l’itération f(x) dépend de la fonction Fv qui prend comme argument la valeur de w à l’itération g(x) et ainsi de suite. f(x) et g(x) sont les fonctions d’accès des variables v et w.

Par exemple, dans le nid de boucles illustré par la Figure 6.a, le Tableau A est mis à jour dans deux branches parallèles S1 et S2. Ces branches dépendent de la valeur des indices d’itération i et j. Le SARE décrivant les dépendances de A comprend deux équations ARE1 et ARE2 données à la Figure 6.b.

do i = 1,n do j = 1,n if (i<n-2-j)

S1 : A[i,j] = B[i+1,j] + C[i,j] else

S2 : A[i][j] = B[i][j]

ARE1 : {i>=1, -i+n>=0, j>=1, -j-n>=0, i<-j-n-2} :

A[i,j] = Fv(B[i+1,j], C[i,j])

ARE2 : {i>=1, -i+n>=0, j>=1, -j-n>=0, i>=-j-n-2} :

A[i,j] = Fv(B[i,j])

(a) (b)

Figure 6. Exemple de SARE. a) Exemple de nid de boucles. b) ARE de S1 et S2.

Comme on peut le remarquer dans la première équation ARE1, la variable A dépend des variables B et C dont les fonctions d’accès sont égales à [i+1,j] et [i,j], respectivement.

Le EDG facilite la représentation des dépendances entre différents énoncés de code ou différentes variables d’un programme. Ensuite, le problème qui se pose est de trouver un ordonnancement qui définit le temps d’exécution des énoncés en fonction des indices d’itération, par exemple. L’ordonnancement permettra aussi de déterminer le degré de parallélisme intrinsèque des énoncés d’un nid de boucles [53]. Plusieurs algorithmes d’ordonnancement [44, 52, 53, 83, 148, 157] ont été proposés pour trouver les fonctions de temps associées à chaque énoncé. Le but de ces algorithmes est de résoudre le problème formulé par l’équation 2.

1

)

,

(

)

,

(

R

,

,

,

<

>∈

e

+

D

y

D

x

y

S

y

R

x

x

R S

θ

θ

(2)

L’équation 2 stipule que le temps d’exécution θ(S, y) de l’énoncé S à l’itération y doit être supérieur au temps d’exécution de θ(R, x) de l’énoncé de R à l’itération x. Cela signifie que S,y ne pourra s’exécuter qu’après l’exécution de R,x plus 1, sachant que 1 est la durée d’exécution de l’énoncé R. Comme nous l’avons dit précédemment, les SARE ont été proposés pour la parallélisation dans des systèmes multiprocesseurs ou des architectures systoliques dans lesquels on considère qu’une opération s’exécutera en un cycle d’horloge. C’est la raison pour laquelle l’équation 2 considère que la durée d’exécution de R sera égale à 1. Cette durée peut évidemment être modifiée en fonction

des délais de l’architecture ciblée. Donc, le but est d’exprimer le temps associé à chaque énoncé du programme en fonction des indices d’itération, en sachant que les contraintes de précédance devront être respectées pour tout domaine de valeurs des indices.

Parmi les algorithmes d’ordonnancement, le plus populaire et le plus utilisé est celui conçu par Feautrier. Ce dernier a d’abord proposé un algorithme qui cible des systèmes uni- et bi- dimensionnels [53]. Ensuite, il a généralisé l’algorithme pour cibler des systèmes multidimensionels [52]. Le problème d’ordonnancement est finalement réduit à la résolution d’un système d’équations linéaires. Les algorithmes d’ordonnancement qui étaient proposés avant celui de Feautrier nécessitaient la transformation du système d’équations affines en un système d’équations uniformes afin de trouver les fonctions de temps. Malheureusement, dans certains cas, cette transformation n’est pas faisable. L’avantage de l’algorithme de Feautrier est qu’il ne nécessite pas l’uniformisation du SARE. Cependant, il faut noter que les architectures systoliques requièrent des systèmes d’équations uniformes, raison pour laquelle, dans certains cas, il est utile d’effectuer l’opération inverse à savoir la transformation d’un système irrégulier à un système régulier [108]. Dans l’annexe A, nous détaillons l’algorithme d’ordonnancement de Feautrier. Cet algorithme a été implémenté dans un outil nommé PIP [14] qui est très utilisé par les chercheurs utilisant le modèle polyèdral.