FR 3146750 A1 20240920 FR 2302516 A 20230317 L’invention porte sur un procédé de génération automatique d'une séquence de Nmax instructions en langage assembleur, exécutable sans erreur par un processeur multi-cœurs, comprenant les étapes de : initialisation des registres du processeur, puis choix d'une première instruction de la séquence prédéterminée, éventuellement au hasard ; et choix d'une N+1 ième instruction, parmi une instruction de lecture dans une mémoire connectée aux cœurs du processeur par un bus mémoire, une instruction d'écriture dans ladite mémoire, et une instruction locale utilisant uniquement les registres des processeurs, en fonction de règles et de priorités entre lesdites règles, lesdites règles utilisant des écarts respectifs de valeurs de métriques statistiques d'un profil (P) d'accès mémoire de la séquence des N instructions précédentes comprenant des valeurs de métriques statistiques, avec des valeurs de consignes. Figure pour l’abrégé : [Fig.4] Procédé de génération automatique d'une séquence de Nmax instructions en langage assembleur, exécutable sans erreur par un processeur multi-cœurs L'invention porte sur un procédé de génération automatique d'une séquence de Nmax instructions en langage assembleur, exécutable sans erreur par un processeur multi-cœurs. Le domaine technique de l’invention est celui du logiciel en général et plus particulièrement de la génération de bouchons logiciels ou "stub" en langue anglaise. Un bouchon est un module logiciel simulant à minima la présence d'un autre. Dans le cas d’une imitation plus sophistiquée, notamment simulant une part des échanges fonctionnels, on parle de simulateurs ou modèles. Dans la présente invention, on se limite à simuler l’impact de l’exécution du logiciel sur l’activité d'un bus mémoire, on ne cherche pas à simuler l'aspect fonctionnel de l’application. L'invention concerne également le test de performance de logiciels embarqués (Pire cas de temps d’exécution ou WCET pour acronyme de "Worst Case Execution Time" en langue anglaise, et l’analyse du problème des contentions ou interférences mémoire processeurs ou multi-cœurs et du comportement des logiciels en regard de celui-ci : notamment les notions d’agressivité et sensibilité. La présente invention est un moyen pour générer automatiquement, et rapidement, des bouchons logiciels aux caractéristiques ciblées et au comportement maitrisé vis-à-vis des contentions mémoire. Actuellement, pour construire un bouchon logiciel, une séquence de code est élaborée par un programmeur, en assembleur ou en langage de haut niveau, et il est exécuté en boucle. Il est connu de générer, par un ingénieur logiciel une séquence de code en langage machine assembleur ou en langage de haut niveau tel que du langage C, qui est exécuté en boucle. Les caractéristiques de cette séquence sont déterminées par analyse d’un ingénieur logiciel, en fonction de son expertise du code assembleur et de l’impact de chaque instruction sur les contentions mémoire. Une telle construction "manuelle" d’une séquence de code assembleur se heurte aux limitations intrinsèques d’une activité manuelle de ce type comme un temps long pour des séquences de taille importante, de l'ordre de plusieurs dizaines de minutes, voire plusieurs heures pour construire une séquence de plusieurs milliers d’instructions assembleur, ou comme les compétences fines nécessaires pour sécuriser l’exécution sur cible de chaque séquence nécessitant le respect des contraintes liées à chaque instruction (valeur des opérandes, adressage mémoire, gestion des registres). Dès lors, la taille des séquences construites manuellement est souvent limitées à quelques instructions (au plus quelques dizaines). Or la taille des séquences générées est importante pour obtenir une grande diversité de Profils d’Accès Mémoire (des séquences de quelques dizaines d’instructions finiront par avoir des profils similaires). Il est également connu de construire une séquence de code de manière automatique, par exemple en choisissant des instructions au hasard dans le dictionnaire d’instructions du microprocesseur. La construction automatique de séquences de plusieurs centaines d’instructions par tirage au sort dans le dictionnaire d’instructions du microprocesseur, revient à faire de multiples tirages aléatoires successifs, et voit donc la loi des grands nombres s’appliquer. Aussi, on obtient des séquences d’instructions statistiquement très similaires, qui reflètent la répartition statistique dans le dictionnaire des instructions de type lecture R, écriture W et locales (i.e. : ne travaillant que sur les registres), ainsi qu’une entropie E de Shannon moyenne. En conséquence, il est actuellement très difficile de construire rapidement des séquences d’instructions aux caractéristiques variées et précisément choisies, que ce soit dans l’optique d’en faire une base d’apprentissage de plusieurs milliers d’items ou de construire un unique bouchon logiciel aux caractéristiques choisies. Souvent, le comportement de telles séquences vis-à-vis des contentions mémoires est difficile à anticiper : il est difficile de quantifier ses capacités à générer et/ou subir les contentions mémoire, nommées respectivement son agressivité et sa sensibilité. Dans l’utilisation des microprocesseurs multi-cœurs, plusieurs ressources peuvent être partagées par les différents logiciels s’exécutant en parallèles sur les différents cœurs. Notamment, la mémoire ou RAM pour acronyme de "Random Access Memory" en langue anglaise, est accessible par un bus commun à tous les cœurs. Comme toute ressource partagée, ce bus est géré par un contrôleur qui gère les accès simultanés et concurrent selon ses propres logiques d’arbitrages, provoquant le ralentissement de l’un ou l’autre des logiciels s’exécutant sur les différents cœurs. Selon l’activité de ces logiciels et surtout leur manière d’accéder à la mémoire (on parle de Profil d’Accès Mémoire ou de "Memory Acces Pattern" en langue anglaise), il se produit donc un ralentissement de leur exécution (lié à l’attente lors de l’exécution des instructions assembleur accédant à la mémoire en cas d’accès concurrents). Ce ralentissement dépend : des logiques d’arbitrage du contrôleur du bus mémoire, du profil d’accès mémoire du logiciel, et des profils des logiciels s’exécutant en parallèle sur les autres cœurs. Ce phénomène est connu sous le terme d’interférences ou contentions mémoire. Dans le cadre des logiciels embarqués critiques, il est nécessaire (et parfois requis par des autorités de certification) de fournir la valeur de pire cas du temps d’exécution du logiciel ou WCET, afin de vérifier qu’il a bien le temps de s’exécuter dans le temps qui lui a été alloué. Cette caractérisation, déjà difficile pour des logiciels complexes sur des microprocesseurs mono-cœur, devient encore plus problématique sur des microprocesseurs multi-cœurs, du fait de ce phénomène de contentions impliquant tous les logiciels s’exécutant en parallèle. On définit les notions d’agressivité, ou capacité à générer des contentions mémoires, et de sensibilité ou propension à les subir, par mesure face à des applications de référence que l’on se donne : une application sensible de référence est construite, exécutant une boucle d’instructions assembleur identifiée, par analyse, comme moins prioritaires dans les mécanismes d’arbitrage du bus mémoire. Un compteur est incrémenté à chaque exécution de la boucle, et une application agressive de référence est construite sur le même principe avec une boucle d’instruction parmi les plus prioritaires. Pour mesurer l’agressivité et la sensibilité d’une séquence de code assembleur, on l’exécute en boucle sur une même période de temps dans les configurations suivantes : Exécution de l'application sensible seule : on relève le nombre de boucles exécutées sur la période ; Exécution de la séquence seule : on relève le nombre de boucles exécutées sur la période ; Exécution de la séquence en parallèle avec l’application sensible : on mesure le ralentissement de l’application sensible lorsqu’elle s’exécute en parallèle de la séquence de code, par rapport à son exécution seule ; Exécution de la séquence en parallèle avec l’application agressive : on mesure le ralentissement de la séquence testée lorsqu’elle s’exécute en parallèle de l’application agressive, par rapport à son exécution seule. L’agressivité, comme illustrée sur la , est le ratio des nombres de boucles exécutées par l’application sensible de référence sur une même période de temps quand elle est exécutée seule et en parallèle avec la séquence testée. La sensibilité, comme illustrée sur la , est le ratio des nombres de boucles exécutées par l’application agressive de référence sur une même période de temps quand elle est exécutée seule et en parallèle avec la séquence testée. Sensibilité et agressivité sont des ratios et sont donc exprimées en pourcentages. Le phénomène de contentions ou interférences mémoire étant intrinsèquement lié aux sollicitations du bus mémoire par les logiciels, on cherche à caractériser ces sollicitations. Pour cela, il est connu de définir un profil d’accès mémoire P d’une séquence de code assembleur par une liste séquentielle des instructions assembleur accédant à la mémoire (extrait de cette séquence de code), ainsi que les adresses mémoire qui sont accédées, comme illustré sur la . Ce profil d'accès mémoire P est complété par des caractéristiques statistiques calculées sur cette liste, notamment, de manière non exhaustive par : une Intensité mémoire I m représentative du nombre d’instructions d'accès en lecture R pour Read en langue anglaise ou d'accès en écriture W pour Write en langue anglaise, vs le nombre total d’instructions ; un ratio lecture/lecture-écriture ou ration lecture/mémoire Rwr représentatif du nombre d’instructions d'accès en lecture R vs nombre d’instructions d'accès en mémoire (lecture et écriture). Nous appellerons par la suite le nombre d’accès en lecture-écriture par le terme le nombre d’accès mémoire ; une entropie E de Shannon du profil d'accès mémoire P représentative de l'aspect aléatoire des adresses accédées en mémoire ; et un entrelacement Iv, pour interleaving en langue anglaise, des instructions d'accès en lecture R et des instructions d'accès en écriture W. Le document "Improving Prediction Accuracy of Memory Interferences for Multicore Platforms", de C.Courtaud et al, hal-02401625, détaille ces caractéristiques statistiques et démontre leur pertinence pour caractériser la sensibilité d’un logiciel aux contentions. Un but de l'invention est de pallier les problèmes précédemment cités, et notamment de proposer une solution permettant de générer automatiquement et rapidement des séquences de code assembleur : exécutables sans erreur (i.e. : sans arrêt de l’exécution suite à une exception logicielle) ; ayant des profils d’accès mémoire P aux caractéristiques choisies et variées, et donc a priori : plus ou moins agressif (générant plus ou moins de contentions mémoires) ; Plus ou moins sensible (subissant plus ou moins les contentions). Un autre but de l'invention est d’utiliser ces séquences de code assembleur pour construire : une base de plusieurs milliers de bouchons logiciels aux profils d’accès mémoire connus dont on mesure les agressivité et sensibilité. Cette base peut être utilisée pour entrainer (par apprentissage automatique ou Machine Learning en langue anglaise) un modèle capable d’estimer les agressivité et sensibilité de profils d’accès mémoire extraits de véritables applications embarquées critiques ; et des bouchons logiciels aux profils d’accès mémoire caractérisés permettant de simuler les agressivité et sensibilité d’applications embarquées concurrentes pour réaliser les tests de performance WCET d’une application embarquée donnée. Il est proposé, selon un aspect de l'invention, un procédé de génération automatique d'une séquence de Nmax instructions en langage assembleur, exécutable sans erreur par un processeur multi-cœurs, comprenant les étapes de : initialisation des registres du processeur, puis choix d'une première instruction de la séquence prédéterminée, éventuellement au hasard ; et choix d'une N+1 ième instruction, parmi une instruction de lecture dans une mémoire connectée aux cœurs du processeur par un bus mémoire, une instruction d'écriture dans ladite mémoire, et une instruction locale utilisant uniquement les registres des processeurs, en fonction de règles et de priorités entre lesdites règles, lesdites règles utilisant des écarts respectifs de valeurs de métriques statistiques d'un profil d'accès mémoire de la séquence des N instructions précédentes comprenant des valeurs de métriques statistiques, avec des valeurs de consignes. Dans un mode de réalisation, les métriques statistiques du profil d'accès mémoire de la séquence des N instructions précédentes comprennent : une intensité mémoire correspondant au ratio du nombre d'instructions d'accès en lecture ou en écriture et du nombre total d'instructions N ; un ratio lecture/mémoire correspondant au ratio d'instructions d'accès en lecture et d'instructions d'accès mémoire (lecture et écriture) ; et une entropie E de Shannon du profil d'accès mémoire représentative de l'aspect aléatoire des adresses accédées en mémoire. Selon un mode de réalisation, les métriques statistiques du profil d'accès mémoire de la séquence des N instructions précédentes comprennent, en outre, un entrelacement des instructions d'accès en lecture et des instructions d'accès en écriture. Dans un mode de réalisation, les règles comprennent une première règle de test si l'intensité mémoire est supérieure à une consigne d'intensité mémoire, auquel cas le choix de la N+1 ième instruction est une instruction locale, et sinon, le choix de la N+1 ième instruction est une instruction d'accès en lecture ou une instruction d'accès en écriture. Selon un mode de réalisation, les règles comprennent des règles appliquées après la première règle, dans un ordre quelconque : - une deuxième règle de test si le ratio lecture/mémoire est supérieur à une consigne de ratio lecture/ mémoire, auquel cas le choix de la N+1 ième instruction est une instruction d'accès en lecture, et sinon le choix de la N+1 ième instruction est une instruction d'accès en écriture ; - une troisième règle de test si l'entropie E de Shannon du profil d'accès mémoire est supérieure à une consigne d'entropie E de Shannon, auquel cas le choix de l'adresse mémoire de la N+1 ième instruction est choisie de manière à faire baisser l’entropie E, en prenant une adresse déjà utilisée ou une adresse dont la distance à la précédente est déjà connue, et sinon le choix de l'adresse mémoire de la N+1 ième instruction est choisie au hasard ; et - une quatrième règle de test si l'entrelacement est supérieur à une consigne d'entrelacement, auquel cas le choix de la N+1 ième instruction est une instruction d'accès en lecture ou d'accès en écriture de même type que la N ième instruction, et sinon le choix de la N+1 ième instruction est une instruction d'accès en lecture ou d'accès en écriture de type opposé à celui de la N ième instruction. Dans un mode de réalisation, le procédé comprend en outre l'intégration de la séquence de Nmax instructions en langage assembleur dans une boucle d'exécution pour générer un logiciel exécutable ou bouchon logiciel. L'invention sera mieux comprise à l'étude de quelques modes de réalisation décrits à titre d'exemples nullement limitatifs et illustrés par les dessins annexés sur lesquels : illustre schématiquement l'agressivité d'une séquence de code assembleur, selon l'état de l'art ; illustre schématiquement la sensibilité d'une séquence de code assembleur, selon l'état de l'art ; illustre schématiquement une liste séquentielle des instructions assembleur accédant à la mémoire (extrait de cette séquence de code), ainsi que les adresses mémoire qui sont accédées d'un profil d'accès mémoire, selon l'état de l'art ; illustre schématiquement un procédé de génération automatique d'une séquence de Nmax instructions en langage assembleur, exécutable sans erreur par un processeur multi-cœurs, selon un aspect de l'invention ; illustre schématiquement un exemple de règles de choix d'instructions du procédé de la , selon un aspect de l'invention ; illustre schématiquement une automatisation du processus de sélection des instructions assembleur pour construire rapidement des séquences, selon un aspect de l'invention. Sur l'ensemble des figures, les éléments ayant des références identiques sont similaires. Comme illustré sur la , l'invention propose un procédé de génération automatique d'une séquence de Nmax instructions en langage assembleur, exécutable sans erreur par un processeur multi-cœurs, comprenant les étapes de : initialisation des registres du processeur, puis choix d'une première instruction de la séquence prédéterminée, éventuellement au hasard ; et choix d'une N+1 ième instruction, parmi une instruction de lecture dans une mémoire connectée aux cœurs du processeur par un bus mémoire, une instruction d'écriture dans ladite mémoire, et une instruction locale utilisant uniquement les registres des processeurs, en fonction de règles et de priorités entre lesdites règles, lesdites règles utilisant des écarts respectifs de valeurs de métriques statistiques d'un profil P d'accès mémoire de la séquence des N instructions précédentes comprenant des valeurs de métriques statistiques, avec des valeurs de consignes. Les métriques statistiques du profil d'accès mémoire de la séquence des N instructions précédentes comprennent : une intensité mémoire Im correspondant au ratio du nombre d'instructions d'accès en lecture R ou en écriture W et du nombre total d'instructions N ; un ratio lecture/ mémoire Rwr correspondant au ratio d'instructions d'accès en lecture R et d'instructions d'accès mémoire (lecture R et écriture W) ; et une entropie E de Shannon du profil d'accès mémoire P représentative de l'aspect aléatoire des adresses accédées en mémoire. Les métriques statistiques du profil d'accès mémoire de la séquence des N instructions précédentes peuvent comprendre, en outre, un entrelacement Iv des instructions d'accès en lecture R et des instructions d'accès en écriture W. La représente un exemple de règles de choix d'instructions. Les règles comprennent une première règle de test si l'intensité mémoire Im est supérieure à une consigne Im_c d'intensité mémoire, auquel cas le choix de la N+1 ième instruction est une instruction locale, et sinon, le choix de la N+1 ième instruction est une instruction d'accès en lecture R ou une instruction d'accès en écriture W. Les règles comprennent des règles appliquées après la première règle, dans un ordre quelconque : - une deuxième règle de test si le ratio lecture/ mémoire Rwr est supérieur à une consigne Rwr_c de ratio lecture/ mémoire, auquel cas le choix de la N+1 ième instruction est une instruction d'accès en lecture R, et sinon le choix de la N+1 ième instruction est une instruction d'accès en écriture W ; - une troisième règle de test si l'entropie E de Shannon Ep du profil d'accès mémoire P est supérieure à une consigne Ep_c d'entropie E de Shannon Ep, auquel cas le choix de l'adresse mémoire de la N+1 ième instruction est choisie de manière à faire baisser l’entropie E, en prenant une adresse déjà utilisée ou une adresse dont la distance à la précédente est déjà connue, et sinon le choix de l'adresse mémoire de la N+1 ième instruction est choisie au hasard ; et - une quatrième règle de test si l'entrelacement Iv est supérieur à une consigne Iv_c d'entrelacement, auquel cas le choix de la N+1 ième instruction est une instruction d'accès en lecture R ou d'accès en écriture W de même type que la N ième instruction, et sinon le choix de la N+1 ième instruction est une instruction d'accès en lecture R ou d'accès en écriture W de type opposé à celui de la N ième instruction. En variante, d’autres métriques peuvent être envisagées, et d’autres règles définies en fonction de celles-ci pour influencer le choix des instructions, des registres utilisés, des adresses mémoire visées. Le procédé comprend, en outre, l'intégration de la séquence de Nmax instructions en langage assembleur dans une boucle d'exécution pour générer un logiciel exécutable ou bouchon logiciel. L’invention permet, comme illustré sur la , d’automatiser le processus de sélection des instructions assembleur pour construire rapidement des séquences : de taille variable, potentiellement très longues (des milliers d’instructions), cohérentes et à l’exécution garantie sur cible (pas d'erreur d'exécution), et aux profils d’accès mémoire proches des valeurs cibles ou consignes choisies. En outre, l’automatisation permet de générer rapidement de multiples séquences, aux profils d’accès mémoires variés (en fonction des multiples valeurs cibles choisies), et donc de construire une base d’apprentissage pertinente pour de l’apprentissage automatique (machine learning), selon les étapes qui suivent : génération de la séquence d’instructions assembleur selon les principes précédemment décrits ; intégration dans un squelette C et construction du binaire ; mesures d’agressivité A et de sensibilité S sur cible ; extraction du pattern d’accès mémoire et des métriques associées ; et capitalisation des séquences, patterns d’accès mémoire et mesures pour constituer une base d’apprentissage ; une étape additionnelle peut consister en l’utilisation de la base d’apprentissage pour l’entrainement supervisé d’un estimateur pour la sensibilité et l’agressivité (machine learning). Procédé de génération automatique d'une séquence de Nmax instructions en langage assembleur, exécutable sans erreur par un processeur multi-cœurs, comprenant les étapes de : initialisation des registres du processeur, puis choix d'une première instruction de la séquence prédéterminée, éventuellement au hasard ; et choix d'une N+1 ième instruction, parmi une instruction de lecture dans une mémoire connectée aux cœurs du processeur par un bus mémoire, une instruction d'écriture dans ladite mémoire, et une instruction locale utilisant uniquement les registres des processeurs, en fonction de règles et de priorités entre lesdites règles, lesdites règles utilisant des écarts respectifs de valeurs de métriques statistiques d'un profil (P) d'accès mémoire de la séquence des N instructions précédentes comprenant des valeurs de métriques statistiques, avec des valeurs de consignes. Procédé selon la revendication 1, dans lequel les métriques statistiques du profil d'accès mémoire de la séquence des N instructions précédentes comprennent : une intensité mémoire (Im) correspondant au ratio du nombre d'instructions d'accès en lecture (R) ou en écriture (W) et du nombre total d'instructions N ; un ratio lecture/mémoire (Rwr) correspondant au ratio d'instructions d'accès en lecture (W) et d'instructions d'accès en mémoire (R, W) ; et une entropie (E) d'accès de Shannon du profil d'accès mémoire (P) représentative de l'aspect aléatoire des adresses accédées en mémoire. Procédé selon la revendication 2, dans lequel les métriques statistiques du profil d'accès mémoire de la séquence des N instructions précédentes comprennent, en outre, un entrelacement (Iv) des instructions d'accès en lecture (R) et des instructions d'accès en écriture (W). Procédé selon l'une des revendications précédentes, dans lequel les règles comprennent une première règle de test si l'intensité mémoire (Im) est supérieure à une consigne (Im_c) d'intensité mémoire, auquel cas le choix de la N+1 ième instruction est une instruction locale, et sinon, le choix de la N+1 ième instruction est une instruction d'accès en lecture (R) ou une instruction d'accès en écriture (W). Procédé selon la revendication 4, dans lequel, les règles comprennent des règles appliquées après la première règle, dans un ordre quelconque : - une deuxième règle de test si le ratio lecture/ mémoire (Rwr) est supérieur à une consigne (Rwr_c) de ratio lecture/mémoire, auquel cas le choix de la N+1 ième instruction est une instruction d'accès en lecture (R), et sinon le choix de la N+1 ième instruction est une instruction d'accès en écriture (W) ; - une troisième règle de test si l'entropie E de Shannon (Ep) du profil d'accès mémoire (P) est supérieure à une consigne (Ep_c) d'entropie E de Shannon (Ep), auquel cas le choix de l'adresse mémoire de la N+1 ième instruction est choisie de manière à faire baisser l’entropie E, en prenant une adresse déjà utilisée ou une adresse dont la distance à la précédente est déjà connue, et sinon le choix de l'adresse mémoire de la N+1 ième instruction est choisie au hasard ; et - une quatrième règle de test si l'entrelacement (Iv) est supérieur à une consigne (Iv_c) d'entrelacement, auquel cas le choix de la N+1 ième instruction est une instruction d'accès en lecture (R) ou d'accès en écriture (W) de même type que la N ième instruction, et sinon le choix de la N+1 ième instruction est une instruction d'accès en lecture (R) ou d'accès en écriture (W) de type opposé à celui de la N ième instruction. Procédé selon l'une des revendications précédentes comprenant, en outre, l'intégration de la séquence de Nmax instructions en langage assembleur dans une boucle d'exécution pour générer un logiciel exécutable ou bouchon logiciel.