Ordonnancement modulo sous contraintes de ressources

Dans le document Programmation linéaire en nombres entiers pour l'ordonnancement cyclique sous contraintes de ressources (Page 27-36)

Avant d'introduire l'ordonnancement modulo, il est important de situer ce problème par rap-port au contexte de ce travail. En introduction, nous précisons que le terme ordonnancement modulo désigne un ordonnancement périodique tel que l'allocation des ressources pour une opé-ration donnée ne change pas d'une itéopé-ration sur l'autre.

1.3.1 Contexte : parallélisme d'instructions et pipeline logiciels

Les systèmes embarqués sont des systèmes d'exploitation conçus pour fonctionner sur des machines de petite taille. Les applications déployées sur de tels dispositifs sont principalement dédiées au multimédia et au traitement d'image ou du signal, comme par exemple, la lecture de chiers vidéos, de musique ou encore des animations ash. Une caractéristique des systèmes embarqués est leur gestion avancée de l'énergie et leur capacité à fonctionner avec des ressources limitées. Aujourd'hui, l'application de parallélisme au niveau instruction permet une simplica-tion de leur architecture.

Le parallélisme au niveau instruction (Instruction level paralleslism (Rau and Fisher, 1993)) permet l'exécution de plusieurs opérations de façon parallèle, ce qui entraîne une accélération signicative des performances. Un exemple de parallélisme au niveau instruction sur des proces-seurs est donné par les architectures super-scalaires et VLIW. En outre, dans les architectures VLIW une partie de la gestion du parallélisme d'instructions ("pipeline logiciel") est géré dans le compilateur.

Dans l'exemple de boucle suivant, l'opération w[i+1] dépend des résultats de l'opération z[i]. Les opérations z[i] et x[i] ne dépendent pas d'une autre opération, de sorte qu'elles peuvent être traitées simultanément.

int n , int b , int z[] , int c[] , int w[] ; Pour ( int i =1; i<=n ; i++)

{

x[ i ] = c[ i ]2;

w[ i +1] = z[ i ] + c[ i ] ; }

Si nous supposons que chaque opération peut être eectuée en une seule unité de temps, ces trois instructions peuvent être alors exécutées dans un total de deux unités de temps.

La technique de "pipeline logiciel" (Lam, 1988) permet d'aller encore plus loin dans le paral-lélisme et dans l'imbrication des instructions d'une boucle. Selon le groupe de recherche sur l'ordonnancement (Carlier et al., 1993), les pipelines sont des machines composées de proces-seurs parallèles spécialisés appelés unités fonctionnelles qui échangent des données au travers de registres plus ou moins partagés. Leur contrôle est assuré au moyen d'un microprogramme, donc chaque instruction gère l'activation des unités fonctionnelles ainsi que les chemins de données pendant une unité de temps.

Plus particulièrement, les techniques de pipeline logiciel sont utilisées dans le domaine de la synthèse haut niveau de circuits. Une des principales tâches de la synthèse de haut niveau est l'ordonnancement dans le temps des opérations que le circuit doit réaliser (Eddine et al., 2002). Généralement, les circuits doivent réaliser des traitements itératifs qui sont équivalents à une boucle innie. Dans les traitements itératifs, l'ordonnancement doit déterminer un ordre sta-tique pour les exécutions répétitives des opérations génériques. Les problèmes de la synthèse haut niveau peuvent être ainsi identiés comme des problèmes à machines parallèles. L'ordon-nancement doit donc exploiter les deux niveaux de parallélisme présents dans les traitements itératifs : le parallélisme entre les opérations d'une même itération et le parallélisme entre les opérations qui appartiennent à des itérations diérentes (Eddine et al., 2002). Le problème de la synthèse haut niveau peut être ainsi modélisé par un problème d'ordonnancement général où l'objectif est la minimisation du nombre de ressources utilisées pour ordonnancer les opérations dans une fenêtre de temps (Sevaux et al., 2011). Les opérations appartenant à diérentes ité-rations doivent être exécutées de façon parallèle (Rossi and Sevaux, 2008). Pour plus de détails sur le problème de la synthèse haut niveau et le pipeline logiciel, nous renvoyons à ’·cha and Hanzálek (2011, 2008).

