Allocation de mémoire dynamique dans les systèmes - Lab

publicité
MajecSTIC 2010
Bordeaux, France, du 13 au 15 octobre 2010
Allocation de mémoire dynamique dans les systèmes embarqués
María Soto, André Rossi et Marc Sevaux
Université de Bretagne-Sud, Lab-STICC, CNRS, Centre de recherche BP 92116, F-56321 Lorient
Cedex, France.
Contact : [email protected]
Résumé
Les concepteurs de circuits souhaitent trouver un compromis entre le coût de l’architecture et la
consommation électrique. La gestion de la mémoire cache a un impact significatif sur les performances et sur la consommation énergétique des systèmes embarqués. Cet article traite de l’allocation de mémoire des structures de données d’une application à la mémoire cache de manière
à optimiser les performances du système. Dans le problème abordé le temps est découpé en intervalles de temps de durées différentes. Au cours de chaque intervalle de temps, l’application a
besoin d’accéder à un sous ensemble connu de structures de données. Contrairement à d’autres
versions du problème où l’on recherche une allocation statique valable pendant toute l’exécution
de l’application, on s’autorise à changer l’allocation des structures de données au cours de chaque
intervalle de temps en fonction des besoins de l’application. Le succès des métaheuristiques pour
des versions proches du problème suggèrent naturellement d’adapter ces méthodes au problème
d’allocation dynamique de mémoire dans les systèmes embarqués.
Mots-clés : Allocation de mémoire, Électronique, Recherche opérationnelle.
1. Introduction
La technologie en microélectronique a rendu possible le développement de circuits miniatures
permettant d’étendre considérablement les fonctionnalités des appareils multimédia portatifs (par
exemple la téléphonie mobile et le traitement d’images H . D). Alors que la technologie ouvre des
perspectives toujours plus larges, la conception des circuits intégrés devient, elle, de plus en plus
complexe. Cette évolution a rendu indispensable la conception de circuits par ordinateur, bouleversant ainsi ce métier. Jusqu’alors, les circuit intégrés étaient conçus à la main par des spécialistes,
mais cette façon de faire n’est plus possible pour les circuits actuels. Les outils de conception assistée par ordinateur comme Gaut [4] permettent de générer l’architecture d’un circuit intégré à
partir de ses spécifications, mais les solutions produites par ce biais souffrent généralement d’un
manque d’optimisation qui se traduit notamment par une consommation énergétique importante,
ce qui est particulièrement préjudiciable pour les systèmes embarqués.
Aussi les concepteurs de circuits cherchent-ils un compromis entre le coût de l’architecture (le
nombre de bancs mémoire à embarquer) et la consommation énergétique de l’ensemble [2]. Généralement, les électroniciens considèrent que dans une certaine mesure, minimiser la consommation est équivalent à minimiser le temps d’exécution de l’application [3]. De plus, la consommation d’une architecture donnée peut également être estimée à l’aide d’un modèle empirique
comme dans [10]. Ainsi, cherche-t-on à paralléliser l’accès aux données de manière à minimiser le
temps total d’exécution de l’application, et par conséquent sa consommation.
Dans cet article nous abordons la problématique de l’optimisation d’allocation de mémoire cache
des processeurs embarqués. En effet, la gestion de la mémoire cache a un impact significatif sur les
performances et sur la consommation énergétique comme l’ont montré Wuytack et al. dans [17].
Dans la section suivante nous présentons formellement le problème d’allocation mémoire dynamique et un exemple qui permet de mieux comprendre ce problème.
María Soto, André Rossi & Marc Sevaux
2
2. Problème d’allocation mémoire dynamique
Lors de la conception d’un circuit intégré pour un système embarqué (typiquement un décodeur
MPEG , un filtre numérique ou tout autre algorithme de traitement du signal et de l’image), l’application à synthétiser est fournie sous la forme d’un code source écrit en langage C, et les structures
de données manipulées doivent être placées dans des bancs mémoire (il s’agit de la mémoire
cache du processeur qui exécute l’application).
Le temps est découpé en T intervalles de temps de durées différentes. La durée de chaque intervalle de temps est définie et donnée pour l’application. Au cours de chaque intervalle de temps,
l’application a besoin d’accéder à un sous ensemble connu de structure de données.
Contrairement à d’autres versions du problème comme par exemple [14] où l’on recherche une
allocation statique valable pendant toute l’exécution de l’application, on s’autorise à changer l’allocation des structures de données au cours de chaque intervalle de temps en fonction des besoins
de l’application.
Généralement, les systèmes embarqués ont différents niveaux de bancs mémoire. Pour des raisons
technologiques comme pour des raisons de coût, le nombre de bancs mémoire et leurs capacités
sont limités dans chaque niveau. Les capacités des bancs mémoire dans les niveaux supérieurs
sont plus grandes que dans les niveaux inférieurs. Au contraire, le nombre des bancs mémoire
dans les niveaux inférieurs est plus grand que dans les niveaux supérieurs. Dans ce travail nous
considérons deux niveaux de bancs mémoire comme le montre la figure 1. Le premier niveau a m
bancs mémoire {MB1 , . . . , MBm } dont la capacité est c1 , et le niveau supérieur est constitué d’un
seul banc mémoire MBm+1 , lequel a une grande capacité c2 (c’est-à-dire une capacité suffisante
pour allouer toutes les structures de données) et qui est appelée mémoire externe. Les tailles
mémoire sont exprimées en kilo octets (KO).
F IGURE 1 – Schéma de Dy-MemExplorer.
Le processeur doit accéder aux structures de données pour exécuter les opérations de l’application. Une opération implique une ou plusieurs structures de données. Le temps d’accès aux
structures de données est mesuré en millisecondes. Ce temps d’accès dépend du niveau où les
structures de données sont allouées. Ainsi, le processeur dépense plus de temps pour accéder
aux structures de données qui se trouvent dans les bancs mémoire du niveau supérieur que pour
accéder aux structures du niveau inférieur. La figure 1 indique que le temps pour accéder aux
bancs mémoire du premier niveau est égal à une milliseconde et que le temps pour accéder aux
structures de données du niveau supérieur est égal à p millisecondes.
Initialement (au cours de l’intervalle de temps 0), toutes les structures de données se trouvent
dans la mémoire externe. Le temps nécessaire au déplacement des structures de données de la
mémoire externe vers un banc mémoire du premier niveau ou vice-versa est égal à v millisecondes. Le temps nécessaire au déplacement des structures de données dans des bancs mémoire
du premier niveau est égal à l milliseconde, comme le montre la figure 1. On suppose que dans
Allocation de mémoire dynamique
3
l’architecture du système il y a un contrôleur DMA (Direct Memory Access) qui permet l’accès direct aux structures de données des bancs mémoire, alors les temps d’accès générés par ce contrôlleur sont modélisés par les paramètres v et l. Ainsi, le temps de déplacement des structures de
données est inférieur à leur temps d’accès (v < p).
On fait l’hypothèse que le processeur est capable d’accéder à tous ses bancs mémoire simultanément, ce qui autorise plusieurs chargements en parallèle. Ainsi, les structures de données (ou
plus simplement les variables) a et b peuvent être chargées en même temps lorsqu’on souhaite
effectuer l’opération a+b, à condition que a et b se trouvent dans deux bancs mémoire différents.
Si ces variables partagent le même banc mémoire, le processeur ne peut y accéder que séquentiellement, ce qui nécessite deux fois plus de temps qu’un accès en parallèle. On dira que a et b sont
en conflit si elles apparaissent dans la même opération.
Tout conflit a un coût, qui est égal au nombre de fois où a et b apparaissent dans une même opération au cours de l’intervalle de temps considéré ; ce coût peut être un réel, dans le cas où le code
a été « profilé » par un outil logiciel [9, 11] basé sur une estimation stochastique de la probabilité
de branchement des instructions conditionnelles. Le recours à une estimation du nombre de fois
où une opération est effectuée se présente lorsque l’opération apparaît dans une boucle while ou
une instruction conditionelle if, else if par exemple.
Un conflit entre deux structures de données sera dit ouvert si les deux structures de données partagent le même banc mémoire, il est dit fermé si les deux structures de données ont été affectées à
deux bancs mémoire différents.
Il faut noter qu’une structure de données peut être en conflit avec elle-même. Le cas se produit typiquement lorsque la structure de données est un tableau et que l’application traduit une relation
de récurrence comme a[i] = a[i+1].
Le problème de l’allocation de mémoire est appelé Dy-MemExplorer et peut être formulé ainsi : allouer un banc mémoire à toute structure de données de l’application à chaque intervalle de temps,
de manière à minimiser le temps total d’accès aux données pour le processeur en respectant la capacité des bancs mémoire.
Dans cet article, on fait l’hypothèse que l’applicacion et ses données sont connues. En pratique, un
outil logiciel comme SoftExplorer peut produire ces données pour une application donnée, mais
les aspects relevant de l’analyse du code de l’application débordent le cadre de ce travail.
Dans le paragraphe qui suit, on propose un programme linéaire en nombres entiers (PLNE) pour
résoudre ce problème de manière exacte.
2.1. Modélisation du problème par PLNE
Soit n le nombre de structures de données de l’application et nt le nombre de structures de données auxquelles l’application doit accéder dans l’intervalle de temps t pour tout t dans {1 . . . , T }.
P
Ainsi, Tt=1 nt ≥ n. On désigne par ai,t une structure de données dans l’intervalle t pour tout
i ∈ {1, . . . , nt } et t ∈ {1, . . . , T }. Par ailleurs, on note eai,t ,t le nombre d’accès à la structure de données ai,t dans l’intervalle t. On note ot le nombre de conflits dans l’intervalle t . Finalement, on
définit dk,t le coût d’un conflit (k, t) = (ak1 ,t , ak2 ,t ) dans l’intervalle t pour tout k dans {1, . . . , ot }
et t dans {1, . . . , T }.
Toutes ces informations sont considérées comme des données fournies par le concepteur (ou plus
exactement par un outil de profiling du code de l’application). L’architecture est décrite par les
temps d’accès aux bancs mémoire p et v, le nombre des niveaux et des bancs mémoire, les capacités des bancs mémoire et les tailles des structures de données, si . Les nombres d’accès aux
structures de données, la liste des conflits et leur coût sont des informations qui caractérisent
l’application.
Les variables de décision du problème représentent l’affectation des structures de données aux
bancs mémoire dans les intervalles de temps. Ainsi, pour tout i ∈ {1, . . . , n}, j ∈ {1, . . . , m+1} et
t ∈ {1, . . . , T }, xi,j,t = 1 indique que la structure de données i est affectée au banc mémoire j dans
l’intervalle de temps t, xi,j,t = 0 si ce n’est pas le cas.
Trois types de variables d’état sont utilisées dans le problème :
– La variable yk,t indique le statut du conflit (k, t) dans l’intervalle de temps t. Ainsi, yk,t = 1 si
le conflit k dans l’intervalle t est fermé, sinon yk,t = 0.
– La variable booléenne wi,t prend la valeur 1 si et seulement si la structure de données i a été
María Soto, André Rossi & Marc Sevaux
4
déplacée dans un banc mémoire du premier niveau entre les intervalles de temps t −1 et t, pour
tout i dans {1, . . . , n} et pour tout t dans {1, . . . , T }.
0
– La variable booléenne wi,t
= 1 prend la valeur 1 si et seulement si la structure de données i a
été déplacée dans la mémoire externe ou si une structure de données i de la mémoire externe a
été déplacée vers un autre banc mémoire entre les intervalles de temps t − 1 et t.
Le coût d’une solution (c’est à dire d’une affectation des structures de données aux bancs mémoire) est égal au temps total d’accès et de déplacement des structures de données dans des bancs
mémoire appropriés pour exécuter les opérations nécessaires dans chaque intervalle de temps. Le
coût d’une solution s’exprime comme suit :
f(X) =
nt X
T hX
m
X
t=1
i=1 j=1
nt
ot
n
i
X
X
X
0
eai,t ,t ·xai,t ,j,t +p
si ·(wi,t +v·wi,t )−
eai,t ,t ·xai,t ,m+1,t +
yk,t ·dk,t .
i=1
i=1
k=1
(1)
Le premier terme de (1) indique le temps d’accès des structures de données dans des bancs mémoire, le deuxième terme est le coût d’accès des structures de données affectées à la mémoire
externe ; le troisième terme est le coût de déplacement des structures de données et le dernier
terme est la somme des coûts des conflits
fermés.
P
Pnt Pm+1
nt
Comme i=1 j=1 eai,t ,t · xai,t ,j,t = i=1
eai,t ,t est une valeur constante, il est équivalent
de minimiser :
f(X) =
nt
ot
T h
n
i
X
X
X
X
0
(p − 1)
si · (wi,t + v · wi,t
)−
eai,t ,t · xai,t ,m+1,t +
yk,t · dk,t .
t=1
i=1
i=1
(2)
k=1
Les contraintes suivantes doivent être satisfaites pour l’ensemble des conflits dans chaque intervalle de temps pour que la solution soit réalisable.
Premièrement, toute structure de données est affectée à un banc mémoire ou à la mémoire externe :
m+1
X
xi,j,t = 1,
∀i ∈ {1, . . . , n},
∀t ∈ {1, . . . , T }.
(3)
j=1
Deuxièmement, la somme des tailles des structures de données d’un banc mémoire ne doit pas
dépasser sa capacité.
n
X
xi,j,t · si ≤ cj ,
∀j ∈ {1, . . . , m},
∀t ∈ {1, . . . , T }.
(4)
i=1
Troisièmement, pour tout conflit (k, t) = (ak1 ,t , ak2 ,t ) de l’ensemble des conflits dans l’intervalle
t, la variable yk,t doit avoir la valeur numérique appropriée 0 ou 1. Cela est assuré à l’aide de la
contrainte ci-dessous :
xak1 ,t ,j,t + xak2 ,t ,j,t ≤ 2 − yk,t ,
∀j ∈ {1, . . . , m + 1}, ∀k ∈ {1, . . . , ot }, ∀t ∈ {1, . . . , T }.
(5)
0
Quatrièmement, les variables wi,t et wi,t
qui modélisent le déplacement des structures de données doivent avoir la valeur appropriée 0 ou 1. Cela est assuré à l’aide des contraintes ci-dessous :
xi,j,t−1 + xi,g,t
xi,m+1,t−1 + xi,j,t
xi,j,t−1 + xi,m+1,t
≤ 1 + wi,t , ∀i ∈ {1, . . . , n}, ∀j 6= g, j, g ∈ {1, . . . , m}, ∀t ∈ {1, . . . , T }, (6)
0
≤ 1 + wi,t
, ∀i ∈ {1, . . . , n}, ∀j ∈ {1, . . . , m}, ∀t ∈ {1, . . . , T },
0
≤ 1 + wi,t , ∀i ∈ {1, . . . , n}, ∀j ∈ {1, . . . , m}, ∀t ∈ {1, . . . , T }.
(7)
(8)
On rappelle qu’au début de l’application toutes les structures de données sont dans la mémoire
externe, comme le montrent les équations suivantes :
xi,j,0
=
0,
∀i ∈ {1, . . . , n},
xi,m+1,0
=
1,
∀i ∈ {1, . . . , n}.
∀j ∈ {1, . . . , m},
Allocation de mémoire dynamique
5
Cinquièmement, xi,j,t , yk,t et wi,t sont des variables binaires :
xi,j,t
∈ {0, 1},
∀i ∈ {1, . . . , n},
∀j ∈ {1, . . . , m},
wi,t
0
wi,t
∈ {0, 1},
∈ {0, 1},
∀i ∈ {1, . . . , n},
∀i ∈ {1, . . . , n},
∀t ∈ {1, . . . , T },
∀t ∈ {1, . . . , T },
yk,t
∈ {0, 1},
∀k ∈ {1, . . . , ot }, ∀t ∈ {1, . . . , T }.
∀t ∈ {1, . . . , T },
(9)
(10)
(11)
(12)
Finalement, les équations (2)-(12) constituent le programme linéaire en nombres entiers pour DyMemExplorer. Ce programme linéaire en nombres entiers peut être résolu pour les petites instances à l’aide d’un outil tel que GLPK [7] ou Xpress-MP [1].
Le programme linéaire pour Dy-MemExplorer permet d’obtenir des solutions optimales pour le
problème d’allocation mémoire dynamique. Il épargne aux spécialistes de faire manuellement
l’allocation mémoire à la main et garantit l’optimalité de la solution retournée.
La génération des instances pour le problème Dy-MemExplorer n’est pas facile, parce qu’il est
nécessaire de connaître à chaque intervalle de temps les variables et le nombre d’accès associé.
Le laboratoire Lab-STICC développe actuellement des outils pour la génération d’instances pour
le problème Dy-MemExplorer. Dans le paragraphe suivant nous présentons une instance réelle
générée manuellement.
2.2. Exemple
On présente une instance de Dy-MemExplorer créée à partir du code du filtre LMS bi-voies [8,
16], qui est un algorithme connu pour le traitement de signal. Cet algorithme est programmé en
langage C et sur une cible TI C6201. De la compilation du code de l’algorithme nous obtenons une
instance constituée de huit structures de données dont la taille est égale à 16384 bits, deux bancs
mémoire de capacité égale à 32768 bits (32 KO). Le facteur p est égal à seize et les facteurs v et l
sont égaux à un. La table suivante montre pour chaque intervalle : les structures de données dont
l’application a besoin, le coût d’accès aux structures de données, les conflits et leurs coûts.
Intervalles
t = 1, . . . , 7
Structures
{a1,t , . . . , ant ,t }
Conflits
(ak1 ,t , ak2 ,t )
Coûts
dk,t
Coût d’accès
eai,t ,t
1
{ 1,5 }
(1 ;5)
4095
e1,1 = e5,1 = 4095
2
{ 2,6}
(2 ;6)
4095
e2,2 = e6,2 = 4095
3
{ 3,5 }
(3 ;5)
4095
e3,3 = e5,3 = 4095
4
{ 4,6 }
(4 ;6)
4095
e4,4 = e6,4 = 4095
5
{ 1,5,7}
(1 ;7)
(1 ;5)
1
1
e1,5 = 2
e5,5 = e7,5 = 1
6
{ 2,6,8 }
(2 ;8)
(2 ;6)
1
1
e2,6 = 2
e6,6 = e8,6 = 1
7
{ 3,4 }
(3 ;3)
(4 ;4)
1
1
e3,7 = e4,7 = 2
TABLE 1 – Example : LMS bi-voies
Une solution optimale trouvée par Xpress-MP [1] est illustrée par la figure 2. L’application dans
l’intervalle t = 3 doit lire la donnée 3. La solution consiste alors à échanger l’affectation des
données 1 et 3 pour éviter de lire la donnée 3 dans la mémoire externe. De la même façon à
l’intervalle t = 4, les données 4 et 5 sont interchangées. Dans les derniers intervalles de temps
aucune structure de donnée ne change plus d’affectation. D’autre part, les données 7 et 8 sont
dans la mémoire externe pendant tout le temps d’execution de l’application, parce que leur coût
de déplacer est supérieur au coût d’accès. Ainsi elle minimise le temps d’accès aux structures
quand l’application exécute les opérations dans ces intervalles de temps.
María Soto, André Rossi & Marc Sevaux
6
F IGURE 2 – Solution optimale pour l’exemple proposé.
Le coût de cette solution est égal à 147537 millisecondes qui provient des coûts suivants.
Coût d’accès :
nt X
T
m
X
X
t=1
i=1 j=1
nt
X
eai,t ,t · xai,t ,j,t + p
eai,t ,t · xai,t ,m+1,t = 32847
Coût de changement d’allocation :
i=1
T
n
X
X
t=1
Coût des conflits fermés :
T
X
t=1
i=1
0
si · (wi,t + v · wi,t
) = 131072
ot
X
k=1
yk,t · dk,t = 16382
Une solution optimale pour Dy-MemExplorer peut être obtenue pour les petites instances à l’aide
des outils tels que GLPK ou Xpress-MP. Le développement technologique conduit à une conception
des circuit intégrés de plus en plus complexe ; ainsi, la taille des applications augmente de la même
façon. Mais comme le montrent les tests numériques des travaux précédents [14], une solution
optimale ne peut pas être obtenue en temps raisonnable pour des instances de taille moyennes.
Dans des travaux précédents nous cherchions une allocation invariante pendant le temps d’exécution de l’application. Nous avons obtenus de bons résultats par l’utilisation des métaheuristiques
comme la méthode Tabu ( [6]) et le VNS (Variable Neighborhood Search) ( [12]). Et pour une version
simplifiée de ce problème où les capacités des bancs mémoire sont « infinies » 1 , nous avons implémenté des métaheuristiques à base de population basées adaptés à la résolution de problèmes de
coloration de graphes ( [14]). En effet, le problème étudié est proche du k-weighted graph coloring
problem [15], et la variante consistant á déterminer le nombre minimum de bancs mémoire afin
qu’aucun conflit ne soit ouvert s’apparente au problème de coloration de graphes [5, 13].
3. Conclusion
Nous présentons dans cet article une version plus complexe du problème MemExplorer et un programme linéaire en nombres entiers pour le résoudre. Les avancées de la technologie conduisent
à la miniaturisation mais aussi à la complexification des circuits intégrés, ce qui rend leur conception de plus en plus difficile, notamment pour les systèmes embarqués pour lesquels la consommation électrique est une préoccupation majeure. Les méthodes exactes basées sur la programmation linéaire en nombres entiers montrent rapidement leurs limites pour les applications complexes. Les travaux menés sur la version statique du problème d’allocation de mémoire suggèrent
1. une capacité suffisante pour allouer toutes les données
Allocation de mémoire dynamique
7
le développement de métaheuristiques exploitant les caractéristiques qui ont fait le succès de ces
méthodes pour les problèmes s’apparentant à la coloration de graphes.
Bibliographie
1. Xpress-MP, FICO, 2009.
2. D. Atienza, S. Mamagkakis, F. Poletti, J. Mendias, F. Catthoor, L. Benini, et D. Soudris. Efficient
system-level prototyping of power-aware dynamic memory managers for embedded systems.
Integration, the VLSI Journal, 39(2) :113–130, 2006.
3. A. Chimientia, L. Fanucci, R. Locatellic, et S. Saponarac. VLSI architecture for a low-power
video codec system. Microelectronics Journal, 33(5) :417–427, 2002.
4. P. Coussy, E. Casseau, P. Bomel, A. Baganne, et E. Martin. A formal method for hardware
IP design and integration under I/O and timing constraints. ACM Transactions on Embedded
Computing System, 5(1) :29–53, 2006.
5. R. Diestel. Graph Theory, volume 173 sur Graduate Texts in Mathematics. Springer-Verlag Heidelberg, 2005.
6. F. Glover et M. Laguna. Tabu Search. Kluwer Academic Publisher, USA, 1997.
7. GNU. GLPK linear programming kit, 2009.
8. S. F. Jebara H. Besbes. A solution to reduce noise enhancement in pre-whitened lms-type algorithms : the double direction adaptation. In Proc. Control, Communications and Signal Processing,
2004. First International Symposium on, pages 717 – 720, 2004.
9. M. Iverson, F. Ozguner, et L. Potter. Statistical prediction of task execution times through
analytic benchmarking for scheduling in a heterogeneous environment. IEEE Transactions on
Computers, 48(12) :1374–1379, 1999.
10. N. Julien, J. Laurent, E. Senn, et E. Martin. Power consumption modeling and characterization
of the TI C6201. IEEE Micro, 23(5) :40–49, 2003.
11. W. Lee et M. Chang. A study of dynamic memory management in C++ programs. Computer
Languages Systems and Structures, 28(3) :237–272, 2002.
12. N. Mladenović et P. Hansen. Variable neighbourhood decomposition search. Computers and
Operations Research, 24(11) :1097–1100, 1997.
13. M. Soto, A. Rossi, et M. Sevaux. Two upper bounds on the chromatic number. In Proc. CTW09
8th Cologne-Twente Workshop on Graphs and Combinatorial Optimization, pages 191–194, Paris,
France, 2009.
14. M. Soto, A. Rossi, et M. Sevaux. Métaheuristiques pour l’allocation de mémoire dans les systèmes embarqués. In Proc. ROADEF 11e congrès de la société Française de Recherche Opérationelle
est d’Aide à la Décision, pages 35–43, Toulouse, France, 2010.
15. T. Vredeveld et J.K Lenstra. On local search for the generalized graph coloring problem. Operations Research Letters, 31(1) :28–34, 2003.
16. B. Widrow. Pattern recognition and adaptive control. Applications and Industry, IEEE Transactions on, 83(74) :269 – 277, 1964.
17. S. Wuytack, F. Catthoor, L. Nachtergaele, et H. De Man. Power exploration for data dominated
video application. In Proc. IEEE International Symposium on Low Power Electronics and Design,
pages 359–364, Monterey, CA , USA, 1996.
Téléchargement