Simple Science

La science de pointe expliquée simplement

# Informatique# Langages de programmation# Ordinateurs et société

Améliorer les performances de MicroPython sur les systèmes CHERI

Des ajustements à MicroPython améliorent les performances sur les plateformes CHERI.

― 6 min lire


Optimisation deOptimisation deMicroPython sur CHERIajustements de gestion de la mémoire.Gains de performance grâce à des
Table des matières

MicroPython est une version allégée du langage de programmation Python. Il est conçu pour fonctionner sur des microcontrôleurs, qui sont de tout petits ordinateurs utilisés dans plein de dispositifs. MicroPython exécute un type de code appelé bytecode, qui est une version simplifiée du code que l'ordinateur peut comprendre.

CHERI signifie Capability Hardware Enhanced RISC Instructions. C'est une nouvelle manière de gérer la mémoire de manière sécurisée dans les systèmes informatiques. L'idée derrière CHERI est d'ajouter un support spécial pour les pointeurs, qui sont utilisés pour accéder à différentes zones de mémoire. Ça aide à éviter les erreurs quand un programme essaie d'utiliser la mémoire de manière incorrecte.

Déplacer MicroPython vers CHERI

Quand on a essayé d'adapter MicroPython pour fonctionner sur un système CHERI appelé la plateforme Morello, on a rencontré plein de défis, surtout au niveau performance. Au départ, les performances de MicroPython sur CHERI étaient bien plus mauvaises que prévu : cinq fois plus lentes que sur un système normal.

Le problème principal qu'on a constaté, c'est que le système de mémoire dans CHERI fonctionne différemment que dans les systèmes traditionnels. Les pointeurs utilisés dans CHERI sont plus grands que dans les systèmes habituels, ce qui entraîne des problèmes de performance. Des pointeurs plus grands signifient que l'ordinateur doit faire plus de boulot pour gérer la mémoire.

Trouver les problèmes de performance

Pour améliorer la performance, on a dû identifier d'où venaient les problèmes. On a regardé comment MicroPython gérait la mémoire et on a découvert qu'il faisait beaucoup de choses de manière inefficace. Une source principale de lenteur était une fonction responsable de l'allocation de la mémoire, appelée gc_alloc(). Cette fonction détermine où stocker les données en mémoire.

Quand on a testé les benchmarks, on a vu que certaines opérations prenaient beaucoup plus de temps sur CHERI que sur un système traditionnel. Par exemple, deux benchmarks, fannkuch et nqueens, étaient plus de 100 fois plus lents sur le système CHERI.

On a utilisé un outil appelé pmcstat pour analyser ça et on a découvert que gc_alloc() était appelée beaucoup plus souvent que nécessaire. Ça indiquait que l'allocation de mémoire causait des retards.

Améliorer l'allocation de mémoire

Pour régler le problème d'allocation de mémoire, on a d'abord regardé comment MicroPython était structuré. La manière dont MicroPython divisait sa mémoire en blocs était basée sur la taille des entiers. Pour la version CHERI, on a dû ajuster cette configuration parce que les pointeurs étaient plus grands.

En changeant la taille des blocs de mémoire pour tenir compte des pointeurs plus grands, on a pu régler certains des problèmes de performance. Après ce changement, le ralentissement a été réduit à environ 1,8 fois par rapport au système traditionnel.

Analyser les frames de pile

Après avoir traité la taille des blocs, on a trouvé qu'un autre domaine affectant la performance était la taille des frames de pile. Une frame de pile contient toutes les informations nécessaires pour exécuter une fonction, y compris les variables locales et les paramètres.

Dans MicroPython, si la frame de pile devient trop grande, elle passe au tas, la zone de mémoire utilisée pour l'allocation dynamique. Sur CHERI, les frames de pile étaient souvent beaucoup plus grandes que sur un système traditionnel à cause des pointeurs plus grands. Ça a causé des déplacements plus fréquents vers le tas, entraînant des pertes de performance.