En revenant au problème d'ordonnancement d'instructions, l'objectif du pipeline logiciel est de minimiser λ de sorte que les diérentes unités fonctionnelles dans l'architecture soient utilisées ecacement. Plusieurs approches ont été développées depuis l'invention du pipeline logiciel. Dans cette thèse nous allons nous concentrer sur une technique de pipeline logiciel : le modulo sche-duling ou ordonnancement modulo.

La formulation générale de pipeline logiciel a été donnée par Rau and Fisher (1993). Ils ont intro-duit la contrainte modulo et des bornes inférieures pour l'intervalle d'initiation ou période λ. Une amélioration du pipeline logiciel, connue comme modulo expansion, a été donnée par Lam (1988). Cette amélioration consiste en une combinaison de deux techniques : une technique d'ordonnan-cement par constructions itératives et une technique de réduction hiérarchique. Cette hybridation permet de traiter de multiples blocs comme des opérations d'un bloc de base. Plus tard, Rau (1994) propose une nouvelle méthode d'ordonnancement modulo, appelée modulo scheduling ité-ratif. Dans ce cas, un ordonnancement est recherché à partir d'une valeur de λ (généralement la plus petite valeur possible). Si aucun ordonnancement valide n'est pas trouvé, alors la valeur de λ doit s'incrémenter jusqu'à trouver un ordonnancement valide. Les principaux avantages du modulo scheduling itératif sont : la génération d'ordonnancements optimaux en λ pour 96% des

boucles, l'obtention de temps d'exécution totale des boucles qui sont seulement 2.8% plus long que la borne inférieure et l'ordonnancement de seulement 59% d'opérations additionnelles par rapport à l'ordonnancement acyclique (Rau, 1994).

Le Modulo scheduling ou ordonnancement modulo est un cas particulier d'ordonnan-cement cyclique. C'est un ordonnand'ordonnan-cement périodique où toutes les tâches ont le même intervalle d'initiation λ et où l'allocation des ressources est conservée pour toutes les instances des tâches. Autrement dit, un problème d'ordonnancement modulo correspond à un problème d'ordonnan-cement périodique où l'on considère uniquement l'ensemble des tâches génériques. Ceci simplie de manière signicative le problème à résoudre. Dans ce type de problèmes, les contraintes de précédence correspondent aux contraintes de précédence données par (1.8) qui ont été obtenues en remplaçant la date de début périodique ou (date de début modulo) dans les contraintes de précédence uniformes (1.3).

1.3.2 Formulation du problème d'ordonnancement modulo sous

con-traintes de ressources

Soit R un ensemble de m ressources. Chaque tâche générique i ∈ O demande une quantité bs

i de chaque ressource de type s ∈ R. Une ressource s a une disponibilité limitée Bs telle que bsi ≤ Bs pour toute tâche i ∈ O. Le problème consiste à ordonnancer dans le temps l'exécution répétitive d'un ensemble de tâches liées par des contraintes de précédence, en utilisant un nombre limité de ressources. Dans le problème d'ordonnancement cyclique, nous considérons qu'à tout instant de l'exécution des occurrences de tâches, l'usage d'une ressource ne doit pas dépasser la disponibilité de celle-ci.

Soit {σi}1≤i≤n la date de début d'un ensemble de tâches génériques {Oi}1≤i≤n, un problème d'ordonnancement modulo sous contraintes de ressources (Resource-Constrained Modulo Sche-duling désigné ci-après par son acronyme RCMSP) est déni par Dinechin (2004) avec l'ordre lexicographique entre les deux objectifs :

min Lex(λ,

n

X

i=1

wiσi) (1.10) sous les contraintes suivantes :

σi+ θji − λωji ≤ σj ∀(i, j) ∈ G.

X

i∈A(t)

bsi ≤ Bs, ∀s ∈ {1, . . . , m}, ∀t ∈ N

