Brevet FR3091362A1 — publié le 20200703

Description Titre de l'invention : MÉMOIRE CACHE D'INSTRUCTIONS DANS UN PROCESSEUR À FILS D'EXÉCUTION MULTIPLES Domaine technique [0001] La présente description concerne une mémoire cache d'instructions pour mettre en mémoire cache des portions de code machine dans un processeur à fils (l'exécution multiples. Technique antérieure [0002] On a trouvé de plus en plus d'intérêt à développer des processeurs conçus pour des applications spécifiques, comme des unités de traitement graphique (GPU) et des processeurs de signal numérique (DSP). Un autre type de processeur spécifique à des applications auquel on a récemment porté de plus en plus d'intérêt est un type dédié à des applications d'intelligence artificielle, dénommé par la demanderesse "IPU" (de l'anglais Intelligence Processing Unit - unité de traitement pour intelligence). Ces processeurs peuvent être utilisés par exemple comme processeurs accélérateurs agencés pour réaliser des tâches allouées par un hôte, comme par exemple pour réaliser un apprentissage ou pour aider à l'apprentissage d'un modèle de connaissance comme un réseau neuronal, ou pour réaliser ou aider à réaliser des prédictions ou des inférences sur la base d'un tel modèle. [0003] Un algorithme d'intelligence artificielle est basé sur la réalisation itérative de mises à jour d'un "modèle de connaissance", qui peut être représenté par un graphe de multiples noeuds interconnectés. Chaque noeud représente une fonction de ses entrées. Certains noeuds reçoivent les entrées du graphe et certains noeuds reçoivent des entrées provenant d'un ou plusieurs autres noeuds, tandis que les sorties de certains noeuds constituent les entrées d'autres noeuds, et les sorties de certains noeuds fournissent la sortie du graphe (et dans certains cas un noeud donné peut même comporter tout cela : des entrées du graphe, des sorties du graphe et des connexions à d'autres noeuds). En outre, la fonction au niveau de chaque noeud est paramétrée par un ou plusieurs paramètres respectifs, par exemple des poids. Pendant une étape d'apprentissage le but est, sur la base d'un ensemble de données d'entrée expérimentales, de trouver des valeurs pour les divers paramètres telles que le graphe dans son ensemble va générer une sortie souhaitée pour une plage d'entrées possibles. Divers algorithmes pour réaliser cela sont connus dans la technique, comme un algorithme à rétro-programmation basé sur une descente de gradient stochastique. Sur de multiples itérations basées sur les données d'entrée, les paramètres sont progressivement ajustés pour diminuer leurs erreurs, et ainsi le graphe converge vers une solution. Dans une 2 étape ultérieure, le modèle appris peut alors être utilisé pour faire des prédictions de sorties étant donné un ensemble spécifié d'entrées ou pour réaliser des inférences quant aux entrées (causes) étant donné un ensemble spécifié de sorties. [0004] La mise en oeuvre de chaque noeud va impliquer le traitement de données, et les inter- connexions du graphe correspondent à des données à échanger entre les noeuds. Typiquement, au moins une partie du traitement de chaque noeud peut être réalisée indépendamment de certains ou de la totalité des autres noeuds du graphe, et par conséquent de grands graphes présentent de grandes opportunités pour la simultanéité et/ou le parallélisme. [0005] Par conséquent, un processeur conçu pour des applications d'intelligence artificielle peut inclure une assistance pour l'exécution simultanée de multiples fils de programme. Cette assistance comprend typiquement un ensemble respectif de registres de contexte pour chaque fil, chaque ensemble étant utilisé pour contenir l'état de programme (le "contexte") de l'un respectif d'une pluralité de fils à exécuter simultanément. L'état de programme contenu dans les registres de contexte d'un fil donné comprend typiquement un compteur de programme pour cc fil, un ou plusieurs registres d'état de commande enregistrant un état du fil (par exemple en pause, en exécution, etc.), et une pluralité de registres d'opérandes comprenant des registres d'opérandes arithmétiques pour contenir temporairement des valeurs sur lesquelles on doit agir et produites en sortie par des instructions arithmétiques du fil respectif Les différents fils d'exécution simultanés sont entrelacés temporellement dans un pipeline d'exécution commun dans des créneaux temporels d'exécution respectifs différents, chaque créneau utilisant seulement les registres d'un ensemble respectif différent parmi les ensembles de registres de contexte. [0006] Dans une autre approche, un processeur conçu pour l'intelligence artificielle peut comprendre de multiples unités d'exécution parallèles comprenant chacune un pipeline séparé (c'est-à-dire un parallélisme vrai, par opposition à la simultanéité qui signifie entrelacement). Le processeur peut être divisé en une matrice de pavés, chacun comprenant sa propre unité d'exécution et sa propre mémoire destinée à être utilisée par cette unité d'exécution, mettant ainsi en oeuvre une matrice de modules de traitement parallèles sur la même puce ou même répartis sur de multiples puces. Un processeur peut même combiner cet agencement avec l'approche simultanée, c'est-à-dire de manière à comprendre une matrice de pavés multiples dans laquelle chaque pavé est agencé pour exécuter de multiples fils d'exécution simultanés. Résumé de l'invention [0007] On reconnait ici qu'il peut y avoir des circonstances dans lesquelles on souhaite que de multiples fils d'exécution différents exécutent le même code. Un exemple peut se 3 trouver dans une application d'intelligence artificielle où chaque fil réalise le traitement d'un noeud respectif différent. Dans ce cas, on reconnait ici que certains noeuds peuvent en fait réaliser certaines parties de calcul identiques. Tl serait économique en termes de consommation d'énergie que ce code n'ait pas à être extrait séparément de la mémoire par les fils de tous ces noeuds. Des problèmes similaires peuvent survenir dans d'autres applications où des processus simultanés différents comprennent certaines ou la totalité des mêmes opérations. [0008] Selon un aspect décrit ici, on prévoit un processeur comprenant : une unité d'exécution agencée pour exécuter des instances de types d'instructions définis dans un jeu d'instructions, l'unité d'exécution étant une unité d'exécution à fils d'exécution en barillet agencée pour exécuter une pluralité de fils d'exécution simultanés, chacun dans un créneau respectif différent d'une séquence répétitive de créneaux temporels entrelacés ; et une mémoire cache de répétition ayant un état associé enregistrant si la mémoire cache de répétition est ou non actuellement réclamée par l'un des fils. Les types d'instructions définis dans le jeu d'instructions comprennent une instruction de répétition qui prend un opérande de compte de répétition, l'unité d'exécution étant agencée de manière à : a) lorsque la mémoire cache de répétition n'est pas actuellement réclamée conformément audit état et une instance respective de l'instruction de répétition est exécutée dans un premier fil respectif parmi les fils, mettre en mémoire cache une portion de code provenant du premier fil dans la mémoire cache de répétition, modifier ledit état pour enregistrer la mémoire cache de répétition comme réclamée, et exécuter ladite portion de code un certain nombre respectif de fois, en prenant chaque répétition successive dans la mémoire cache de répétition, et b) lorsque la mémoire cache de répétition est actuellement réclamée conformément audit état et une autre instance de l'instruction de répétition est ensuite exécutée en tant que partie d'autres fils respectifs quelconques parmi les fils jusqu'à ce que l'état soit ensuite ré-initialisé pour enregistrer la mémoire cache de répétition comme de nouveau non réclamée, exécuter la portion de code déjà mise en mémoire cache un nombre de fois respectif, à chaque fois à partir de la mémoire cache de répétition. Pour chacune de la première et des autres instructions, l'opérande de compte de répétition dans l'instruction respective spécifie le nombre respectif de fois avec lequel la portion de code est exécutée, l'opérande de compte de répétition pouvant spécifier l'une quelconque d'une pluralité de valeurs entières positives pour le nombre respectif de fois avec lequel il faut exécuter la portion de code. [0009] Ainsi le processeur actuellement décrit fournit avantageusement un mécanisme par lequel non seulement le premier fil d'exécution peut réutiliser son propre code plusieurs fois sur la base de la mémoire cache de répétition, mais aussi d'autres fils peuvent réutiliser le même code déjà mis en mémoire cache par le premier fil sans avoir à extraire séparément ce même code de la mémoire. [0010] Dans des modes de réalisation, ladite portion de code peut être une portion à la suite de l'instance de l'instruction de répétition dans le premier fil. [0011] Dans des modes de réalisation, l'instruction de répétition peut prendre un opérande de taille de répétition pour spécifier une taille de ladite portion de code, la portion de code pouvant s'exécuter à partir d'un point prédéfini à la suite de l'instance de l'instruction de répétition dans le premier fil, jusqu'à un point ultérieur défini par l'opérande de taille de l'instance respective de l'instruction de répétition dans le premier fil. [0012] L'opérande de taille de répétition peut spécifier la taille en ce qui concerne le nombre d'instructions individuelles à la suite du point prédéfini, ou en ce qui concerne un nombre de groupes d'instructions à la suite du point prédéfini (chaque groupe comprenant une pluralité d'instructions, par exemple deux ou quatre instructions en fonction des instructions). [0013] Dans des modes de réalisation, l'opérande de compte de répétition peut en plus prendre une valeur égale à zéro, et si le compte de répétition est égal à zéro, l'instruction de répétition amène l'unité d'exécution à sauter l'exécution de la portion de code dans le fil respectif, y compris dans le cas du premier fil. [0014] Dans des modes de réalisation, si le compte de répétition est égal à un, l'instruction de répétition peut amener l'unité d'exécution à exécuter la portion de code, en tant que partie du fil respectif, seulement une fois sans répétition. [0015] Dans des modes de réalisation, l'opérande de compte de répétition peut être un opérande immédiat, et/ou l'opérande de taille de répétition peut être un opérande immédiat. [0016] Dans des modes de réalisation, l'opérande de compte de répétition peut spécifier le nombre respectif de fois qu'il faut exécuter la portion de code en faisant référence à un registre dans lequel il faut lire le nombre respectif, et/ou l'opérande de taille de répétition peut spécifier la taille en faisant référence à un registre dans lequel il faut lire la taille. [0017] Dans des modes de réalisation, le processeur peut comprendre un mécanisme matériel pour réinitialiser automatiquement ledit état pour enregistrer la mémoire cache de répétition comme non réclamée de nouveau une fois qu'au moins l'un du premier et des autres fils a terminé d'exécuter la portion de code mise en mémoire cache avec son nombre de fois respectif [0018] Dans des modes de réalisation, le mécanisme peut être agencé pour réinitialiser auto- matiquement ledit état lorsque le premier fil a terminé d'exécuter la portion de code mise en mémoire cache avec son nombre de fois respectif. [0019] En variante, le mécanisme peut être agencé pour effacer automatiquement la ré- clamation de la mémoire cache de répétition lorsque le premier et tous les autres fils ont terminé d'exécuter la portion de code mise en mémoire cache avec leurs nombres de fois respectives. [0020] L'état de la mémoire cache de répétition, enregistrant si elle est réclamée, peut par exemple être mis en oeuvre sous forme d'un état interne de la mémoire cache de répétition ou de l'unité d'exécution (une ou plusieurs bascules dans la circuiterie interne), ou en variante il peut être mis en oeuvre dans un registre dans un banc de registres (par exemple l'un des registres de contexte du premier fil ou du superviseur - voir ci-après). [0021] Dans certains cas il peut être souhaité que de multiples fils différents exécutent le même code, mais en opérant sur des données différentes. Ici encore on peut trouver un exemple dans une application d'apprentissage automatique. Par exemple, considérons à nouveau le cas où chaque fil réalise le traitement d'un noeud respectif différent. Il s'avère que de nombreux noeuds peuvent en fait comprendre le même processus, mais agissant sur leurs propres données d'entrée respectives, par exemple lorsque les noeuds en question représentent exactement la même fonction mais ont des connexions d'entrée (arrêtes) différentes dans le graphe. [0022] Par conséquent dans des modes de réalisation, le processeur peut comprendre une pluralité d'ensembles de registres de contexte, chaque ensemble étant agencé pour contenir un état de programme de l'un respectif des fils simultanés ; et l'unité d'exécution peut être agencée de manière à, en réponse à l'instruction de répétition se trouvant clans chacun du premier et d'autres fils, exécuter la même portion de code mais en agissant sur une ou plusieurs valeurs d'opérandes respectives contenues dans un ou plusieurs registres de l'ensemble respectif propre de registres de contexte du fil respectif. [0023] Dans des modes de réalisation, les fils simultanés peuvent comprendre une pluralité de fils de travail et l'unité d'exécution peut en outre être agencée pour exécuter, au moins à certains instants, un sous-programme superviseur comprenant au moins un fil superviseur agencé pour gérer les fils de travail. [0024] Dans des modes de réalisation, les registres de contexte peuvent comprendre l'un respectif des ensembles de registres de contexte pour chacun des fils de travail qui peuvent être exécutés simultanément, et un ensemble additionnel de registres de contexte agencé pour contenir un état de programme du sous-programme superviseur. [0025] Dans des modes de réalisation, le sous-programme superviseur peut être agencé pour commencer en s'exécutant initialement dans tous les créneaux, puis pour lancer les fils de travail en abandonnant chacun d'une partie ou de la totalité des créneaux dans lesquels le sous-programme superviseur s'exécutait initialement à certains fils respectifs parmi les fils de travail. 6 [0026] Dans des modes de réalisation, le jeu d'instructions peut inclure une instruction d'exécution qui, lorsqu'elle est exécutée en tant que partie du sous-programme superviseur, amène le créneau dans lequel instruction d'exécution est exécutée à être abandonné à l'un des fils de travail de sorte que le fil de travail est lancé dans ce créneau à la place du sous-programme superviseur. [0027] Dans des modes de réalisation, le jeu d'instructions peut inclure une instruction de sortie qui, lorsqu'elle est exécutée en tant que partie de l'un des fils de travail, amène le créneau dans lequel l'instruction de sortie est exécutée à être rendu au sous-programme superviseur de sorte que le sous-programme superviseur continue à s'exécuter dans ce créneau de nouveau à la place du fil de travail. [0028] Dans certains cas, il peut se trouver des applications dans lesquelles des fils peuvent en fait opérer sur certaines des mêmes valeurs d'opérandes mais aussi sur certains autres opérandes qui sont spécifiques au fil individuel. Un exemple serait une multiplication vectorielle ou matricielle réalisée en tant que partie d'une convolution, par laquelle l'instruction dans chaque fil multiplie un ensemble commun de poids (partagé entre des fils) par des données d'entrées qui sont spécifiques du fil individuel. Un exemple particulier de cela peut survenir dans un réseau neuronal de convolution où de nombreux noeuds comprennent en fait les mêmes poids mais avec des connexions différentes. Considérons par exemple un scénario dans lequel chaque fil est agencé pour réaliser le traitement d'un noeud respectif différent dans le réseau neuronal, comme la convolution d'un noyau commun de poids avec des données d'entrée respectives pour détecter un certain élément caractéristique. Dans de tels scénarios, il serait avantageux de prévoir un mécanisme permettant à une instruction arithmétique donnée d'opérer sur une combinaison d'un ou plusieurs opérandes de poids communs partagés entre des fils et d'un ou plusieurs opérandes spécifiques au fil respectif individuel. Le problème n'est en aucun cas spécifique de réseaux neuronaux et pourrait apparaitre dans toute application qui se trouve à utiliser certaines valeurs d'opérandes partagées et certains opérandes spécifiques à des fils. [0029] En conséquence, dans des modes de réalisation, au moins l'une des instructions se trouvant clans ladite portion de code peut être d'un type qui opère sur une combinaison de 0 au moins une valeur d'opérande provenant d'au moins un registre dans l'ensemble respectif de registres de contexte, et au moins une valeur d'opérande provenant d'au moins un registre dans un ensemble de registres d'opérandes communs, communs aux fils de travail. [0030] Dans des modes de réalisation, l'ensemble de bancs de registres partagés peut être agencé de telle sorte que seulement le sous-programme superviseur peut écrire une valeur dans l'ensemble de registres communs, tandis que les fils de travail peuvent seulement lire dans l'ensemble de registres communs. 7 100311 Selon un autre aspect de la présente invention, on prévoit un programme in- formatique incorporé dans un stockage lisible par un ordinateur, comprenant du code agencé pour s'exécuter sur le processeur de l'une quelconque des revendications précédentes, le code comprenant lesdits fils d'exécution, dont au moins certains comprennent des instances de l'instruction de répétition agencées de telle sorte qu'au moins l'un des fils réutilise la portion de code mise en mémoire cache dans la mémoire cache de répétition par un autre des fils. [0032] Selon un autre aspect de la présente invention, on prévoit un procédé comprenant l'exécution d'un programme comprenant lesdits fils sur le processeur par l'intermédiaire de l'unité d'exécution, au moins certains des fils comprenant des instances de l'instruction de répétition agencées de telle sorte qu'au moins l'un des fils réutilise la portion de code mise en mémoire cache dans la mémoire cache de répétition par un autre des fils. [0033] Dans des modes de réalisation, le programme peut en outre être agencé pour opérer conformément à l'une quelconque des configurations décrites ici. Brève description des dessins [0034] Pour faciliter la compréhension de modes de réalisation de la présente description et pour montrer comment dc tels modes dc réalisation peuvent être mis en pratique, on va faire référence, seulement à titre d'exemple, aux dessins joints dans lesquels : [0035] [fig.1] la figure 1 est un schéma blocs d'un exemple de processeur à fils d'exécution multiples, [0036] [fig.2] la figure 2 représente schématiquement un schéma dc créneaux temporels en- trelacés, [0037] [fig.3] la figure 3 représente schématiquement un fil superviseur et une pluralité de fils de travail s'exécutant dans une pluralité dc créneaux temporels entrelacés, [0038] [fig.4] la figure 4 est un schéma blocs illustrant plus en détail un exemple dc processeur selon des modes de réalisation, [0039] W8.51 la figure 5 est un schéma blocs d'un processeur comprenant une matrice de processeurs constituants, [0040] [fig.6] la figure 6 représente schématiquement un graphe utilisé dans un algorithme d'intelligence artificielle, [0041] [fig.7] la figure 7 est un schéma blocs représentant un exemple de mémoire cache de répétition selon des modes de réalisation décrits ici. Description de modes de réalisation [0042] La figure 1 illustre un exemple de processeur 4 selon des modes de réalisation de la présente description. Le processeur 4 comprend une unité de traitement à fils d'exécution multiples 10 prenant la forme d'une unité de traitement à fils en barillet, et 8 une mémoire locale 11 (c'est-à-dire sur le même pavé dans le cas d'une matrice de pavés multiples, ou sur la même puce dans le cas d'une puce à un seul processeur). Une unité de traitement à fils d'en barillet est un type d'unité de traitement à fils d'exécution multiples dans lequel le temps d'exécution du pipeline est divisé en une séquence répétitive de créneaux temporels entrelacés, chacun d'eux pouvant être occupé par un fil d'exécution donné. On peut aussi appeler cela exécution simultanée, décrit plus en détail bientôt dans la suite. La mémoire 11 comprend une mémoire d'instructions 12 et une mémoire de données 22 (qui peuvent être mises en oeuvre dans des modules mémoire adressables différents ou dans des régions différentes du même module mémoire adressable). La mémoire d'instructions 12 mémorise du code machine à exécuter par l'unité de traitement 10, tandis que la mémoire de données 22 mémorise à la fois des données sur lesquelles va opérer le code exécuté et des données de sortie produites par le code exécuté (par exemple en résultat de telles opérations). [0043] La mémoire 12 mémorise une pluralité de fils d'exécution différents d'un programme, chaque fil d'exécution comprenant une séquence respective d'instructions pour réaliser une certaine tâche ou certaines tâches. On notera qu'une instruction telle que mentionnée ici désigne une instruction de code machine, c'est-à-dire une instance d'une des instructions fondamentales du jeu d'instructions du processeur, constituée d'un seul code opération et de zéro, ou plus, opérandes. Dans des modes de réalisation, le programme comprend une pluralité de fils de travail, et un sous-programme superviseur qui peut être structuré sous forme d'un ou plusieurs fils superviseurs. Cela va être décrit plus en détail bientôt dans la suite. [0044] Un processeur à fils d'exécution multiples est un processeur capable d'exécuter de multiples fils de programme les uns à côté des autres, typiquement de manière simultanée. Une exécution simultanée signifie que les fils partagent un pipeline d'exécution commun (ou au moins une partie commune d'un pipeline) et que des fils différents sont entrelacés dans ce même pipeline à exécution partagée dans différents créneaux temporels entrelacés clans un cycle répétitif Cela augmente les performances en raison de plus nombreuses opportunités pour cacher la latence du pipeline. Le processeur comprend du matériel qui est commun aux multiples fils d'exécution différents (par exemple une mémoire d'instructions, une mémoire de données et/ou une unité d'exécution en commun) ; mais pour prendre en charge le fonctionnement à fils multiples, le processeur comprend aussi du matériel dédié spécifique à chaque fil. [0045] Le matériel dédié comprend un ensemble séparé de registres de contexte 26 pour au moins chacun des fils qui peuvent être exécutés simultanément, c'est-à-dire un ensemble par créneau dans le cycle. Le mot "contexte", lorsqu'on parle de processeurs à fils d'exécution multiples, fait référence à l'état de programme de l'un respectif des fils en cours d'exécution côte à côte (par exemple valeur de compteur de programme, 9 valeurs de statut et d'opérandes courants). Les registres de contexte font référence aux registres respectifs destinés à représenter cet état de programme du fil respectif. Les registres se trouvant dans un banc de registres sont distincts de la mémoire générale en ce que les adresses des registres sont fixées sous forme de bits dans des mots d'instructions, alors que les adresses mémoire peuvent être calculées en exécutant des instructions. [0046] Dans l'unité de traitement 10, de multiples fils différents parmi les fils provenant de la mémoire d'instructions 12 peuvent être entrelacés dans un seul pipeline d'exécution 13 (bien que typiquement seul un sous-ensemble de la totalité des fils mémorisés dans la mémoire d'instructions puisse être entrelacé à un point donné dans le programme global). L'unité de traitement à fils multiples 10 comprend une pluralité d'ensembles de registres de contexte 26, chaque ensemble 26 étant agencé pour représenter l'état (contexte) d'un fil respectif différent parmi les fils qui peuvent être exécutés simultanément. L'unité de traitement à fils d'exécution multiples 10 comprend aussi un pipeline d'exécution partagé 13, qui est commun aux fils exécutés simultanément, et un ordonnanceur 24 pour planifier les fils d'exécution simultanés pour une exécution à travers le pipeline partagé de manière entrelacée, par exemple à tour de rôle. L'unité de traitement 10 est connectée à une mémoire d'instructions partagée 12 commune à la pluralité de fils, et à une mémoire de données partagée 22 qui est ici encore commune à la pluralité de fils. [0047] Le pipeline d'exécution 13 comprend un étage d'extraction 14, un étage de décodage 16 et un étage d'exécution 18 comprenant une unité d'exécution qui peut réaliser des opérations arithmétiques et logiques, des calculs d'adresses, des opérations de chargement et de stockage, et d'autres opérations, comme définies par l'architecture du jeu d'instructions. [0048] Chaque ensemble de registres de contexte 26 comprend un ou plusieurs registres de commande respectifs comprenant au moins un compteur de programme (PC) pour le fil respectif (pour garder la trace de l'adresse d'instruction à laquelle le fil s'exécute actuellement), et clans des modes de réalisation aussi un ensemble d'un ou plusieurs registres d'état de commande (CSR) enregistrant un statut courant du fil respectif (comme par exemple s'il est actuellement en exécution ou en pause). Chaque ensemble de bancs de registres de contexte 26 comprend aussi un ensemble respectif de registres d'opérandes, pour contenir temporairement des opérandes des instructions exécutées par le fil respectif, c'est-à-dire des valeurs sur lesquelles on opère ou qui résultent d'opérations définies par les codes d'opération des instructions du fil respectif lorsqu'elles sont exécutées. Chaque ensemble de registres 26 peut être mis en oeuvre dans un ou plusieurs bancs de registres. [0049] L'étage d'extraction 14 a accès au compteur de programme (PC) de chacun des contextes. Pour chaque fil respectif, l'étage d'extraction 14 extrait l'instruction suivante de ce fil de l'adresse suivante dans la mémoire de programme 12 comme indiqué par le compteur de programme. Le compteur de programme s'incrémente automatiquement à chaque cycle d'exécution à moins qu'il ne soit dérouté par une instruction de branchement. L'étage d'extraction 14 passe ensuite l'instruction extraite à l'étage de décodage 16 pour qu'elle soit décodée, et l'étage de décodage 16 passe ensuite une indication de l'instruction décodée à l'unité d'exécution 18 accompagnée des adresses décodées des éventuels registres d'opérandes qui sont spécifiés dans l'instruction, afin que l'instruction soit exécutée. L'unité d'exécution 18 a accès aux registres d'opérandes et aux registres d'état de commande, qu'elle peut utiliser dans l'exécution de l'instruction sur la base des adresses de registres décodées, comme dans le cas d'une instruction arithmétique (par exemple en additionnant, en multipliant, en soustrayant ou en divisant les valeurs se trouvant dans deux registres d'opérandes et en fournissant le résultat à un autre registre d'opérande du fil respectif). Ou bien si l'instruction définit un accès à la mémoire (chargement ou stockage), la logique de chargement/stockage de l'unité d'exécution 18 charge une valeur à partir de la mémoire de données dans un registre d'opérande du fil respectif, ou mémorise une valeur provenant d'un registre d'opérande du fil respectif dans la mémoire de données 22, conformément à l'instruction. [0050] L'étage d'extraction 14 est connecté de manière à extraire des instructions à exécuter à partir de la mémoire d'instructions 12, sous le contrôle de l'ordonnanceur 24. L'ordonnanceur 24 est agencé pour contrôler l'étage d'extraction 14 pour extraire une instruction à partir de chacun d'un ensemble de fils s'exécutant simultanément tour à tour dans une séquence répétitive de créneaux temporels, divisant ainsi les ressources du pipeline 13 en une pluralité de créneaux temporels entrelacés dans le temps, comme on va le décrire plus en détail bientôt dans la suite. Par exemple, le schéma d'ordonnancement pourrait être un tour de rôle ou un tour de rôle pondéré. Un autre terme pour désigner un processeur opérant de cette manière est processeur à fils d'exécution en barillet. [0051] Un exemple du schéma d'entrelacement mis en oeuvre par l'ordonnanceur 24 est illustré en figure 2. Ici, les fils simultanés sont entrelacés selon un schéma de tom- de rôle dans lequel, dans chaque tom- du schéma, le tour est divisé en une séquence de créneaux temporels SO, SI, 52...SJ-1 (par exemple 1=4, ou 1=6), chaque créneau étant destiné à exécuter un fil respectif. Typiquement chaque créneau a une longueur égale à un cycle d'exécution et les différents créneaux sont de taille égale, bien que cela ne soit pas nécessairement ainsi dans tous les modes de réalisation possibles, par exemple un schéma de tour de rôle pondéré est aussi possible, schéma dans lequel certains fils obtiennent plus de cycles que d'autres par tour d'exécution. En général l'exécution de fils 11 en barillet peut utiliser un ordonnancement soit à tour de rôle régulier soit à tour de rôle pondéré, dans cc dernier cas la pondération pouvant être fixe ou adaptative. [0052] Quelle que soit la séquence pour chaque tour d'exécution, cc motif se répète ensuite, chaque tour comprenant une instance respective de chacun des créneaux temporels. On notera par conséquent qu'un créneau temporel auquel on fait référence ici désigne l'emplacement alloué de manière répétitive dans la séquence, et non une instance particulière du créneau temporel dans une répétition donnée de la séquence. Dit d'une autre manière, l'ordonnanceur 24 répartit les cycles d'exécution du pipeline 13 dans une pluralité de canaux d'exécution entrelacés dans le temps (multiplexés par séparation temporelle), chacun comprenant une récurrence d'un créneau temporel respectif dans une séquence répétitive de créneaux temporels. Dans le mode de réalisation illustré, il y a quatre créneaux temporels, mais cela n'est que dans un but illustratif et d'autres nombres sont possibles. Par exemple dans un mode de réalisation préféré, il y a en fait six créneaux temporels. [0053] Dans des modes de réalisation, les registres de contexte 26 comprennent un ensemble respectif de registres de contexte de travail CXO... CX(J-1) pour chacun des J fils qui peuvent être exécutés simultanément (J=3 dans l'exemple illustré mais cela n'est pas limitatif), et un banc de registres de contexte de superviseur additionnel, CXS. Les bancs de registres de contexte de travail contiennent les contextes de fils de travail, et le banc de registres de contexte de superviseur contient le contexte d'un fil superviseur. On notera que dans des modes de réalisation le contexte de superviseur comporte un nombre de registres différent de celui de chacun des fils de travail. L'unité de traitement 10 comprend ainsi un banc de registres de contexte 26 de plus qu'il y a de créneaux temporels, c'est-à-dire qu'elle supporte un contexte de plus que le nombre de créneaux temporels entrelacés qu'elle peut gérer pour des fils en barillet. [0054] Chacun des contextes de travail CXO...CXJ est utilisé pour représenter l'état de l'un respectif d'une pluralité de fils de travail affectés actuellement à l'un des J (par exemple quatre) créneaux temporels d'exécution SO...S.J, pour réaliser n'importe quelles tâches de calcul spécifiques d'application que souhaite le programmeur (on notera de nouveau que cela peut seulement être un sous-ensemble du nombre total de fils de travail du programme mémorisé dans la mémoire d'instructions 12). Le contexte additionnel CXS est utilisé pour représenter l'état d'un "fil superviseur" (SV) dont le rôle est de coordonner l'exécution des fils de travail, au moins dans le sens de l'affectation de celui des fils de travail W qui doit être exécuté dans tel ou tel créneau des créneaux temporels SO, SI, S2... et à quel point dans le programme global. Optionnellement, le fil superviseur peut avoir d'autres responsabilités de "superviseur" ou de coordination, comme la réalisation d'échanges externes ou de synchronisations à barrières. On notera bien sûr que le cas illustré de J=4 n'est qu'un exemple de mise en 12 oeuvre dans un but illustratif. Par exemple, dans une autre mise en oeuvre J=6 (six créneaux temporels, six contextes de travail et un contexte de superviseur). [0055] En référence à la figure 3, dans des modes de réalisation le fil superviseur SV ne possède pas son propre créneau par lui-même dans le schéma de créneaux temporels d'exécution entrelacés. Il en est de même pour les fils de travail puisque l'allocation de créneaux à des fils de travail est définie de manière flexible. Au lieu de cela, chaque créneau temporel possède son propre ensemble de registres de contexte pour mémoriser un contexte de travail, qui est utilisé par le fil de travail lorsque le créneau est alloué au fil de travail, mais pas utilisé lorsque le créneau est alloué au superviseur. Quand un créneau donné est alloué au superviseur, ce créneau utilise à la place le banc de registres de contexte CXS du superviseur. Le superviseur a toujours accès à son propre contexte et aucun des fils de travail ne peut occuper le banc de registres de contexte de superviseur CXS. [0056] Le fil superviseur SV a la capacité de s'exécuter dans n'importe lequel et dans tous les créneaux temporels S0....S3 (ou plus généralement SO...SJ-1). L'ordonnanceur 24 est agencé de manière à, lorsque le programme dans son ensemble démarre, commencer par allouer le fil superviseur à la totalité des créneaux temporels, c'est-à-dire qu'ainsi le superviseur SV démarre en s'exécutant dans tous les créneaux 50...SJ-1. Toutefois, le fil superviseur est muni d'un mécanisme pour, à un certain point ultérieur (soit immédiatement soit après avoir réalisé une ou plusieurs tâches de superviseur), abandonner temporairement chacun des créneaux dans lequel il s'exécute à l'un respectif des fils de travail, par exemple initialement les fils de travail WO...W3 dans l'exemple représenté en figure 3 (ou plus généralement WO...WJ-1). Cela est obtenu en faisant exécuter une instruction d'exécution par le fil superviseur, qui prend au moins l'adresse d'un fil de travail dans la mémoire d'instructions 12 comme opérande. Les fils de travail sont des portions de code qui peuvent s'exécuter simultanément entre elles, chacune représentant une ou plusieurs tâches de calcul respectives à réaliser. [0057] L'instruction d'exécution agit sur l'ordonnanceur 24 de manière à abandonner le créneau temporel courant, dans lequel cette instruction est elle-même exécutée, au fil de travail spécifié par l'opérande. On notera qu'il est implicite dans l'instruction d'exécution que c'est le créneau temporel dans lequel cette instruction est exécutée qui est abandonné (implicite dans le contexte d'instructions de code machine signifie qu'il n'y a pas besoin d'opérande pour spécifier cela - c'est sous-entendu de manière implicite d'après le code opération lui-même). Ainsi le créneau temporel qui est abandonné est le créneau temporel dans lequel le superviseur exécute l'instruction d'exécution. [0058] Le fil superviseur SV réalise une opération similaire dans chacun d'un ou plusieurs 13 autres des créneaux temporels, pour abandonner certains ou la totalité de ses créneaux temporels à des fils respectifs différents parmi les fils de travail WO...WJ-1 (sélectionnés dans un ensemble plus grand de fils de travail possibles dans la mémoire d'instructions 12). Une fois qu'il a réalisé cela pour le dernier créneau, le superviseur est suspendu (puis plus tard il va reprendre là où il avait quitté lorsque l'un des créneaux est rendu par un fil de travail W). Le fil superviseur SV est ainsi capable d'allouer des fils de travail différents, chacun réalisant une ou plusieurs tâches, à différents créneaux des créneaux temporels d'exécution entrelacés SO...SJ-1 (par exemple J=4 comme cela est illustré, ou J=6). Lorsque le fil superviseur détermine qu'il est temps d'exécuter un fil de travail, il utilise l'instruction d'exécution pour allouer ce fil de travail au créneau temporel dans lequel l'instruction d'exécution a été exécutée. [0059] Dans certains modes de réalisation, le jeu d'instructions comprend aussi une variante de l'instruction d'exécution, "exécuter tous", ou exécution générale. Cette instruction est utilisée pour lancer un ensemble de plusieurs fils de travail ensemble, tous exécutant le même code. Dans des modes de réalisation cela lance un fil de travail dans chacun des créneaux de l'unité de traitement 50...S3 (ou plus généralement SO.... S(J-1)). [0060] Une fois lancé, chacun des fils de travail alloués actuellement WO...WJ-1 se déroule pour réaliser lesdites une ou plusieurs tâches de calcul définies dans le code spécifié par l'instruction d'exécution respective. À la fin de cela, le fil de travail respectif rend le créneau temporel dans lequel il s'exécute au fil superviseur. Cela est obtenu en exécutant une instruction de sortie dans le fil de travail respectif. L'instruction de sortie agit sur l'ordonnanceur 24 de façon à repasser le créneau temporel courant, dans lequel cette instruction est elle-même exécutée, au fil superviseur. En réponse l'ordonnanceur 24 continue ensuite à exécuter le superviseur dans ce créneau. [0061] La figure 4 illustre en outre d'autres exemples du détail du processeur 4, comprenant le détail de l'unité d'exécution 18 et des registres de contexte 26. Les registres de contexte 26 comprennent un banc de registres principal (MRF) 26M respectif pour chacun des M contextes de travail et pour le contexte de superviseur. Les registres de contexte comprennent en outre un banc de registres auxiliaire (ARF) 26A respectif pour au moins chacun des contextes de travail. Les registres de contexte 26 comprennent en outre un banc de registres de poids commun (WRF) 26W, auquel tous les fils de travail s'exécutant actuellement peuvent accéder en lecture. Le WRF peut être associé au contexte de superviseur en ce que le fil superviseur est le seul fil qui peut écrire dans le WRF. Les registres de contexte 26 peuvent aussi comprendre un groupe respectif de registres d'état de commande pour chacun des contextes de superviseur et de travail (non représenté). L'unité d'exécution 18 comprend une unité de chargement- 14 stockage (LSU) 55, une unité logique et arithmétique en entiers (IALU) 56, et une unité arithmétique en virgule flottante (FPU) 59. [0062] Dans chacun des J créneaux temporels entrelacés SO...SJ-1, l'ordonnanccur 24 contrôle l'étage d'extraction 14 pour extraire au moins une instruction d'un fil respectif à partir dc la mémoire d'instructions 11, pour la mettre dans l'un respectif de J tampons d'instructions (non représentés) correspondant au créneau temporel courant. Dans des modes de réalisation, chaque créneau temporel est un cycle d'exécution du processeur, bien que d'autres schémas ne soient pas exclus (par exemple un tour de rôle pondéré). Dans chaque cycle d'exécution du processeur 4 (c'est-à-dire chaque cycle de l'horloge du processeur qui fournit l'horloge au compteur programme) l'étage d'extraction 14 extrait soit une seule instruction soit un petit "groupe d'instructions" (par exemple, un groupe de deux instructions ou un groupe de quatre instructions), en fonction de la mise en oeuvre. Chaque instruction est ensuite délivrée, via l'étage de décodage 16, à l'un du LSU 55, de l'IALU 56 ou du FPU 59, en fonction du fait que l'instruction (selon son code opération) est une instruction d'accès à la mémoire, une instruction arithmétique en entiers ou une instruction arithmétique en virgule flottante, respectivement. Dans des modes de réalisation, le LSU 55 et l'IALU 56 exécutent leurs instructions en utilisant des registres du MRF 26M, les registres particuliers à l'intérieur du MRF 26M étant spécifiés par des opérandes des instructions. Le FPU 59 réalise des opérations utilisant des registres se trouvant dans les bancs ARF 26A et WRF 26W, où les registres particuliers dans le banc ARE sont spécifiés par des opérandes des instructions. Dans des modes de réalisation, les registres se trouvant dans le WRF peuvent être implicites dans le type d'instruction (c'est-à-dire prédéterminés pour ce type d'instruction). [0063] Chaque contexte de fil de travail possède sa propre instance du banc de registres principal (MRF) 26M et du banc de registres auxiliaire (ARE) 26A (c'est-à-dire un MRF et un ARE pour chacun des créneaux de fils en barillet). La fonctionnalité décrite ici en relation avec le MRF ou l'ARE doit être comprise comme fonctionnant sur la base d'un contexte. Toutefois, dans certains modes de réalisation il y a un seul banc de registres de poids partagé (WRF). Chaque fil peut accéder aux bancs MRF et ARE de seulement son propre contexte 26. Toutefois, tous les fils de travail s'exécutant actuellement peuvent accéder au WRF commun. Le WRF fournit ainsi un ensemble commun de poids destiné à être utilisé par tous les fils de travail. Dans des modes de réalisation, seul le superviseur peut écrire dans le WRF, et les fils de travail peuvent seulement lire dans le WRF. [0064] Le jeu d'instructions du processeur 4 comprend au moins un type d'instruction de chargement dont le code opération, lorsqu'il est exécuté, amène le LSU 55 à charger des données à partir de la mémoire de données 22 dans le banc ARE, 26A, respectif du fil dans lequel les instructions de chargement ont été exécutées. L'emplacement de la destination dans le banc ARE est spécifié par un opérande de l'instruction de chargement. Un autre opérande de l'instruction de chargement spécifie un registre d'adresse dans le MRF, 26M, respectif qui contient un pointeur vers une adresse dans la mémoire de données 22 à partir de laquelle il faut charger les données. Le jeu d'instructions du processeur 4 comprend aussi au moins un type d'instruction de stockage dont le code opération, lorsqu'il est exécuté, amène le LSU 55 à stocker des données dans la mémoire de données 22 à partir du banc ARF respectif du fil dans lequel l'instruction de stockage a été exécutée. L'emplacement de la source du stockage dans le banc ARE est spécifié par un opérande dc l'instruction de chargement. Un autre opérande de l'instruction de chargement spécifie un registre d'adresse dans le MRF, qui contient un pointeur vers une adresse dans la mémoire de données 22, à laquelle il faut stocker la donnée. En général le jeu d'instructions peut inclure des types d'instructions de chargement et dc stockage séparés, et/ou au moins une instruction de chargement-stockage qui combine une ou plusieurs opérations de chargement et/ou une ou plusieurs opérations de stockage en une seule instruction. [0065] Le jeu d'instructions du processeur 4 comprend aussi un ou plusieurs types d'instructions arithmétiques pour réaliser des opérations arithmétiques. Par exemple, cela peut inclure des instructions d'addition, de multiplication, des instructions de logique booléenne, etc. Chaque instruction arithmétique prend un ou plusieurs opérandes de source spécifiant un ou plusieurs registres de source dans l'un des bancs de registres 26 du fil respectif, et un ou plusieurs opérandes de destination spécifiant un ou plusieurs registres de destination dans l'un des bancs de registres 26 du fil respectif. Lorsqu'elle est exécutée, l'instruction arithmétique réalise une opération arithmétique sur une ou plusieurs valeurs d'opérandes de source provenant desdits un ou plusieurs registres de source et place le résultat dans le registre de destination. La ou les valeurs d'opérandes de source ont été chargées dans le ou les registres d'opérandes de source par une ou plusieurs instructions de chargement ou de chargement-stockage précédentes. Le résultat est sauvegardé à partir du ou des registres de destination par une ou plusieurs instructions de stockage ou de chargement-stockage ultérieures. Les instructions arithmétiques comprennent de préférence une ou plusieurs instructions arithmétiques en virgule flottante dont une ou plusieurs valeurs d'opérandes de source sont des valeurs en virgule flottante et dont un ou plusieurs résultats sont des valeurs en virgule flottante. Les instructions arithmétiques en virgule flottante sont exécutées par le FPU 59. Dans des modes de réalisation, le FPU 59 est agencé pour utiliser le banc ARE, 26A, pour les registres de source et de destination des instructions arithmétiques. C'est-à-dire qu'il est implicite (prédéterminé) que les opérandes de source et de destination spécifient un emplacement de registres dans le banc ARE. Dans des 16 modes de réalisation, le jeu d'instructions peut aussi comprendre une ou plusieurs instructions arithmétiques cn entiers qui sont exécutées par l'IALU 56. Dans des modes de réalisation, celles-ci utilisent des registres de source et de destination se trouvant dans le MRF, 26M. [0066] Selon certains modes de réalisation décrits ici, les instructions arithmétiques en virgule flottante peuvent inclure au moins un type qui fait usage du banc de registres de poids commun. WRF, 26W. Cc type d'instruction prend au moins un opérande qui spécifie au moins une source de l'opération arithmétique correspondante dans le banc ARF, 26A, respectif du fil dans lequel l'instruction arithmétique a été exécutée. Toutefois, au moins une autre source de l'instruction arithmétique est dans le WRF commun, commun à tous les fils de travail. De préférence, cette source est implicite dans l'instruction arithmétique en question (c'est-à-dire implicite pour ce type d'instruction arithmétique). Implicite dans le sens d'une instruction de code machine signifie qu'il n'y a pas besoin de spécifier un opérande. C'est-à-dire que dans ce cas, l'emplacement de la source dans le WRF est inhérent d'après le code opération (prédéterminé pour ce code opération particulier). En réponse au code opération, le FPU 59 réalise une opération arithmétique, telle que spécifiée par le code opération, qui comprend d'opérer sur les valeurs se trouvant dans le ou les registres de source spécifiés dans les bancs ARF respectifs des fils et dans le ou les registres de source implicites dans le WRF. Il fournit aussi un résultat de l'opération arithmétique à un registre de destination dans le banc ARF respectif du fil comme spécifié explicitement par un opérande de destination de l'instruction arithmétique. [0067] Des exemples de types d'instructions arithmétiques qui peuvent utiliser une source implicite dans le WRF commun, 26W, peuvent inclure : un ou plusieurs types d'instructions de multiplication vectorielle, un ou plusieurs types d'instructions de multiplication matricielle, un ou plusieurs types d'instructions de multiplication vectorielle à accumulation et/ou types d'instructions de multiplication matricielle à accumulation (qui accumulent un résultat de la multiplication entre une instance donnée de l'instruction et la suivante), et/ou un ou plusieurs types d'instructions de convolution. Par exemple, un type d'instruction de multiplication vectorielle peut multiplier un vecteur d'entrée explicite provenant du banc ARF, 26A, par un vecteur prédéterminé de poids provenant du WRF ; ou un type d'instruction de multiplication matricielle peut multiplier un vecteur d'entrée explicite provenant du banc ARF par une matrice prédéterminée de poids provenant du WRF. Dans un autre exemple, un type d'instruction de convolution peut faire une convolution d'une matrice d'entrée provenant du banc ARF avec une matrice prédéterminée provenant du WRF. Le fait d'avoir un banc de registres de poids partagés, WRF, commun à une pluralité de fils, permet à chaque fil de faire une multiplication ou une convolution entre un noyau 17 commun et ses propres données respectives. Cela est utile puisque c'est un scénario qui survient souvent dans des applications d'apprentissage automatique, par exemple là où chaque fil représente un noeud différent dans un réseau neuronal et où le noyau commun représente une caractéristique qui est recherchée ou pour laquelle on réalise un apprentissage (par exemple une arête ou une forme particulière dans une région ou un volume de données graphiques). [0068] Dans des modes de réalisation, les valeurs se trouvant dans le WRF, 26W, peuvent être écrites par le fil superviseur. Le superviseur (qui dans un mode de réalisation commence par s'exécuter dans tous les créneaux SO...SM) exécute en premier une série d'instructions de mise en place pour écrire les valeurs de certains poids communs dans l'emplacement prédéterminé dans le WRF. Il exécute ensuite des instructions d'exécution (ou une instruction d'exécution générale) pour lancer un fil de travail respectif dans certains ou la totalité des créneaux SO...SJ-1. Chaque fil de travail comprend ensuite une ou plusieurs instances d'une ou plusieurs instructions arithmétiques du ou des types décrits précédemment, de manière à réaliser la ou les opérations arithmétiques correspondantes sur ses propres données d'entrée respectives, chargées dans son banc ARF, 26A, respectif, mais en utilisant les poids communs écrits par le superviseur dans le WRF, 26W. Lorsque chaque fil termine sa tâche respective, il exécute une instruction de sortie pour rendre son créneau au superviseur. Lorsque tous les fils lancés ont terminé leurs tâches respectives, le superviseur peut écrire de nouvelles valeurs dans le WRF et lancer un nouvel ensemble de fils (ou lancer un nouvel ensemble pour continuer à utiliser les valeurs existantes dans le WRF). [0069] On notera que les appellations "principal", "auxiliaire" et "poids" ne sont pas néces- sairement limitatives. Dans des modes de réalisation il peut y avoir un premier banc de registres (par contexte de travail), un deuxième banc de registres (par contexte de travail) et un troisième banc de registres partagé (par exemple faisant partie du contexte de superviseur mais accessible à tous les fils de travail). Le banc ARE 26A et l'unité d'exécution auxiliaire 18 peuvent aussi être appelés banc de registres arithmétiques et unité d'exécution arithmétique puisqu'ils sont utilisés pour des instructions arithmétiques (ou au moins l'arithmétique en virgule flottante). Le MRF 26M et l'unité d'exécution auxiliaire 18 peuvent aussi être appelés banc de registres d'adresses mémoire et unité d'exécution arithmétique puisque l'une de leurs utilisations consiste à accéder à la mémoire. Le banc de registres de poids (WRF) 26W est appelé ainsi car il est utilisé pour contenir des poids multiplicateurs utilisés dans un certain type ou dans certains types d'instructions arithmétiques, qui seront décrits bientôt dans la suite. Par exemple cela poun-ait être utilisé pour représenter les poids de noeuds dans un réseau neuronal. Vu d'une autre manière, le banc MRF pourrait être appelé banc de registres 18 en entiers puisqu'il est utilisé pour contenir des opérandes en entiers, tandis que le banc ARF pourrait être appelé banc de registres en virgule flottante puisqu'il est utilisé pour contenir des opérandes en virgule flottante. Toutefois dans des variantes de réalisation, on notera que l'espace de registres 26 n'est pas nécessairement divisé en ces bancs de registres séparés pour ces différents buts. Au lieu de cela, des instructions exécutées par l'intermédiaire des unités d'exécution principale et auxiliaire peuvent être capables de spécifier des registres dans le même banc de registres partagé (un banc de registres par contexte dans le cas d'un processeur à fils d'exécution multiples). [0070] Dans des modes de réalisation, le processeur 4 peut être connecté avec une ou plusieurs autres instances du processeur et/ou avec des dispositifs externes comme une interface réseau ou un dispositif de stockage attaché à un réseau (NAS). Comme cela est illustré en figure 5, dans des modes de réalisation le processeur 4 peut constituer l'un des pavés d'une matrice 6 de pavés processeurs interconnectés, chaque pavé exécutant une partie d'un programme plus large. Les processeurs individuels 4 (pavés) constituent ainsi une partie d'un processeur ou d'un système de traitement plus large 6. Les pavés 4 peuvent être interconnectés entre eux via un sous-système d'interconnexion 34. Les pavés 4 peuvent être mis en oeuvre sur la même puce (c'est-à-dire la même puce élémentaire) ou sur des puces différentes, ou dans une combinaison (c'est-à-dire que la matrice peut être constituée de multiples puces comprenant chacune de multiples pavés 4). Le système d'interconnexion 34 et l'interface d'échange 51 peuvent par conséquent comprendre un mécanisme d'interconnexion interne (sur la puce) et/ou un mécanisme d'échange externe (entre puces), en conséquence. [0071] Dans un exemple d'application d'un processeur ou d'un système à fils d'exécution multiples et/ou à pavés multiples, le programme exécuté à travers les multiples fils et/ ou pavés 4 comprend un algorithme d'intelligence artificielle, comme un algorithme agencé pour réaliser l'apprentissage d'un réseau neuronal et/ou pour réaliser des inférences sur la base d'un réseau neuronal. Dans de tels modes de réalisation chaque fil de travail, ou la partie du programme exécutée sur chaque pavé, ou chaque fil de travail sur chaque pavé, est utilisé pour représenter un noeud 102 différent dans un réseau neuronal (un type de graphe) ; et des communications entre fils et/ou pavés, en conséquence, représentent des arêtes 104 entre des noeuds 102 dans le graphe. Cela est illustré en figure 6. [0072] L'intelligence artificielle commence par une étape d'apprentissage dans laquelle l'algorithme d'intelligence artificielle apprend un modèle de connaissance. Le modèle comprend un graphe de noeuds interconnectés (c'est-à-dire des sommets) 102 et d'arêtes (c'est-à-dire des liaisons) 104. Chaque noeud 102 du graphe comporte une ou plusieurs arêtes d'entrée et une ou plusieurs arêtes de sortie. Certaines des arêtes 19 d'entrée de certains des noeuds 102 sont les arêtes de sortie de certains autres noeuds, connectant ainsi entre eux les noeuds pour former le graphe. En outre, une ou plusieurs des arêtes d'entrée d'un ou plusieurs des noeuds 102 constituent les entrées du graphe dans son ensemble, et une ou plusieurs des arêtes de sortie d'un ou plusieurs des noeuds 102 constituent les sorties du graphe dans son ensemble. Parfois, un noeud donné peut même comporter tous ces éléments : des entrées du graphe, des sorties du graphe et des connexions à d'autres noeuds. Chaque arrête 104 communique une valeur ou plus souvent un tenseur (une matrice à n dimensions), cela constituant les entrées et les sorties fournies aux noeuds et reçues des noeuds 102 sur leur arrêtes d'entrée et de sortie respectivement. [0073] Chaque noeud 102 représente une fonction de son ou de ses entrées reçues sur son arrête ou ses arrêtes d'entrée, le résultat de cette fonction étant la ou les sorties fournies sur l'arrête ou les arrêtes de sortie. Chaque fonction est paramétrée par un ou plusieurs paramètres respectifs (parfois appelés poids, bien qu'ils n'aient pas besoin nécessairement d'être des poids multiplicateurs). En général, les fonctions représentées par les différents noeuds 102 peuvent prendre différentes formes de fonctions et/ou peuvent être paramétrécs par différents paramètres. [0074] En outre, chacun desdits un ou plusieurs paramètres de chaque fonction d'un noeud est caractérisé par une valeur d'erreur respective. En outre, une condition respective peut être associée à l'erreur ou aux erreurs dans le ou les paramètres de chaque noeud 102. Pour un noeud 102 représentant une fonction paramétrée par un seul paramètre, la condition peut être un simple seuil, c'est-à-dire que la condition est satisfaite si l'en-eur se trouve dans les limites (lu seuil spécifié mais n'est pas satisfaite si l'erreur est au-delà du seuil. Pour un noeud 102 paramétré par plus qu'un seul paramètre respectif, la condition pour que ce noeud 102 ait atteint un niveau d'erreur acceptable peut être plus complexe. Par exemple, la condition peut être satisfaite seulement si chacun des paramètres de ce noeud 102 se trouve dans les limites du seuil respectif. Dans un autre exemple, une métrique combinée peut être définie comme combinant les erreurs dans les différents paramètres pour le même noeud 102, et la condition peut être satisfaite à condition que la valeur de la métrique combinée se trouve dans les limites d'un seuil spécifié, mais autrement la condition n'est pas satisfaite si la valeur de la métrique combinée est au-delà du seuil (ou vice versa en fonction de la définition de la métrique). Quelle que soit la condition, cela donne une mesure indiquant si l'erreur dans le ou les paramètres du noeud descend en dessous d'un certain niveau ou degré d'acceptabilité. En général on peut utiliser toute métrique appropriée. La condition ou la métrique peut être la même pour tous les noeuds, ou peut être différente pour certains noeuds respectifs différents parmi les noeuds. [0075] Dans l'étape d'apprentissage l'algorithme reçoit des données expérimentales, c'est-à-dire de multiples points de données représentant différentes combinaisons possibles d'entrées dans le graphe. Au fur et à mesure que des données expérimentales sont reçues, l'algorithme ajuste progressivement les paramètres des divers noeuds 102 du graphe sur la base des données expérimentales de manière à essayer de minimiser les erreurs dans les paramètres. Le but est de trouver des valeurs des paramètres telles que la sortie du graphe soit aussi proche que possible d'une sortie souhaitée pour une entrée donnée. Lorsque le graphe dans son ensemble tend vers un tel état, on dit que le graphe converge. Après l'obtention d'un degré de convergence approprié, le graphe peut être utilisé pour réaliser des prédictions ou des inférences, c'est-à-dire pour prédire un résultat pour certaines entrées données ou pour inférer une cause pour une sortie donnée. [0076] L'étape d'apprentissage peut prendre un certain nombre de formes possibles dif- férentes. Par exemple, dans une approche supervisée, les données expérimentales d'entrée prennent la forme de données d'apprentissage, c'est-à-dire d'entrées qui correspondent à des sorties connues. Avec chaque point de données, l'algorithme peut ajuster les paramètres de telle sorte que la sortie concorde le plus précisément possible avec la sortie connue pour l'entrée donnée. Dans l'étape de prédiction ultérieure, le graphe peut alors être utilisé pour [-napper une interrogation d'entrée sur une sortie prédite approximative (ou vice versa si on réalise une inférence). D'autres approches sont aussi possibles. Par exemple, dans une approche non supervisée, il n'y a pas de concept de résultat de référence pour chaque donnée d'entrée, et au lieu de cela on laisse l'algorithme d'intelligence artificielle identifier sa propre structure dans les données de sortie. Ou dans une approche par renforcement, l'algorithme essaye au moins une sortie possible pour chaque point de données dans les données expérimentales, et on lui indique si sa sortie est positive ou négative (et potentiellement un degré avec lequel elle est positive ou négative), par exemple gagné ou perdu, ou récompense ou cout, ou similaire. Sur de nombreux essais, l'algorithme peut progressivement ajuster les paramètres du graphe pour être capable de prédire des entrées qui vont conduire à un résultat positif. Les diverses approches et divers algorithmes pour l'apprentissage d'un graphe sont connus de l'homme de l'art de l'apprentissage automatique. [0077] Selon un exemple d'application des techniques décrites ici, chaque fil du travail est programmé pour réaliser les calculs associés à un noeud individuel respectif parmi les noeuds 102 dans un graphe d'intelligence artificielle comme un réseau neuronal. Dans ce cas, au moins certaines des arêtes 104 entre les noeuds 102 correspondent aux échanges de données entre des fils, et certaines peuvent impliquer des échanges entre des pavés. Dans le cas d'un agencement multi-pavé 6 avec plusieurs fils par pavé 4, chaque pavé 4 exécute un sous-graphe du graphe. Chaque sous-graphe comprend un 21 sous-programme superviseur comprenant un ou plusieurs fils superviseurs, et un ensemble de fils de travail représentant les noeuds 102 du sous-graphe respectif [0078] La figure 7 illustre un exemple de mise en oeuvre d'un mécanisme de cache de ré- pétition avantageux en accord avec des modes de réalisation de la présente description. Celui-ci peut trouver une application dans l'apprentissage automatique, mais n'est pas limité à de telles applications. Le mécanisme est basé sur le fait de prévoir une instruction de répétition ("rpt") dans le jeu d'instructions du processeur 4. La fonctionnalité de l'instruction de répétition est agencée de telle sorte que non seulement a) un premier fil qui l'exécute met en mémoire cache une portion de son propre code et répète cette portion de code, niais aussi 11) le fil suivant qui exécute l'instruction de répétition va aussi répéter la portion de code mise en mémoire cache à partir du premier fil. Ainsi le même code peut être réutilisé et dupliqué dans de multiples fils sans réextraction dans la mémoire 12. Dans des modes de réalisation, le même code est réutilisé dans plusieurs fils différents dont chacun opère sur ses propres valeurs d'opérandes respectives dans son propre banc de registres 26 respectif, par exemple son propre banc ARF, 26A, respectif. [0079] Les inventeurs ont identifié qu'il apparaît des opportunités dans les domaines de l'apprentissage automatique et des réseaux neuronaux pour réutiliser du code entre les fils, dans le cas où chaque fil représente un noeud respectif différent dans un graphe (par exemple un réseau neuronal) et où certains des noeuds réalisent une partie ou la totalité des mêmes processus de calcul. Par exemple, les fils représentant certains noeuds peuvent réaliser une ou plusieurs des mêmes opérations sur leur propres données d'entrée respectives. En fait, dans certains cas, les fils de certains noeuds peuvent réaliser la même opération sur certaines des mêmes valeurs d'opérandes communes entre eux, mais aussi sur certains autres opérandes qui sont spécifiques au fil individuel. Un exemple serait une multiplication vectorielle ou matricielle réalisée en tant que partie d'une convolution, par laquelle l'instruction dans chaque fil multiplie un ensemble commun de poids (partagé entre des fils) par des données d'entrées qui sont spécifiques au fil individuel. Cela peut survenir dans un réseau neuronal de convolution où de nombreux noeuds comprennent en fait les mêmes poids mais avec des connexions différentes. Chaque fil peut être agencé pour réaliser le traitement d'un noeud respectif diffèrent dans le réseau neuronal, comme la convolution d'un noyau commun de poids avec des données d'entrée respectives pour détecter un certain élément caractéristique. [0080] Dans de tels scénarios, il serait avantageux de prévoir un mécanisme permettant qu'une portion de code provenant d'un fil soit réutilisée dans un ou plusieurs autres fils sans que chaque fil ait à le ré-extraire séparément de la mémoire, réduisant ainsi la consommation d'énergie dans des scénarios ou des fils réalisent une partie ou la totalité des mêmes opérations. Par exemple cela peut être utilisé dans des scénarios où les mêmes opérations doivent être réalisées par chaque fil sur une combinaison d'un ou plusieurs opérandes de poids communs partagés entre des fils et d'un ou plusieurs opérandes spécifiques au fil respectif individuel. [0081] L'avantage de la mémoire cache de répétition dans de tels scénarios est que des ex- tractions d'instructions de la mémoire 12 sont coûteuses en ce qui concerne l'énergie. Par exemple, puisque de nombreuses boucles intérieures dans des applications comme les réseaux neuronaux (ces boucles qui sont utilisées pour la convolution par exemple) sont petites (une poignée d'instructions ou de groupes), et puisque il est courant que des fils de travail exécutent ces mêmes boucles, cela offre l'opportunité d'économies d'énergie en mettant en oeuvre un petit cache 31 local et performant en énergie à l'intérieur du pavé 4. Ainsi plutôt que tous les fils de travail réalisent des extractions coûteuses dans la mémoire, pour le même code, ils peuvent utiliser à la place la mémoire cache qui est plus économe en énergie. [0082] Comme cela est représenté en figure 7, selon la présente description le processeur 4 comprend une mémoire cache d'instructions comprenant au moins une mémoire cache de répétition 31. La mémoire cache de répétition 31 comprend une région de stockage temporaire 33 pour contenir temporairement une pluralité d'instructions mises en mémoire cache dans l'ordre. La mémoire cache de répétition 31 comporte aussi des moyens 35 associés pour enregistrer un état de la mémoire cache, l'état comprenant au moins un enregistrement indiquant si la mémoire cache est ou non actuellement "réclamée" (ou "appropriée") par l'un des fils. La signification de cela sera précisée bientôt dans la suite. L'état 35 peut être mis en oeuvre sous forme d'un état interne de la mémoire cache de répétition 31 (c'est-à-dire un circuit matériel sous la forme (l'une ou plusieurs bascules internes). En variante, l'état 35 pourrait être mis en oeuvre sous forme d'un registre clans un banc de registres, par exemple sous forme d'un registre d'état de commande 28 de l'un des contextes comme le contexte superviseur. [0083] L'étage d'extraction d'instructions 14 du pipeline 13 peut être actionné pour extraire des instructions soit à partir de la mémoire d'instructions 12 soit de la mémoire cache de répétition 31. Le choix de la source d'instructions qui est utilisée à un instant donné dépend de l'instruction de répétition et de ses opérandes, comme on va le décrire plus en détail bientôt dans la suite. [0084] Comme cela est illustré en figure 7, chacun des J fils de travail qui peut être exécuté simultanément est alloué à un ensemble respectif différent parmi une pluralité de J ensembles de registres de contexte 26(CX0...CXJ-1), chaque ensemble étant agencé pour contenir l'état de programme de son fil de travail respectif. Dans des modes de réalisation, un ensemble additionnel de registres de contexte 26(CXS) est prévu pour contenir l'état de programme du fil superviseur. Chaque ensemble de registres de 23 contexte comprend un compteur de programme respectif (PC) 21 pour contenir la valeur de PC courante du fil respectif. Le pointeur de programme spécifie le point courant dans le code respectif du fil à partir duquel ses instructions doivent être extraites. Chaque ensemble de registres de contexte comprend aussi des registres d'opérandes 32 pour contenir temporairement des opérandes sur lesquels agissent les instructions du fil respectif. Les registres d'opérandes 32 de chaque fil de travail peuvent comprendre les bancs MRF 26M et ARF 26A du fil respectif Les registres d'opérandes 32 du superviseur peuvent comprendre le WRF 26W. Chaque ensemble de registres de contextes peut en outre comprendre un ou plusieurs registres d'état de commande (CRS) 28 respectifs pour enregistrer un statut du fil respectif, comme par exemple s'il est actuellement en pause. [0085] Pour chaque fil, le pipeline 13 commence en extrayant et en exécutant des ins- tructions à partir de la mémoire d'instructions 12 conformément à son compteur de programme (PC) respectif Dans des modes de réalisation préférés l'instruction de répétition (rpt) a la syntaxe suivante : [0086] Rpt $size, $count [0087] C'est-à-dire qu'elle prend deux opérandes : un opérande de taille de répétition spécifiant la taille d'une portion de code de répétition et un opérande de compte de répétition spécifiant un nombre de fois avec lequel la portion doit être répétée. Dans des modes de réalisation, ces opérandes spécifient leurs valeurs respectives en faisant référence à un registre. C'est-à-dire que la valeur incluse directement dans le champ d'opérande de l'instruction identifie un registre $size ou Scount, par exemple dans le banc MRF 26M du fil respectif, à partir duquel il faut prendre la taille de répétition ou la valeur de compte de répétition effective, respectivement. Toutefois en variante, l'un ou l'autre ou les deux pourraient être des opérandes immédiats (c'est-à-dire que les valeurs de taille de répétition et/ou de compte de répétition sont codées directement dans le champ (l'opérande concerné de l'instruction de répétition). [0088] En fonctionnement, l'unité d'exécution 18 et l'étage d'extraction 14 sont agencés pour fonctionner de la manière suivante en réponse à l'instruction de répétition. Le premier fil qui va exécuter rpt $size, $count va réclamer la mémoire cache de répétition 31. Cela peut aussi être décrit comme un verrouillage de la mémoire cache de répétition 31, ou une "appropriation" de la mémoire cache de répétition. En pratique, cela signifie que l'unité d'exécution 18 positionne l'état 35 de la mémoire cache de répétition 31 pour marquer qu'elle est réclamée. Après cela, tout fil de travail ultérieur qui va exécuter l'instruction de répétition ne pourra pas réclamer la mémoire cache de répétition jusqu'à ce que l'état 35 soit réinitialisé (voir ci-après). [0089] Lorsqu'un fil de travail exécute le rpt, cette instruction informe la logique de l'extracteur d'instructions 14 qu'il faut chercher les extractions d'instructions dans la 24 mémoire cache de répétition. L'exécution de l'instruction de répétition dans le premier fil de travail va amener l'unité d'exécution 18 à remplir la mémoire cache de répétition 31 avec les N instructions ou groupes d'instructions suivants de cc fil immédiatement à la suite dc la position de l'instruction de répétition dans le code, N étant spécifié dans $size (à moins que $size soit plus grand que la capacité de la mémoire cache de répétition, auquel cas seule la première partie du corps de répétition est mémorisée dans la mémoire cache de répétition 31). L'unité d'exécution 18 exécute aussi ces instructions une première fois pendant qu'elles sont mises en mémoire cache. Ensuite, immédiatement après la fin de la portion de N instructions, l'étage d'extraction 14 est amené à revenir en arrière et à commencer d'extraire le code de la région de stockage 33 de la mémoire cache d'instructions 31, et la portion de code mise en mémoire cache est ensuite répétée à partir de là, un certain nombre de fois comme spécifié par $count. Cela peut impliquer de dérouter le compteur de programme PC 21 du fil respectif Après la fin de la dernière répétition, le programme va continuer à partir du point situé immédiatement à la suite de la portion de code mise en mémoire cache. [0090] Si une autre instance de l'instruction de répétition est exécutée en tant que partie d'un deuxième des fils de travail pendant que la mémoire cache de répétition est encore réclamée (verrouillée) d'après son état 35, alors l'exécution de l'instruction de répétition amène l'unité d'exécution 18 à réaliser une fonctionnalité différente par rapport au deuxième fil. C'est-à-dire que l'étage d'extraction 14 est contrôlé pour commencer à extraire la portion de code mise en mémoire cache à partir de la région de stockage 31 de la mémoire cache d'instructions 31 (la portion de code qui était mise en mémoire cache provenant du premier fil). Il va ensuite répéter l'exécution de cette portion de code mis en mémoire cache, mais un nombre de fois spécifié par l'opérande Scount respectif du deuxième fil de travail. [0091] Ainsi l'instruction de répétition assure un mécanisme de boucle à surcharge nulle, amenant la séquence ultérieure d'instructions ou de groupes d'exécution (le corps de répétition) à être exécutée de manière répétée. Le compte de répétition peut être prévu sous forme d'une valeur immédiate ou d'une valeur de source non signée d'un registre. La taille du corps de répétition est exprimée par un nombre total d'instructions ou de groupes d'exécution et est fournie par une valeur immédiate (par exemple la taille du corps de répétition étant (immédiate +1) dans l'exécution). [0092] On notera que la consultation de la mémoire cache de répétition peut encore échouer de deux manières. La première manière survient si le deuxième fil de travail a exécuté une instance différente de l'instruction de répétition (résidant dans un emplacement différent en mémoire) et par conséquent le corps de la boucle de répétition n'est pas dans la mémoire cache 31. Dans ce cas, la logique d'extraction d'instructions 14 va rapporter qu'il faut extraire à partir de la mémoire 12. La deuxième manière survient si la longueur du corps de répétition dépasse la capacité de la mémoire cache de répétition auquel cas l'extrémité de queue du corps de répétition ne sera pas trouvée dans la mémoire cache de répétition et l'extraction à partir de la mémoire d'instructions 12 devra encore être effectuée. [0093] La mémoire cache de répétition 31 assure un petit cache d'instructions (essentiellement) invisible dans l'architecture, ayant pour but de réduire la charge de code et ainsi la consommation d'énergie pendant, par exemple, des boucles intérieures de noyau à forte intensité de calcul, en particulier lorsque plusieurs contextes de travail réalisent la même tâche. La mémoire cache 31 est partagée entre des contextes de travail, et dans des modes de réalisation est réservée spécifiquement à seulement des instructions ou des groupes en mémoire cache dans les corps de répétition d'instances de l'instruction de répétition. [0094] Dans des modes de réalisation, la région de stockage 33 de la mémoire cache de ré- pétition est constituée d'un certain nombre de lignes indépendantes, chacune ayant la même taille qu'une instruction (dans le cas d'émission d'instructions individuelles) ou qu'un groupe d'instructions (dans le cas où le processeur 4 exécute des groupes d'instructions émises conjointement). Chaque ligne peut être soit valide soit non valide. Toutes les lignes sont initialement non valides. Dans des modes de réalisation, puisque les groupes d'exécution sont dans les corps de répétition de l'instruction de répétition, ces groupes doivent de préférence aussi être alignés dans la mémoire de pavé (par exemple alignés sur 8 multiplets). [0095] La mémoire cache de répétition 31 est soit verrouillée soit non verrouillée. Lorsqu'elle est non verrouillée (l'état initial), la mémoire cache de répétition devient verrouillée comme effet collatéral du fait qu'un fil de travail (le contexte de verrouillage) exécute une instance de l'instruction de répétition. Si la mémoire cache de répétition 31 est déjà verrouillée lorsqu'un contexte de travail exécute une instruction de répétition, aucune autre action n'est entreprise en ce sens. [0096] Il existe au moins deux possibilités pour mettre en oeuvre le mécanisme de réinitia- lisation de l'état 35 afin que la réclamation (le verrouillage) de la mémoire cache de répétition puisse être libérée de nouveau. [0097] La première possibilité est que, lorsque le fil de travail qui possède la mémoire cache de répétition exécute la toute dernière instruction dans la boucle de répétition, la mémoire cache de répétition 31 soit déverrouillée et que toutes les lignes 33 soient marquées comme non valides. Tous les autres contextes de travail utilisant actuellement la mémoire cache de répétition 31 vont maintenant extraire le code de la mémoire 12 plutôt que de la mémoire cache de répétition 31. Cela nécessite un moyen pour enregistrer quel fil de travail (ou plutôt quel contexte, ou quel créneau) a réclamé la mémoire cache d'instructions 31 (c'est-à-dire lequel a provoqué son verrouillage). 26 Cela pourrait être mis en oeuvre sous forme d'un état dans l'état interne de la mémoire cache 31, ou dans un registre dans l'un des bancs de registres 26. [0098] La deuxième alternative, préférée, est qu'un drapeau 41 soit tenu à jour pour chaque contexte (chacun des fils simultanés, ou chacun des créneaux). Par exemple, cela peut être mis en oeuvre dans l'un des registres d'état de commande 28 du contexte respectif. Une fois que la mémoire cache de répétition est verrouillée, le drapeau est positionné pour chaque fil de travail qui utilise (concordance trouvée) la mémoire cache de répétition. À chaque fois qu'un contexte exécute la dernière instruction de sa boucle de répétition, si le seul drapeau qui est positionné est celui que possède ce fil (c'est-à-dire si tous les autres drapeaux sont effacés), alors la mémoire cache de répétition 31 est déverrouillée. De toute manière le drapeau 41 que possède ce fil est effacé. C'est-à-dire que lorsque le dernier contexte qui utilise la mémoire cache de répétition termine sa boucle de répétition, la mémoire cache de répétition 31 est déverrouillée. [0099] On notera que lorsqu'on dit quel fil réclame la mémoire cache 31, cela signifie lequel des fils simultanés, c'est-à-dire quel fil actuellement alloué à l'un des créneaux temporels et à l'ensemble associé de registres de contextes 26. De manière équivalente on peut dire lequel des contextes 26 ((CX0...CXJ-1)) réclame la mémoire cache, ou lequel des créneaux 50...S:1-1 réclame la mémoire cache. Le terme "contexte" est parfois aussi utilisé dans la technique comme raccourci pour l'ensemble des registres 26 contenant le contexte (dans le sens de l'état de programme), ou pour le créneau dans lequel le fil respectif s'exécute ; ou même pour l'ensemble complet comprenant fil, créneau, état de programme et registres de contexte. [0100] Le fait de ven-ouiller la mémoire cache de répétition 31 lance une opération de rem- plissage de la mémoire cache. C'est-à-dire que lorsqu'elle est verrouillée, l'exécution de chaque instruction ou groupe d'exécution successif en tête du corps de répétition du contexte de verrouillage provoque : i) (l'une seule ligne à cette adresse d'instruction ou de groupe, ii) l'écriture des données de l'instruction ou du groupe d'exécution dans la ligne allouée, et iii) la mise de la ligne à l'état valide. Si la taille du corps de répétition est supérieure à la capacité de la mémoire cache de répétition, seuls les groupes d'exécution situés en tête du corps de répétition sont mis dans la mémoire cache. [0101] Lorsqu'elle est verrouillée, la mémoire cache de répétition redevient déverrouillée lorsque la valeur de $count (du contexte de verrouillage) passe à 0 (premier mécanisme de réinitialisation), ou lorsque le drapeau concerné est effacé (deuxième mécanisme de réinitialisation). Pour tous les contextes de travail, lorsque Scount est non nul (c'est-à-dire lorsque le fil de travail exécute un corps de répétition), le mécanisme d'extraction d'instructions va vérifier la présence d'une ligne valide allouée à l'adresse de l'instruction ou du groupe d'exécution et dans le cas d'une concordance de cache, 27 va utiliser le contenu de la ligne de cache plutôt que de réaliser une extraction à partir de la mémoire du pavé. [0102] Dans des modes de réalisation, si le compte de répétition est initialement à zéro, l'instruction de répétition va agir comme un déroutement par-dessus le corps de répétition. Sinon, les groupes d'exécution de corps de répétition ultérieurs vont être exécutés Scount fois. [0103] Dans des modes de réalisation qui exécutent des groupes d'instructions délivrées conjointement, toute instruction émise conjointement avec l'instruction de répétition est exécutée seulement une fois, et ne fait pas partie du corps de répétition. [0104] Dans des modes de réalisation, il se peut qu'il ne soit pas autorisé d'exécuter certains types d'instructions dans un corps de répétition. Dans ce cas, une exception sera signalée en cas de tentative d'exécution d'une telle instruction. [0105] On notera que les modes de réalisation susmentionnés ont été décrits seulement à titre d'exemple. [0106] Par exemple, dans des variantes de réalisation, la syntaxe de l'instruction de ré- pétition ne nécessite pas obligatoirement un opérande de taille de répétition. À la place, la taille de la portion mise en mémoire cache pourrait être fixe (implicite) ou spécifiée par un autre élément d'état, par exemple un paramètre de la mémoire cache de répétition réglé par le superviseur. On notera aussi que la taille du corps de répétition ne doit pas obligatoirement concorder avec la taille de la mémoire cache de répétition. [0107] Ou dans des mises en oeuvre plus complexes, les instructions mises en mémoire cache (corps de répétition) ne commencent pas nécessairement à l'instruction ou au groupe suivant immédiatement l'instruction de répétition. Par exemple, à la place la syntaxe de l'instruction de répétition pourrait permettre de spécifier un point de démarrage et de terminaison du corps de répétition. Ou dans un autre exemple, le processeur pourrait mettre en mémoire cache de manière continuelle les dernières M instructions dans un mode de rouleau, puis l'opérande de compte de répétition pouffait amener les N dernières instructions précédant l'instruction de répétition à être mises en mémoire cache. C'est-à-dire que instruction de répétition pouffait être exécutée après, plutôt qu'avant le corps de la boucle. [0108] Dans d'autres variantes ou dans des variantes additionnelles, le processeur 4 n'a pas obligatoirement besoin d'un mécanisme matériel dédié 41 pour réinitialiser la réclamation de la mémoire cache de répétition 31 (c'est-à-dire pour déverrouiller la mémoire cache de répétition). Dans des variantes de réalisation, la réinitialisation pourrait être faite explicitement par du logiciel se trouvant dans l'un des fils de travail ou dans le superviseur, par exemple en exécutant une instruction de mise en place pour écrire dans un registre relié au cache de répétition comme le 35 dans le cas où il est mis en oeuvre sous forme (l'un registre pouvant être écrit dans le banc de registres). 28 [0109] En outre, le domaine de la présente description est l'architecture décrite pré- cédemment dans laquelle un contexte séparé est prévu pour le fil superviseur, ou dans laquelle le fil superviseur s'exécute dans un créneau puis abandonne son créneau à un fil de travail. Le superviseur pourrait à la place utiliser un contexte d'usage général. Ou dans un autre agencement par exemple, le superviseur pourrait s'exécuter dans son propre créneau dédié. En outre, la mise en oeuvre n'est pas limitée au fait que certains fils spécifiques parmi les fils n'aient même un rôle de superviseur. En outre, le domaine de la description n'est pas limité au fait que le processeur 4 soit un pavé dans une matrice de pavés. Dans des variantes de réalisation le processeur 4 pourrait par exemple être un processeur autonome ou un processeur en une seule puce. [0110] La mise en oeuvre n'est pas limitée à des bancs MRF et ARF séparés. Elle n'est pas limitée non plus à un WRF séparé. En général, les registres pourraient être pris dans l'un quelconque d'un ou plusieurs bancs de registres, qui pourraient être partagés entre différents accès mémoire et différentes opérations arithmétiques, ou séparés. [0111] En outre, le domaine de la description n'est pas limité à des applications d'apprentissage automatique. Il y a de nombreuses autres applications où l'on peut souhaiter réutiliser du code entre des fils afin de réduire la charge de code et améliorer ainsi la densité du code. [0112] D'autres variantes ou d'autres cas d'utilisation des techniques décrites peuvent ap- paraître à l'homme de l'art une fois donnée la description faite ici. Le domaine de la description n'est pas limité par les modes de réalisation déctits mais seulement par les revendications jointes. 29 [Revendication I]