On a modifié une constante dans MicroPython pour prendre en compte la nouvelle taille des pointeurs, ce qui a aidé à réduire le nombre de fois que le programme devait passer au tas pour la mémoire. Ce changement a beaucoup amélioré le temps d'exécution sur les benchmarks.

Inefficacités du Compilateur

Même après avoir réglé la gestion de la mémoire, on a remarqué que la performance sur l'un de nos benchmarks, pystone, était encore en retrait. On a découvert que le compilateur utilisé pour convertir le code MicroPython en instructions pour le processeur générait des instructions supplémentaires qui n'étaient pas nécessaires.

En programmation, la manière dont un compilateur traduit le code en instructions machine peut grandement impacter la performance. Dans notre cas, le compilateur créait plus d'étapes que nécessaire pour diverses opérations, notamment avec la gestion des pointeurs.

On a mis à jour manuellement une partie du code compilé pour réduire le nombre d'instructions inutiles. Cet ajustement manuel a encore amélioré la performance sur le benchmark pystone.

Mesurer les gains de performance

Après avoir fait nos changements, on a continué à mesurer la performance de MicroPython sur le système CHERI. On a remarqué que la plupart des benchmarks montraient une amélioration impressionnante, avec les temps d'exécution qui passaient de 48% à presque 99%, selon le test spécifique.

Le benchmark qui a montré la plus petite amélioration avait quand même un ralentissement de 137%, tandis que d'autres avaient des surcoûts entre 6,7% et 39%. Même avec ces améliorations, on a reconnu que d'autres optimisations pourraient être réalisées à mesure que la technologie matérielle et le compilateur pour CHERI se développent.

Conclusion : Avancer avec CHERI

Porter des logiciels vers CHERI et des systèmes similaires, ce n'est pas juste corriger du code. Ça nécessite aussi d'ajuster soigneusement des paramètres qui dépendent de la gestion de la mémoire. Les changements qu'on a faits à MicroPython montrent que même des ajustements simples peuvent mener à des améliorations de performance significatives.

Au fur et à mesure que les outils et le matériel pour CHERI évoluent, on s'attend à ce que la performance continue de s'améliorer. Ce travail illustre l'importance de comprendre les caractéristiques uniques des nouvelles technologies comme CHERI quand on adapte des logiciels existants, surtout pour les systèmes qui nécessitent une haute efficacité et sécurité dans la gestion de la mémoire.

On a hâte d'optimiser encore MicroPython et d'autres applications pour CHERI et de voir les bénéfices de cette approche innovante en architecture informatique dans différents domaines.

Source originale

Titre: CHERI Performance Enhancement for a Bytecode Interpreter

Résumé: During our port of the MicroPython bytecode interpreter to the CHERI-based Arm Morello platform, we encountered a number of serious performance degradations. This paper explores several of these performance issues in detail, in each case we characterize the cause of the problem, the fix, and the corresponding interpreter performance improvement over a set of standard Python benchmarks. While we recognize that Morello is a prototypical physical instantiation of the CHERI concept, we show that it is possible to eliminate certain kinds of software-induced runtime overhead that occur due to the larger size of CHERI capabilities (128 bits) relative to native pointers (generally 64 bits). In our case, we reduce a geometric mean benchmark slowdown from 5x (before optimization) to 1.7x (after optimization) relative to AArch64, non-capability, execution. The worst-case slowdowns are greatly improved, from 100x (before optimization) to 2x (after optimization). The key insight is that implicit pointer size presuppositions pervade systems code; whereas previous CHERI porting projects highlighted compile-time and execution-time errors exposed by pointer size assumptions, we instead focus on the performance implications of such assumptions.

Auteurs: Duncan Lowther, Dejice Jacob, Jeremy Singer

Dernière mise à jour: 2023-09-12 00:00:00

Langue: English

Source URL: https://arxiv.org/abs/2308.05076

Source PDF: https://arxiv.org/pdf/2308.05076

Licence: https://creativecommons.org/licenses/by/4.0/

Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.

Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.

Articles similaires