le premier ensemble de contraintes correspondent aux contraintes de précédence. Le deuxième ensemble de contraintes correspondent aux contraintes de ressources "modulo". nous remarquons que si λ ≥ 1, (1.2) implique que plusieurs instances de chaque tâche ne peuvent pas être ordon-nanceés de façon parallèle. En conséquence, l'ensemble des instances des tâches à l'instant t ∈ N est l'ensemble A(t) = {i ∈ {1, . . . , n}|∃q ∈ N, σq

"générique" τ ∈ {0, . . . , λ − 1} et l'ensemble F (τ) = {i ∈ {1, . . . , n}|∃q ∈ N, σi = τ + qλ} de tâches de dates de début σi telles τ = σi mod λ. En raison de la périodicité de l'ordonnance-ment, la contrainte de ressource peut être simpliée et il est également possible de démontrer qu'il existe toujours T ∈ N tel que pour t ≥ T , A(t) = F (τ) et pour chaque t < T , A(t) ⊂ F (τ) où t = τ + qλ. Nous pouvons ainsi écrire la contrainte de ressource comme la contrainte de ressources "modulo" suivante :

X

i∈F (τ )

bsi ≤ Bs, ∀s ∈ {1, . . . , m}, ∀τ ∈ {0, . . . , λ − 1} (1.11)

Le problème est simplié par la recherche d'un ordonnancement commun qui initie les itéra-tions successives qui seront répétés avec un écart de λ unités. L'objectif principal du problème d'ordonnancement modulo sous contraintes de ressources est de minimiser la période λ. Un ob-jectif secondaire est de minimiser le makespan des itérations (plus grande date de n des tâches génériques), ou bien une fonction pondérée des dates de n des opérations génériques. En ordon-nancement d'instructions, chaque variable intermédiaire (donnée) produite par une opération, dois être sauvegardée dans un registre tant que toutes les opérations utilisant cette donnée n'ont pas été exécutées. La période de vie d'une variable est l'intervalle déni par l'instant de sa créa-tion et l'instant de sa dernière utilisacréa-tion. Les variables qui ont des périodes de vie disjointes peuvent partager le même registre. L'un des principaux critères d'optimisation est la minimi-sation du nombre de registres (Eddine et al., 2002). Dans le cas où le nombre d'allocation de registres est une contrainte signicative, l'objectif secondaire peut être utilisé pour favoriser la minimisation de la durée de vie cumulée des registres (bien que nous ne prenions pas en compte explicitement les registres dans cette étude).

Pour illustrer le problème d'ordonnancement modulo sous contraintes de ressources, nous considérons le graphe de précédences donné dans l'exemple 1.1 avec des demandes en ressources décrites dans la table suivante :

Ressources R1 R2 R3 R4 Disponibilité 4 1 1 2 Opérations R1 R2 R3 R4 1 1 0 0 0 2 1 1 0 0 3 1 1 0 0 4 1 1 0 0 5 1 0 0 0 6 1 1 0 0 7 1 0 0 0 8 1 0 0 0 9 1 0 1 1 10 1 0 0 0

Table 1.1  Disponibilité et demande de ressources.

L'ordonnancement de la gure 1.8 respecte les contraintes de précédence et de ressources spéciées, avec une période optimale λ = 4.

4.2 4.1 8.1 7.1 8.2 7 2 3 4 5 6 1 8 9 9.1 4.1 2.1 3.1 6.1 4.2 9.1 9.1 4.0 1.0 3.0 6.0 9.0 9.0 1.0 4.0 2.0 8.0 7.0 5.0 9.0 3.0 1.1 6.0 10.0 2.1 5.1 3.1 6.1 10.1 1.2 R1 R2 R3 R4

Figure 1.8  Ordonnancement modulo sous contraintes de ressources optimal.

Dans cette thèse nous nous sommes intéressés au cas d'architectures VLIW. Plus particuliè-rement, nous travaillons avec des instances provenant du compilateur ST200 (Dinechin, 2004). Dans ce compilateur, l'allocation des registres n'est pas le problème le plus critique. Ceci est la raison de xer la minimisation du makespan des itérations comme l'objectif secondaire du problème.

