Comment réussir à concilier efficience et performance sur du code embarqué en production ?
C’est une question que nous posent régulièrement les équipes de développement ou équipes «Produit » avec qui nous échangeons, notamment lorsque l’entreprise a de vraies ambitions sur le plan environnemental et énergétique.
Et souvent, la réponse est…positive. Elle engage des enjeux d’éco-conception logicielle et de frugalité du code. Ce fut justement le point de départ de notre collaboration avec Bouygues Telecom dans le cadre d’une réflexion sur une gamme de leur Box TV.
L’opérateur global de communication est fortement engagé en faveur d’un numérique responsable pour tous. Concrètement, cela conduit ses équipes à revoir leur façon de penser et concevoir ses futures solutions mais aussi à questionner les produits proposés et services déjà déployés, sur lesquels agir a évidemment un impact conséquent et concret du fait du volume déjà déployé.
Dans ce cas, il s’agissait d’interroger le potentiel de performance d’une application logicielle (C++) s’exécutant sur une Box TV et réalisant le filtrage de trames réseaux selon plusieurs protocoles pour transmettre des données vidéo via une connexion internet. Notre rôle est alors de diagnostiquer la partie logicielle afin d’apprécier son optimisation potentielle.
Comment répondre à cette problématique ?
La spécificité de notre expertise consiste à explorer un code source afin de comprendre son organisation et la structure des données en lien avec la cible matérielle sur laquelle il va être exécuté. Grâce à cette association, nous sommes en mesure d’identifier si le potentiel de cette dernière est exploité à plein par rapport aux objectifs et, en lien avec tout une gamme de techniques d’optimisation, de repérer ce qui pourrait être optimisé.
C’est cette phase de diagnostic qui permet de chiffrer un potentiel de gain, de sélectionner là où l’effort d’optimisation doit être placé et d’engager ensuite l’optimisation.
Mise en œuvre du diagnostic
Nous avons travaillé sur une Box possédant un quad core ARM Cortex-A9. Particularité intéressante, le jeu d’instructions (ARMv7) possède une unité SIMD Neon 128-bits. Un terrain propice à de la vectorisation.
Le diagnostic s’est concentré sur :
. l’identification des boucles for et while
. la caractérisation de leur potentiel de vectorisation
. l’évaluation du nombre d’appels à chaque fonction et du nombre d’instructions utilisées dans chaque fonction.
Résultat du diagnostic
Plusieurs pistes d’optimisation ont été détectées. La stratégie d’optimisation recommandée visait à se concentrer sur les fonctions vectorisables (44) et notamment 15 d’entre elles à fort potentiel.
Optimisation : 39% de gains
A l’issue de la phase d’optimisation, c’est un gain moyen de 39% en nombre d’instruction et 36,3% sur le nombre de cycles qui ont été obtenus.
Les techniques d’optimisation implémentées ont été les suivantes :
- Vectorisation
- Transformation des boucles for en memset/memcpy
- Remplacement de boucles
- Initialisations plus efficaces
Quels enseignements techniques en tirer ?
En termes d’enseignements techniques, cette collaboration a permis de mettre en évidence plusieurs points :
Il est possible d’aller chercher des gains sur des applications logicielles effectuant majoritairement des opérations de contrôle. Jusqu’à présent, nous avions essentiellement travaillé sur du code effectuant du calcul. Notre future solution beLow permettra justement, dans sa phase de diagnostic, d’identifier et classifier les opérations réalisées sur le code selon leur nature (contrôle, mémoire, calcul).
Exploiter le potentiel de vectorisation de l’ARMv7 est source de gains assez importants, le SIMD permettant d’exécuter une instruction sur plusieurs données préalablement empaquetées(bénéfique si calculs répétitifs et intensifs). Cela nécessite de re-ecrire le code de manière adaptée pour contourner les limites du compilateur.
Travailler sur son parc d’équipements existants déployés est une approche intéressante pour maximiser les impacts permettant, sur du volume, de réduire sa consommation d’énergie voire de prolonger sa durée de vie.
Cette collaboration était notre première avec un grand groupe. Merci aux équipes de Bouygues Télécom avec qui nous avons collaboré (Herminio de Faria, Vincent Paillet). La preuve qu’il est possible, pour une startup, de travailler avec un grand groupe et des équipes opérationnelles quand ces derniers sont motivés et se caractérisent par une forte culture de l’innovation associée à la volonté d’agir concrètement en faveur d’un numérique plus responsable et frugal.