Abstract : Traditional memories such as SRAM, DRAM and Flash have faced during the last years,
critical challenges related to what modern computing systems required: high performance,
high storage density and low power. As the number of CMOS transistors is increasing, the
leakage power consumption becomes a critical issue for energy-efficient systems. SRAM
and DRAM consume too much energy and have low density and Flash memories have a
limited write endurance. Therefore, these technologies can no longer ensure the needs in both
embedded and high-performance computing domains. The future memory systems must
respect the energy and performance requirements. Since Non Volatile Memories (NVMs)
appeared, many studies have shown prominent features where such technologies can be a
potential replacement of the conventional memories used on-chip and off-chip. NVMs have
important qualities in storage density, scalability, leakage power, access performance and
write endurance. Many research works have proposed designs based on NVMs, whether on
main memory or on cache memories. Nevertheless, there are still some critical drawbacks
of these new technologies. The main drawback is the cost of write operations in terms of
latency and energy consumption. Ideally, we want to replace traditional technologies with
NVMs to benefit from storage density and very low leakage but eventually without the write
operations overhead.
The scope of this work is to exploit the advantages of NVMs employed mainly on cache
memories by mitigating the cost of write operations. Obviously, reducing the number of write
operations in a program will help in reducing the energy consumption of that program. Many
approaches about reducing writes operations exist at circuit level, architectural level and
software level. We propose a compiler-level optimization that reduces the number of write
operations by eliminating the execution of redundant stores, called silent stores. A store is
silent if it’s writing in a memory address the same value that is already stored at this address.
The LLVM-based optimization eliminates the identified silent stores in a program by not
executing them.
Furthermore, the cost of a write operation is highly dependent on the used NVM and
its non-volatility called retention time; when the retention time is high then the latency and
the energetic cost of a write operation are considerably high and vice versa. Based on this
characteristic, we propose an approach applicable in a multi-bank NVM where each bank is
designed with a specific retention time. We analyze a program and we compute the worst-case
lifetime of a store instruction. The worst-case lifetime will help to allocate data to the most
appropriate NVM bank.
Résumé : La consommation énergétique est devenue un défi majeur dans les domaines de l’informatique embarquée et haute performance. Différentes approches ont été étudiées pour résoudre ce problème, entre autres, la gestion du système pendant son exécution, les systèmes multicœurs hétérogènes et la gestion de la consommation au niveau des périphériques.
Cette étude cible les technologies de mémoire par le biais de mémoires non volatiles (NVMs) émergentes, qui présentent intrinsèquement une consommation statique quasi nulle. Cela permet de réduire la consommation énergétique statique, qui tend à devenir dominante dans les systèmes modernes. L’utilisation des NVMs dans la hiérarchie de la mémoire se fait cependant au prix d’opérations d’écriture coûteuses en termes de latence et d’énergie.
Dans un premier temps, nous proposons une approche de compilation pour atténuer l’impact des opérations d’écriture lors de l’intégration de STT-RAM dans la mémoire cache. Une optimisation qui vise à réduire le nombre d’opérations d’écritures est implémentée en utilisant LLVM afin de réduire ce qu’on appelle les silent stores, c’est-à-dire les instances d’instructions d’écriture qui écrivent dans un emplacement mémoire une valeur qui s’y trouve déjà. Cela rend notre optimisation portable sur toute architecture supportant LLVM. La validation expérimentale montre des résultats prometteurs selon le niveau de silentness des instructions d’écritures dans les benchmarks étudiés. Certaines considérations de conception sont analysées au niveau de la compilation et de la microarchitecture afin de tirer le meilleur parti de l’optimisation.
Le principe de l’implémentation est inspiré par le travail initial de Lepak et al. [54] sur l’élimination des silent stores à travers des mécanismes matériels, pour améliorer le speedup sur une architecture monoprocesseur et réduire le trafic sur le bus de données sur une architecture multiprocesseur. Nous considérons une variante de compilation de cette optimisation. Notre approche consiste à transformer un code suivantes:
1. une instruction de lecture à l’adresse de l’écriture,
2. une instruction de comparaison, pour comparer la valeur écrite à la valeur déjà
écrite,
3. une branche conditionnelle pour ignorer l’opération d’écriture si nécessaire.
Nous avons implémenté la transformation ci-dessus dans LLVM en utilisant la
représentation intermédiaire du code. L’approche est accomplie en deux étapes : un
profiling des silent stores basé sur les accès mémoire observés, suivi par l’application
de l’optimisation uniquement sur les silent stores qui sont silent à une certaine probabilité
donnée et qui exprime combien de fois une opération d’écriture est silent. Une
opération d’écriture qui est silent et qui est souvent exécutée aura un haut niveau de
silentness et sera donc bénéfique pour une telle optimisation.
Dans un second temps, nous proposons une approche qui s’appuie sur l’analyse
des programmes pour estimer des pire temps d’exécution partiaux, dénommés δ-WCET.
À partir de l’analyse des programmes, δ-WCETs sont déterminés et utilisés pour
allouer en toute sécurité des données aux bancs de mémoire NVM avec des temps
de rétention des données variables. L’analyse δ-WCET calcule le WCET entre deux
endroits quelconques dans un programme, comme entre deux blocs de base ou deux
instructions. Ensuite, les pires durées de vie des variables peuvent être déterminées
et utilisées pour décider l’affectation des variables aux bancs de mémoire les plus
appropriées. Notre approche est validée dans la suite de benchmarks de Mälardalen
et des réductions significatives d’énergie dynamique de la mémoire (jusqu’à 80% et
66% en moyenne) sont observées en fonction des caractéristiques des programmes.
L’implémentation de cette partie a été faite sur Heptane, qui est un outil d’estimation
statique de WCET. À partir d’un CFG, Heptane génère un problème ILP suite à une
série d’analyses. Ce problème ILP est ensuite résolu en utilisant un solveur comme
Cplex ou lp_solve. Le concept de notre approche se base sur l’utilisation du def-use
(reaching definitions) qui permet d’identifier pour une opération d’écriture, toutes
les opérations de lecture qui lui correspondent. Cela permet de construire un sous-graphe
du CFG initial du programme. Ce sous-graphe représentera par la suite le
graphe que Heptane va traiter et un nouveau problème ILP est généré pour le calcul
du δ-WCET.