Résolution du problème d'ordonnancement modulo sous contrainte de ressource. Dans la théorie classique d'ordonnancement modulo (Rau and Fisher, 1993), une méthode itérative est généralement utilisée pour la recherche d'un λ réalisable. Il s'agit de chercher des ordonnancements modulo réalisables pour une valeur de λ xée. Cette valeur de λ est obtenue comme

λmin= max(λres, λprec), où nous notons λprec= max

µ circuit de G θ(µ) ω(µ) et λres= max 1≤s≤m Pn i=1bsi Bs . λprec est la valeur minimale de λ tel que le graphe de précédence est réalisable (voir section 1.2.2). λres est la valeur minimale de λ qui permet que les disponibilités de ressources Bs ne soient jamais dépassées. Le problème d'ordonnancement modulo ne peut pas être résolu avec des techniques classiques d'ordonnancement. Dans le graphe de précédence de ce problème, il est possible de trouver des circuits ou des cycles avec des latences de précédences (θj

i − λωij) négatives. De plus, les contraintes de ressource sont de type "cumulatif" et, en même temps, ces contraintes de ressource modulo sont paramétriques par rapport à λ (Dinechin, 2004). Le problème d'ordonnancement modulo sous contraintes de ressources apparaît donc comme un problème d'ordonnancement de projet sous contraintes de ressources avec time lags maximaux et des contraintes de ressource modulo (Dinechin, 2004).

pré-traitement de la boucle. La disponibilité des ressources est considérée illimitée. L'objectif est d'eacer quelques n÷uds du graphe de précédences de manière à obtenir un graphe de précé-dence acyclique et de construire ainsi une nouvelle boucle avec des contraintes de ressources limitées. Wang et al. (1994) présentent une nouvelle approche appelée "Decomposed software pi-pelining" ou (DSP). La technique consiste en la transformation du vecteur colonne d'instructions (σi) en une matrice à deux dimensions. Les lignes représentent les cycles où les opérations sont exécutées (σi mod λ) et les colonnes indiquent l'itération dans la boucle d'origine. Le problème est alors divisé en deux sous-problèmes. En utilisant l'approche DSP, Benabid and Hanen (2009, 2011) présentent une extension des approches de Gasperoni and Schwiegelshohn (1994) et Cal-land et al. (1998) dans le cas de demandes de ressources unitaires avec contraintes de précédence. Les auteures donnent une borne du pire cas pour l'approche DSP avec un algorithme de liste pour la phase de compaction de boucle.

Des formulations de programmation linéaire en nombres entiers pour le problème d'ordon-nancement modulo ont été proposées par Eichenberger and Davidson (1997) et Dinechin (2004). Dans Eichenberger and Davidson (1997), la formulation consiste à trouver les dates de débuts des tâches génériques en utilisant deux variables qui représentent les deux sous problèmes cités ci-dessus. Dinechin (2004) propose une formulation de variables entières indexées dans le temps utilisant des variables binaires indicées par le temps pour représenter directement les variables σi, inspiré par les formulations classiques du problème d'ordonnancement sous contraintes de ressources données par Pritsker et al. (1969) et Christodes et al. (1987). Nous reviendrons sur ces formulations dans le chapitre suivant. Govindarajan et al. (1994) présentent une nouvelle approche en utilisant aussi des contraintes de ressources dans le pipeline logiciel. Cette approche concerne une formulation de programmation linéaire en nombres entiers en intégrant la minimi-sation du nombre de tampons donnant une bonne approximation à la minimiminimi-sation du nombre de registres. Une solution optimale est obtenue pour plus de 91% des instances en 30 secondes. de Dinechin (2007) propose une heuristique de recherche à grand voisinage (LNS) pour résoudre une formulation de variables entières indexées dans le temps. Dans ce cas, les résultats montrent que LNS est très ecace pour trouver une solution dans le période λ − 1 à partir de une période λdonné. de Dinechin (2004) propose une approche basée sur le déroulage de l'ordonnancement modulo et l'application de techniques d'ordonnancement acyclique pour garantir la régularité de l'ordonnancement déroulé obtenu. Lombardi et al. (2011) ont implémenté une méthode telle que la valeur de la période λ n'est pas xée apriori. Une heuristique pour l'ordonnancement cyclique basée sur une recherche itérative d'aplanissement (Iterative atenning) a été testée sur notre ensemble d'instances d'expérimentations. Nous invitons le lecteur à lire les documents suivants pour plus de détails sur la résolution du problème d'ordonnancement modulo sous contraintes de ressources (Aiken et al., 1995; Calland et al., 1996, 1998; de Dinechin, 1995, 1997, 1999, 2004).

