9.1 Introduction : l’énergie, contrainte architecturale fondamentale
Les chapitres précédents ont traité la mémoire, le déterminisme et le rendu comme les piliers d’un moteur FullDive. Mais il existe une contrainte physique qui les transcende toutes : l’énergie. Un casque VR autonome fonctionne sur batterie : chaque microseconde de calcul inutile réduit l’autonomie et augmente la chaleur dissipée contre le visage de l’utilisateur. Un serveur de build consomme des mégawatts : chaque instruction gaspillée se traduit en coût financier et en empreinte carbone.
La gestion énergétique n’est pas un sujet annexe : elle dicte le dimensionnement du matériel, la conception de la boucle de simulation, et même le choix des instructions assembleur dans l’idle loop du noyau. Ce chapitre explore la science de la consommation électrique depuis les lois physiques des semi-conducteurs jusqu’aux algorithmes d’ordonnancement du noyau, en passant par l’application la plus extrême jamais réalisée : l’hibernation de la sonde spatiale Rosetta pendant 31 mois à 800 millions de kilomètres du Soleil.
9.2 Physique de la dissipation de puissance CMOS
9.2.1 Puissance dynamique
La quasi-totalité des processeurs modernes repose sur la technologie CMOS (Complementary Metal-Oxide-Semiconductor). La consommation totale d’un circuit CMOS est la somme de deux composantes : la puissance dynamique (transitions logiques) et la puissance statique (courants de fuite).1
La puissance dynamique de commutation est modélisée par l’équation fondamentale :
Où :
- : facteur d’activité de commutation (probabilité de transition par cycle)
- : capacité de charge dynamique totale
- : tension d’alimentation
- : fréquence d’horloge
La puissance de court-circuit (short-circuit power), quant à elle, se manifeste de manière extrêmement brève lors de la transition d’un signal : pendant le laps de temps où la tension d’entrée bascule, les transistors PMOS et NMOS se retrouvent simultanément passants et créent un chemin direct temporaire entre l’alimentation et la masse. Bien que cette composante compte généralement pour moins de 10 % de la puissance dynamique totale, elle augmente significativement si les fronts de transition se dégradent.1
9.2.2 Puissance statique et courants de fuite
La puissance statique correspond à l’énergie dissipée même lorsque le circuit est inactif :
Où est le courant de fuite total. Avec la miniaturisation (7 nm, 5 nm), la tension de seuil des transistors a dû être abaissée, ce qui provoque une augmentation exponentielle des courants de fuite sous-le-seuil (subthreshold leakage). L’amincissement de l’oxyde de grille engendre aussi un courant de fuite par effet tunnel quantique (gate leakage). Enfin, des diodes parasites formées par la diffusion entre la source/drain et le substrat génèrent des courants de fuite par polarisation inverse.2
Dans les architectures nanométriques modernes, la puissance statique peut peser 30 à 70 % de la consommation totale si aucune mesure de confinement matériel n’est appliquée.2
9.2.3 Le produit énergie-délai (EDP)
L’optimisation énergétique ne consiste pas à minimiser la puissance brute : ralentir excessivement le calcul peut être contre-productif si les courants de fuite statiques consomment plus pendant le temps additionnel. La bonne métrique, c’est le Produit Énergie-Délai (Energy-Delay Product) :
Minimiser l’EDP garantit l’équilibre optimal entre efficacité énergétique et réactivité. Le point de tension optimal se situe généralement autour de 1 V pour les dispositifs submicroniques avec des seuils de ~0.5 V.3
9.2.4 Impact des algorithmes d’ordonnancement
Le choix de l’algorithme d’ordonnancement (scheduler) dicte le profil énergétique. Un algorithme FCFS (First-Come, First-Served) peut induire un « effet de convoi », où des tâches rapides restent bloquées derrière de longues tâches complexes, ce qui empêche le processeur de retourner en sommeil profond. À l’inverse, une approche SJF (Shortest Job First) permet de purger la file d’attente rapidement pour entrer en hibernation, même si elle peut provoquer la privation (starvation) des tâches lourdes. Les planificateurs modernes privilégient la consolidation de charge pour regrouper l’exécution et prolonger les phases d’inactivité continue.3
9.3 Mécanismes matériels de confinement
9.3.1 Clock Gating
Le Clock Gating est la technique la plus répandue pour réduire la puissance dynamique. En bloquant le signal d’horloge d’un composant inactif (cache, bus, périphérique), on annule simultanément le facteur de fréquence et d’activité .4
L’implémentation naïve (porte AND entre horloge et signal Enable) risque de générer des glitches si le signal d’activation bascule pendant que l’horloge est haute. Les bibliothèques CMOS fournissent des cellules ICG (Integrated Clock Gating) : un latch y échantillonne le signal Enable uniquement sur le front bas de l’horloge. Pour évaluer la qualité de la mise en œuvre, on mesure l’efficacité de la coupure d’horloge via la métrique de CGE (Clock Gate Efficiency).4
9.3.2 Power Gating
Le Power Gating cible directement la puissance statique en coupant physiquement l’alimentation d’un bloc matériel entier via des sleep transistors. C’est redoutablement efficace contre les courants de fuite, mais avec un inconvénient majeur : la perte irrévocable de l’état logique du bloc éteint.5
Le noyau doit orchestrer une séquence stricte avant l’extinction :
- Sauvegarder les données critiques (registres de rétention à tension minimale)
- Activer les cellules d’isolation aux frontières pour empêcher la propagation de signaux flottants
- Couper l’alimentation
- Au réveil : restaurer l’état, désactiver l’isolation, re-valider les données
9.3.3 DVFS : Dynamic Voltage and Frequency Scaling
Le DVFS ajuste dynamiquement la tension et la fréquence du processeur selon la charge de travail. La réduction de tension donne une baisse quadratique de la consommation, mais allonge le délai de propagation des portes, ce qui force à réduire la fréquence pour éviter les erreurs de calcul.6
L’implémentation requiert une communication avec le PMIC (Power Management IC) via le bus I2C. Ce bus nécessite des résistances de tirage (pull-up) judicieusement dimensionnées, typiquement 2,2 k pour le mode rapide (1 Mbit/s) ou 0,5 k pour le mode ultra-rapide (3,4 Mbit/s). Le code du noyau envoie des commandes de type read-modify-write pour ajuster les registres de régulation de tension. Dans les architectures multiprocesseurs modernes, la gestion de domaines de tension distincts s’appuie sur le modèle GALS (Globally Asynchronous Locally Synchronous). Par exemple, sur les microcontrôleurs STM32, la fonction HAL_PWREx_ControlVoltageScaling() encapsule ces appels matériels :
// Séquence DVFS simplifiée (pseudo-code noyau)
void dvfs_set_frequency(uint32_t target_freq) {
uint32_t target_voltage = freq_to_voltage_table[target_freq];
if (target_freq > current_freq) {
// Augmentation : d'abord la tension, PUIS la fréquence
pmic_i2c_write(VOLTAGE_REG, target_voltage);
wait_voltage_stable(); // CRITIQUE : attendre stabilisation PLL
set_cpu_frequency(target_freq);
} else {
// Diminution : d'abord la fréquence, PUIS la tension
set_cpu_frequency(target_freq);
pmic_i2c_write(VOLTAGE_REG, target_voltage);
}
}
L’ordre est critique : augmenter la fréquence avant que la tension ne soit stable provoque un effondrement du système.6
9.4 L’interface ACPI : standardisation des états d’énergie
L’ACPI (Advanced Configuration and Power Interface), introduit en 1996, transfère la politique de gestion énergétique du BIOS au noyau OS via l’OSPM (OS-directed Power Management). Il catégorise la gestion en plusieurs strates :7
9.4.1 S-States (système global)
| État | Nom | Description | Rétention d’État |
|---|---|---|---|
| S0 | Working | Système pleinement opérationnel | Totale |
| S1 | Standby | CPU suspendu, mémoire et caches maintenus | Totale |
| S3 | Suspend-to-RAM | CPU éteint, seule la DRAM est rafraîchie | RAM uniquement |
| S4 | Hibernate | RAM copiée sur disque, système éteint | Disque |
| S5/G3 | Off | Arrêt complet | Aucune |
9.4.2 C-States (processeur)
Les C-States définissent les niveaux d’inactivité du processeur dans l’état S0 :
| C-State | Mode | Caractéristiques |
|---|---|---|
| C0 | Active | Exécution d’instructions. Seul état où les P-States s’appliquent |
| C1 | Halt | Horloge arrêtée, registres maintenus. Réveil quasi instantané |
| C2 | Stop-Clock | Horloge matérielle arrêtée. Latence de réveil plus longue |
| C3 | Sleep | Cohérence des caches abandonnée. Purge nécessaire au réveil |
| C4+ | Deep Sleep | Power Gating complet. Gains massifs sur les courants de fuite |
9.4.3 P-States et D-States
Les P-States (Performance States) implémentent le DVFS dans C0 : P0 = fréquence/tension max, Pn = couples progressivement réduits. Les D-States (D0 à D3) contrôlent individuellement l’alimentation des périphériques.7
Contrôle Fin du DVFS sous x86
La modification du P-State sur les processeurs Intel s’effectue traditionnellement en écrivant dans le registre MSR
IA32_PERF_CTL. Cependant, confier la décision au système d’exploitation nécessite de connaître la charge réelle du CPU. Les processeurs modernes intègrent donc deux compteurs MSR matériels :IA32_APERF(Active Performance) qui compte les cycles uniquement pendant que le CPU tourne, etIA32_MPERF(Maximum Performance) qui compte les cycles à la fréquence nominale absolue. Le ratioAPERF / MPERFdonne au gouverneur de fréquence (comme le driverintel_pstatede Linux ou l’EDF scheduler de LplKernel) une mesure d’activité parfaite pour calculer dynamiquement la tension minimale requise, sans tuer les garanties temporelles.
9.5 Implémentation assembleur : les instructions d’arrêt
9.5.1 x86 : HLT et MWAIT
L’instruction HLT (Halt, opcode 0xF4) suspend l’exécution du processeur jusqu’à une interruption matérielle et place le CPU en C1. Présente depuis le 8086, elle n’a servi à l’économie d’énergie qu’à partir du DX4 (1994).8
Sa limite : dans un système multiprocesseur, réveiller un cœur en HLT nécessite un routage complexe de l’APIC et une IPI (Inter-Processor Interrupt) coûteuse en latence. Pour un moteur temps réel réagissant aux événements BCI et réseau sous la milliseconde, cette latence de réveil est inacceptable.
Implémentation LplKernel : réveil instantané
LplKernel n’utilise pas
HLTdans son idle loop. À la place, il exploite la paire d’instructions matériellesMONITOR/MWAIT. Le cœur inactif arme leMONITORsur l’adresse de la structure Ring Buffer de la carte réseau ou du capteur BCI, puis appelleMWAITpour entrer dans un C-State profond (C3/C6) et couper son alimentation. Dès que le périphérique DMA écrit le paquet en mémoire physique, la modification de la ligne de cache réveille instantanément le CPU, évitant tout le cheminement tortueux d’une interruption IRQ traditionnelle.
; x86 : mise en veille avec surveillance d'adresse mémoire
; Le noyau arme la surveillance sur l'adresse de la runqueue
MONITOR [runqueue_addr], ecx, edx ; Armer la surveillance
; Hints dans EAX : bits [3:0] = C-State cible (ex: 0x10 pour C3)
mov eax, 0x10 ; C-State hint
mov ecx, 0x01 ; Activer les extensions (TPAUSE-aware)
MWAIT ; Entrer en sommeil
; Le CPU se réveille SANS IPI quand un autre cœur écrit à [runqueue_addr]
Le pilote Linux intel_idle exploite cette mécanique pour purger les caches L1/L2 au moment optimal avant d’exécuter MWAIT, contournant la latence de l’implémentation ACPI générique.8
9.5.2 ARM : WFI et WFE
Les architectures ARM (des Cortex-M embarqués aux Cortex-A des smartphones) adoptent une approche RISC et utilisent deux instructions spécialisées :
| Instruction | Mécanisme de Réveil | Usage Typique |
|---|---|---|
| WFI (Wait For Interrupt) | Interruption matérielle (NVIC/GIC) | Boucle d’attente (idle loop) du noyau |
| WFE (Wait For Event) | Événement interne, instruction SEV d’un autre cœur, signal EVENTI | Spinlocks écoénergétiques en SMP |
L’instruction WFE est particulièrement stratégique pour les spinlocks : au lieu de boucler en gaspillant de la puissance dynamique, un cœur en échec d’acquisition de verrou exécute WFE et s’endort. Le cœur libérateur exécute SEV (Send Event). L’exécution de SEV génère une impulsion sur le signal EVENTO qui modifie le registre d’événement du cœur en attente et le réveille immédiatement, sans recourir à un contrôleur d’interruptions complexe (GIC).9
Le pattern de mise en veille sûr pour WFI requiert une attention aux race conditions :
// Pattern ARM sûr pour WFI (évite le missed-interrupt bug)
void enter_idle(void) {
__disable_irq(); // Masquer les interruptions (PRIMASK)
if (no_work_pending()) { // Revérifier les flags logiciels
__WFI(); // Le CPU se réveille même si PRIMASK est set
}
__enable_irq(); // Les interruptions en attente sont servies ici
}
Le registre SCB_SCR du Cortex-M permet d’approfondir le sommeil. Le bit SLEEPDEEP désactive les oscillateurs principaux (PLL) et place les régulateurs en mode basse puissance, ce qui fait passer du simple Sleep au Deep Sleep (consommation de quelques µA). Le bit SLEEPONEXIT fait se rendormir automatiquement le CPU après chaque ISR, ce qui élimine le coût de restauration de contexte.9
9.6 Le noyau sans tic (Tickless Kernel)
9.6.1 Le problème du tic périodique
Dans l’architecture classique, le noyau maintient un timer périodique (100-1000 Hz) qui génère une interruption à chaque tic pour mettre à jour l’horloge interne et réévaluer l’ordonnancement. Ce mécanisme est un désastre énergétique : même si la file de processus est vide, l’interruption force le CPU à quitter son état C3/Deep Sleep toutes les millisecondes.10
9.6.2 Suppression du tic
Le Tickless Kernel (Linux CONFIG_NO_HZ_IDLE, FreeRTOS configUSE_TICKLESS_IDLE) résout ce problème :
- Quand aucune tâche n’est exécutable, évaluer le délai exact avant le prochain timeout
- Désactiver le timer périodique
- Programmer une alarme asynchrone (HPET, timer basse puissance) à la durée exacte
- Exécuter WFI/MWAIT, le CPU dort ininterrompu
- Au réveil, une fonction du noyau (comme
vTaskStepTick()dans FreeRTOS) interroge l’horloge matérielle absolue pour calculer le temps d’inactivité écoulé et l’ajoute artificiellement au compteur de ticks global.
Le CPU peut ainsi rester en veille plusieurs secondes, voire des heures, au lieu d’être réveillé 1000 fois par seconde. L’illusion est parfaite pour les couches applicatives : le temps système semble continu.10
9.6.3 Gouverneurs CPUIdle sous Linux
La décision d’entrer dans tel ou tel C-State incombe au sous-système CPUIdle, via des algorithmes appelés gouverneurs :
| Gouverneur | Stratégie | Avantage | Limite |
|---|---|---|---|
| Ladder | Descente progressive C1→C2→C3 par paliers | Latence de réveil maîtrisée | N’exploite pas les longs silences |
| Menu | Saut direct au C-State le plus profond possible | Maximise les économies en mode Tickless | Prédiction heuristique (peut se tromper) |
Le gouverneur Menu (défaut en mode NO_HZ) évalue deux critères : le break-even point énergétique (le C-State est-il rentable vu le coût de réveil ?) et la tolérance à la latence (pm_qos). Il utilise l’historique des interruptions réseau/stockage pour estimer si un réveil prématuré risque de survenir.11
9.7 L’ultime frontière : l’hibernation de Rosetta
9.7.1 Contraintes aux confins du système solaire
La sonde Rosetta de l’ESA, lancée en 2004 vers la comète 67P/Tchourioumov-Guérassimenko, était propulsée exclusivement par panneaux solaires, pas de RTG (générateur radio-isotopique). En 2011, sa trajectoire l’a éloignée à 800 millions de km du Soleil (5.25 UA, au-delà de Jupiter). La loi du carré inverse rendait la puissance solaire insuffisante pour maintenir les systèmes en fonctionnement.12
9.7.2 Le protocole d’hibernation profonde
Le 8 juin 2011, l’ESA a exécuté un Power Gating à l’échelle d’un vaisseau spatial :
- Spin-Up : les propulseurs placent la sonde en rotation à ~1 tour/minute (4 degrés par seconde), les immenses panneaux solaires orientés vers le Soleil. L’effet gyroscopique maintient passivement l’orientation de l’AOCS (Attitude and Orbit Control Subsystem) pendant 31 mois.
- Extinction séquentielle : périphériques non-critiques privés d’électricité (capteurs d’attitude, roues de réaction, émetteur radio haute puissance HGA, 21 instruments scientifiques, atterrisseur Philae). Tout est coupé.
- Survie minimale : seuls restent actifs l’ordinateur de bord CDMS (Command and Data Management Subsystem), le réseau de radiateurs thermiques (prévention du gel de l’hydrazine) et l’horloge temps réel (RTC).
La RTC (souvent des familles industrielles comme le composant DP8573A de Texas Instruments), cadencée par un oscillateur à quartz (XTAL) de très haute fiabilité compensé thermiquement (USO) à 32,768 kHz, égrène inlassablement les secondes en tirant quelques microampères des réserves du CDMS, l’équivalent cosmique d’une boucle while(rtc < alarm) WFI();. Ce comptage se poursuit jusqu’à l’atteinte d’une condition de correspondance matérielle d’alarme (Alarm Compare Match).13
À 10:00 GMT, le compteur RTC atteint la condition d’alarme (Alarm Compare Match). L’interruption matérielle la plus importante de l’histoire du vol spatial européen réveille le CDMS :
| Étape | Durée | Opération |
|---|---|---|
| T0 → T0+6h | 6 heures | Montée en température progressive des capteurs de navigation (Star Trackers) |
| Spin-Down | ~1h | Neutralisation de la rotation cométaire par poussées d’hydrazine |
| Acquisition attitude | ~30 min | Reconnaissance du champ stellaire par viseurs d’étoiles (matrices CCD) |
| Earth-Pointing | ~30 min | Alignement de l’antenne HGA vers le point bleu pâle de la Terre |
| Premier signal | +45 min | Télémétrie reçue à l’ESOC (Darmstadt) à la vitesse de la lumière (807 millions km) |
La lenteur méthodique de ce réveil est calculée : allumer une optique spatiale sous la température du vide profond provoquerait des chocs thermiques fatals. La séquence ordonnée par le module de sécurité FDIR (Failure Detection Isolation and Recovery) active les sous-systèmes séquentiellement pour éviter un current inrush (appel de courant) qui effondrerait la faible tension d’alimentation.12
9.7.3 Philae et le micro-budget cométaire
L’atterrisseur Philae (100 kg) illustre le dimensionnement extrême : batteries primaires pour les 60 premières heures critiques, puis batteries secondaires rechargées par de minuscules panneaux solaires avec seulement ~1.5 h de Soleil par jour cométaire de 12.4 h. Le duty cycle de chaque instrument scientifique est calibré au millijoule près, une application directe de l’EDP au niveau mission.14
9.8 Implications pour LplKernel
La gestion énergétique impacte directement l’architecture du moteur :
| Composant | Stratégie Énergétique | Justification |
|---|---|---|
| Casque VR (Client) | Tickless kernel + DVFS agressif | Autonomie batterie, réduction chaleur faciale |
| Thread BCI | WFI entre échantillons EEG | Le Cortex-M du casque dort 95 % du temps entre 250 Hz |
| Serveur Build | C-States profonds en inter-tick | Les ticks à 60 Hz laissent 16 ms de sommeil possible |
| Idle Loop moteur | MWAIT surveillant la runqueue | Réveil sans IPI quand un paquet réseau arrive |
| Ordonnanceur | Consolidation de charge → cœurs deep sleep | Regrouper les tâches pour éteindre des cœurs entiers |
La règle d’or est la même que pour Rosetta : faire le travail le plus vite possible, entrer dans l’état de sommeil le plus profond, et y rester le plus longtemps possible.
Notes de bas de page du chapitre 9
Footnotes
-
Cadence PCB Design, « CMOS Power Consumption », Modélisation . Texas Instruments, « CMOS Power Consumption and CPD Calculation » (SCAA035). ↩ ↩2
-
Northwestern University ECE, « Leakage current: Moore’s law meets static power ». Fernuni Hagen, « Trends in Static Power Consumption », 30-70 % de la consommation totale en nœuds nanométriques. ↩ ↩2
-
arXiv:2601.08539, « Reducing Compute Waste in LLMs through Kernel-Level DVFS ». Emergent Mind, « Energy-Delay Product Reduction ». ↩ ↩2
-
AnySilicon, « The Ultimate Guide to Clock Gating », Architecture des cellules ICG (Integrated Clock Gating). ↩ ↩2
-
AnySilicon, « The Ultimate Guide to Power Gating », Sleep transistors, isolation cells, retention registers. ↩
-
MSOE Faculty, « Dynamic Voltage and Frequency Scaling », Relation DVFS/délai de propagation. STMicroelectronics,
HAL_PWREx_ControlVoltageScaling(). ↩ ↩2 -
ACPI Specification 6.5 (UEFI Forum). Wikipedia, « ACPI ». Metebalci.com, « CPU Power Management, C-states and P-states ». ↩ ↩2
-
Wikipedia, « HLT (x86 instruction) ». Stack Overflow, « MWAIT vs HALT ». Felix Cloutier, « MWAIT instruction reference ». Linux kernel
drivers/idle/intel_idle.c. ↩ ↩2 -
ARM Developer Documentation, « Wait for Interrupt and Wait for Event » (Cortex-X4). ARM Documentation ka001283, « Purpose of WFI and WFE ». Reddit r/embedded, « ARM Cortex-M: correct usage of WFI/WFE ». ↩ ↩2
-
Red Hat, « Tickless Kernel » (Performance Tuning Guide). Medium, « Tickless Mode in FreeRTOS Explained ». Linux kernel documentation,
NO_HZ. ↩ ↩2 -
Linux kernel
drivers/cpuidle/governors/menu.c. LWN.net, « Improving idle behavior in tickless systems ». Stack Overflow, « Ladder vs Menu governors ». ↩ -
ESA, « Rosetta comet probe enters hibernation in deep space ». ESA, « The most important alarm clock in the Solar System ». Wikipedia, « Rosetta (spacecraft) ». ↩ ↩2
-
NASA NTRS, « Stability of a Crystal Oscillator, Type Si530 ». TI DP8573A RTC Datasheet. Space Exploration Stack Exchange, « How does Rosetta wake-up? ». ↩
-
AIAA SpaceOps 2014, « Rosetta Lander: On-Comet Operations Preparation and Planning ». SGF Budapest, « Rosetta CDMS ». ↩