1.3.3 Modèle d'architecture ST200

Nous présentons le cas particulier du problème d'ordonnancement modulo sous contraintes de ressources, correspondant au compilateur du processeur ST200 qui est basé sur une tech-nologie commune entre Hewlett-Packard laboratoires et STMicroelectronics (Dinechin, 2004). Ce processeur exécute quatre opérations par cycle de temps ou période avec une opération de contrôle (goto, jump, call, return), une opération de mémoire (load, store, prefetch) et deux opérations de multiplication par cycle. Les contraintes de ressource du processeur ST200 sont

modélisées avec des ressources cumulatives, autrement dit, des ressources qui peuvent être utili-sées par plusieurs tâches simultanément mais en nombre limité (comme dénies dans la section précédente). Pour une description détaillée de processeur ST200, nous nous référons à Dinechin (2004). Dans le cas du processeur ST200, la table 1.1 présente six ressources. Width représente le nombre maximum d'instructions par cycle, IMX représente la valeur étendue, MUL représente l'operateur de multiplication, MEM représente l'unité de mémoire et CTL l'unité de contrôle. Un ressource articielle ODD représente la contrainte de position des opérations. Pour l'ordonnance-ment des instructions, les demandes en ressources pour l'exécution des tâches sont représentées par des classes de ressources, ALU, ALUX, MUL, MULX, MEM, MEMX, CTL. Les classes de ressources ALU, MUL, MEM et CTL correspondent respectivement au cycle simple, aux opérations de multiplication, de mémoire et contrôle. Les classes AUX, MULX et MEMX correspondent aux opérations avec un opérande immédiat étendu (Dinechin, 2004).

Ressource Width IMX MUL MEM CTL ODD Disponibilité 4 2 2 1 1 2 Classe de Ressource Width IMX MUL MEM CTL ODD

ALU 1 ALUX 2 1 1 MUL 1 1 1 MULX 2 1 1 1 MEM 1 1 MEMX 2 1 1 1 CTL 1 1 1

Table 1.2  Disponibilité des ressources cumulatives et classes de ressources.

Pour illustrer le problème d'ordonnancement modulo sous contraintes de ressource sur le pipeline logiciel, nous montrons dans la gure 1.9 un exemple (de Dinechin et al. (2010), p. 270) d'un programme en langage C et ses opérations correspondantes sur le processeur ST200. Le processeur exécute quatre opérations par unité de temps avec une opération de contrôle au maximum (goto, jump, call, return), une opération mémoire (load, store, prefetch) et deux opérations de multiplication. Le temps de traitement de chaque opération est unitaire et les latences θj

i entre les opérations varient entre 0 et 3 unités du temps.

La table 1.3 présente les contraintes de ressources et la gure 1.10 montre le graphe de précé-dence. Chaque n÷ud représente une opération générique et chaque arc représente une précédence uniforme. Deux variables ctives représentent le début et la n de l'ordonnancement. Les paires de valeurs (θj

i, ωji)sont montrées pour chaque arc.

0 1 2 4 6 5 3 7 8 (0,0) (0,0) (0,0) (0,0) (1,1) (1,1) (1,0) (1,1) (0,1) (1,4) (3,0) (3,0) (0,0) (1,1) (1,0) (0,0)

Figure 1.10  Graphe de précédence uniforme. Ressource Issue Memory Control Align Disponibilité 4 1 1 2 ALU 1 ALUX 2 1 MUL 1 1 MULX 2 1 MEM 1 1 MEMX 2 1 1 CTL 1 1 1

Table 1.3  Disponibilité des ressources cumulatives

La gure 1.11 montre le graphe de précédences avec les valeurs d'arcs (θj

i + λωji) pour une valeur λ = 2 et l'ordonnancement modulo correspondant avec Cmax = 6 qui permet de respecter les contraintes de précédence et de ressources. Dans le cas de graphe de précédences la transfor-mation est fait en remplaçant les valeurs des latences et distances. Par exemple, la précedence entre le n÷ud 4 et 6 est caracterisée par une latence θ6

4= 1et une distance ω6

4= 0. Donc, avec une valeur de λ = 2 la nouvelle valeur d'arc est 1.

Figure 1.11  Graphe de précédence uniforme et ordonnancement périodique.

1.3.4 Description des instances pour l'expérimentation

Dans cette thèse, nous utilisons deux groupes d'instances. Le premier groupe est constitué de 36 instances à durées unitaires provenant du processeur ST200 de STMicroelectronics, c'est-à-dire des instances correspondant à l'architecture présentée en la section 1.3.3. L'ensemble d'instances ST200 est caractérisé en termes de consommation des ressources principalement unitaires (voir table 1.2).

Le deuxième groupe d'instances correspond à une modication du premier ensemble d'ins-tances. Nous avons changé la capacité des ressources en xant pour chaque ressource une capacité égale à 10. Ensuite, nous avons généré de façon aléatoire (U ∼ [1, 10]) la consommation de chaque tâche sur chaque ressource. Les graphes de précédence restent identiques aux graphes du premier groupe d'instances. L'objetif de ce nouveau ensemble d'instances est d'obtenir contraintes de ressources plus fortes. L'instance plus petite, gsm-st231.10.rcms est composée de 10 tâches gé-nériques et 42 relations de précédence. L'instance plus grande, gsm-st231.18.rcms est composée de 214 tâches génériques et 1063 relations de précédence.

Le tableau 1.4 montre les caractéristiques de chaque instance du compilateur ST200, le nombre d'opérations, (#oper), le nombre de contraintes de précédences (#prec), la borne de précédence (λprec), la borne de ressource pour les instances industrielles du processeur ST200 (λres (ind))

et la borne de ressources pour le groupe d'instances modiées (λres (mod)). Notons que les contraintes de ressource sont plus serrées dans le cas des instances modiées.

Instance #oper #prec λprec λres(ind) λres(mod)

adpcm-st231.1 86 405 11 21 52 adpcm-st231.2 142 722 38 35 82 gsm-st231.1 30 190 24 12 16 gsm-st231.2 101 462 12 26 59 gsm-st231.5 44 192 4 11 26 gsm-st231.6 30 130 3 7 17 gsm-st231.7 44 192 4 11 28 gsm-st231.8 14 66 1 8 9 gsm-st231.9 34 154 28 8 21 gsm-st231.10 10 42 1 4 6 gsm-st231.11 26 137 20 6 16 gsm-st231.12 15 70 1 8 10 gsm-st231.13 46 210 19 11 27 gsm-st231.14 39 176 5 10 20 gsm-st231.15 15 70 1 8 9 gsm-st231.16 65 323 4 16 38 gsm-st231.17 38 173 8 9 23 gsm-st231.18 214 1063 8 53 120 gsm-st231.19 19 86 2 8 12 gsm-st231.20 23 102 3 6 13 gsm-st231.21 33 154 18 8 20 gsm-st231.22 31 146 18 8 18 gsm-st231.25 60 273 10 16 37 gsm-st231.29 44 192 4 11 28 gsm-st231.30 30 130 3 7 16 gsm-st231.31 44 192 4 11 26 gsm-st231.32 32 138 15 8 21 gsm-st231.33 59 266 4 15 33 gsm-st231.34 10 42 2 4 7 gsm-st231.35 18 80 2 6 12 gsm-st231.36 31 143 2 10 18 gsm-st231.39 26 118 3 8 15 gsm-st231.40 21 103 2 10 12 gsm-st231.41 60 315 2 18 33 gsm-st231.42 23 102 3 6 14 gsm-st231.43 26 115 8 6 15

Table 1.4  Caractéristiques des instances industrielles (processeur ST200) et des instances modiées

Dans le document Programmation linéaire en nombres entiers pour l'ordonnancement cyclique sous contraintes de ressources (Page 27-36)