FR 3091937 A1 20200724 FR 1906116 A 20190607 Description Titre de l'invention : INSTRUCTION DE DOUBLE CHARGEMENT Domaine technique [0001] La présente description concerne une instruction de chargement qui réalise deux opérations de chargement en réponse à un seul code opération. 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 plaee 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 étape ultérieure, le modèle appris peut alors être utilisé pour faire des prédictions de 2 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] Le jeu d'instructions d'un processeur désigne l'ensemble de types fondamentaux d'instructions de code machine pour l'exécution desquelles l'unité d'exécution du processeur est agencée. Chaque instruction de code machine comprend un opérande et zéro, ou plus, champs d'opérandes pour prendre zéro, ou plus, opérandes respectifs. Chaque type d'instruction de code machine du jeu d'instructions est caractérisé par un code opération respectif différent qui déclenche une logique différente dans l'unité d'exécution pour réaliser un type respectif différent d'opération lors de son exécution. [0005] Une manière de personnaliser la conception d'un processeur pour qu'il soit adapté à une application particulière, comme l'intelligence artificielle, est de prévoir un ou plusieurs types dédiés d'instructions dans le jeu d'instructions du processeur pour réaliser des types d'opérations qui ont tendance à survenir souvent dans l'application en question. Par exemple, si l'application nécessite souvent qu'un type particulier de fonction arithmétique soit réalisé (par exemple une multiplication matricielle), qui autrement devrait être construit à partir d'une séquence d'instructions de code machine plus simples (par exemple des additions et des multiplications scalaires), alors la nouvelle conception pour le processeur spécifique d'application pourrait inclure une instruction dans le jeu d'instructions qui à la place réalise cette fonction arithmétique en réponse au seul code opération et aux opérandes associés d'une seule instance d'une seule instruction de code machine. Résumé de l'invention [0006] Un problème à prendre en compte lors d'un traitement de données dans des ap- plications telles que l'intelligence artificielle est l'aspect épars des données. C'est-à-dire que, dans certains ensembles de données, il peut n'y avoir qu'un nombre relativement petit des valeurs de données contenant des informations utiles ou pertinentes. Pour traiter efficacement de telles données, il serait souhaitable de ne charger que ces valeurs-là à partir de la mémoire. Toutefois, le motif des données pertinentes est effectivement aléatoire. C'est au programme de décider quelles valeurs de données doivent être chargées. Pour réaliser cela de manière efficace, un pas de progression programmable peut être inclus dans la fonctionnalité implicite d'une instruction de chargement. C'est-à-dire que, à chaque instruction de chargement, l'instruction applique aussi une valeur de pas de progression à l'adresse de chargement (typiquement après le chargement de la valeur courante, c'est-à-dire qu'ainsi l'adresse est post-incrémentée pour l'instruction de chargement suivante). Cette valeur de pas peut être rendue programmable, en étant placée dans un registre programmable du processeur. 3 [0007] En revanche, alors que certaines données peuvent être éparses, un autre ensemble de valeurs qui est utilisé côte à côte avec les données éparses dans la même application peut être systématique. C'est-à-dire que le programme a besoin de charger chaque valeur à partir d'une plage d'adresses contiguës en mémoire (ou au moins les valeurs prises à intervalles réguliers dans l'espace d'adressage dc la mémoire). Un exemple de cela se trouve dans un réseau neuronal, où le programme a besoin de charger à la fois des poids du réseau neuronal (systématiques) et des données sur lesquelles doit agir le réseau neuronal (typiquement éparses). [0008] Afin de traiter efficacement de telles données, on admet ici qu'il serait souhaitable de prévoir un type d'instruction de chargement muni d'une fonctionnalité d'adressage "set-ni-éparse". C'est-à-dire qu'une instruction de chargement réalise deux instructions de chargement dans une seule instruction de code machine, chacune ayant un comportement différent. Pour s'occuper d'un premier ensemble de valeurs systématiques comme des poids, le premier chargement incrémente la première adresse de chargement systématiquement d'un pas fixe à chaque instance de l'instruction exécutée ; mais pour s'occuper d'un ensemble de données éparses qui est traité en parallèle avec la première opération, la deuxième opération de chargement incrémente la deuxième adresse de chargement d'une valeur de pas programmable à chaque instance de l' instruction. [0009] Par conséquent, selon un premier aspect décrit ici, il y a un processeur comprenant une unité d'exécution, de la mémoire et un ou plusieurs bancs de registres. L'unité d'exécution est agencée pour exécuter des instances d'instructions de code machine provenant d'un jeu d'instructions. Les types d'instructions définis dans le jeu d'instructions comprennent une instruction de double chargement pour charger à partir de la mémoire dans au moins l'un (lesdits un ou plusieurs bancs de registres. L'unité d'exécution est agencée de manière à, lorsque l'instruction de chargement est exécutée, réaliser une première opération de chargement à progression à pas fixe, et une deuxième opération de chargement à progression à pas variable, le pas variable étant spécifié dans un registre de pas variable dans l'un desdits un ou plusieurs bancs de registres. [0010] L'unité d'exécution comprend une unité de chargement-stockage agencée pour réaliser les opérations de chargement. L'unité d'exécution comprend aussi une unité logique qui peut comprendre une unité arithmétique en entiers et/ou une unité arithmétique en virgule flottante. En fonction du mode de réalisation, les pas peuvent être appliqués par l'unité de chargement-stockage ou par l'unité arithmétique en entier. [0011] Dans des modes de réalisation, l'unité de chargement-stockage peut être agencée pour appliquer le pas fixe après le premier chargement, et le pas variable après le deuxième chargement. C'est-à-dire que les adresses sont post-incrémentées à chaque instance de l'instruction de double chargement qui est exécutée. Toutefois en variante, dans d'autres mises en oeuvre, il n'est pas exclu que le pas puisse pré-incrémenter l'adresse à chaque instance de l'instruction de double chargement. [0012] Dans des modes de réalisation, l'instruction de double chargement peut prendre des opérandes spécifiant une première adresse de source dans la mémoire pour le premier chargement, une première destination dans l'un desdits un ou plusieurs bancs de registres pour le premier chargement, une deuxième adresse de source dans la mémoire pour le deuxième chargement, et une deuxième destination dans l'un desdits un ou plusieurs bancs de registres pour le deuxième chargement, la première adresse de source étant spécifiée par un premier décalage dans un registre de décalage dans l'un desdits un ou plusieurs bancs de registres, et la deuxième source étant spécifiée par un deuxième décalage dans un registre de décalage dans l'un desdits un ou plusieurs bancs de registres. Dans ce cas, l'unité d'exécution est agencée de manière à, lorsque l'instruction de chargement est exécutée, réaliser la première opération de chargement en chargeant une première valeur à partir de la première adresse de source dans la première destination, et appliquer le pas fixe au premier décalage, et à réaliser la deuxième opération de chargement en chargeant une deuxième valeur à partir de la deuxième adresse de source dans la deuxième destination, et appliquer le pas variable au deuxième décalage. [0013] De préférence, le décalage est un décalage relatif par rapport à une adresse de base non nulle. Toutefois en variante, dans d'autres mises en oeuvre, il n'est pas exclu qu'il puisse y avoir un décalage par rapport à zéro, c'est-à-dire une adresse absolue dans l'espace d'adressage pertinent. [0014] En fonction du mode de réalisation, les première et deuxième destinations pourraient être des premier et deuxième registres dans l'un desdits un ou plusieurs bancs de registres ou des registres différents parmi les registres, ou pourraient être des premier et deuxième champs dans le même registre de destination dans l'un desdits un ou plusieurs bancs de registres. Par exemple, dans des modes de réalisation, le banc de registres utilisé comme destination pour les chargements a une architecture à mots de 32 bits ou de 64 bits, et chacune des première et deuxième valeurs est une valeur de 16 bits (par exemple une valeur de 16 bits en virgule flottante), la première étant chargée dans un premier champ de l'un des registres de 32 bits ou de 64 bits, et la deuxième valeur étant chargée dans un deuxième champ du même registre. [0015] Dans des modes de réalisation, les premier et deuxième décalages peuvent être contenus dans des champs différents d'un même registre de décalage dans l'un (lesdits un ou plusieurs bancs de registres, et l'unité d'exécution est agencée pour appliquer les pas en ajoutant le pas fixe et le pas variable aux premier et deuxièmes décalages respectivement puis en revenant écrire le registre de décalage. En variante, dans d'autres mises en oeuvre, il n'est pas exclu que les premier et deuxième décalages puissent être contenus dans des premier et deuxième registres de décalage respectifs. [0016] Dans des modes de réalisation, le registre de décalage peut être spécifié par un opérande de l'instruction de double chargement. En variante, dans d'autres mises en oeuvre, le registre de décalage pourrait être implicite ; par exemple il n'a pas besoin d'être spécifié par un opérande, étant par exemple au lieu de cela fixé ou défini sous forme d'un paramètre par une ou plusieurs autres instructions antérieures. [0017] Dans des modes de réalisation, l'unité d'exécution peut être agencée pour déterminer la première adresse de source en ajoutant le premier décalage à une adresse de base non nulle, et pour déterminer la deuxième adresse de destination en ajoutant le deuxième décalage à une adresse de base non nulle. Par exemple, dans des modes de réalisation l'adresse de base est une valeur de 21 bits contenue dans un registre de 32 bits, et chacune des valeurs de décalage est une valeur de 16 bits ajoutée aux bits les moins significatifs de la valeur d'adresse de base de 32 bits. [0018] Dans des modes de réalisation, la même adresse de base peut être utilisée pour les première et deuxième adresses de source. Ou bien dans d'autres mises en oeuvre, il n'est pas exclu que l'on puisse utiliser des adresses de base respectives différentes. [0019] Dans des modes de réalisation, l'adresse de base peut être spécifiée dans un registre d'adresse de base dans l'un desdits un ou plusieurs bancs de registres. Dans des modes de réalisation, l'instruction de double chargement peut prendre un opérande spécifiant l'adresse de base. Dans des variantes de réalisation, il n'est pas exclu que par exemple l'adresse de base puisse être nulle, ou puisse être non nulle mais une valeur fixe implicite. [0020] Dans des modes de réalisation, l'instruction de double chargement peut prendre un opérande spécifiant le registre de pas variable. En variante, dans d'autres mises en oeuvre, le registre de pas variable pourrait être implicite. [0021] Dans des modes de réalisation, le registre de pas variable peut être agencé pour contenir une pluralité de valeurs de pas dans une pluralité de champs respectifs du registre de pas variable, et l'unité d'exécution est agencée pour réaliser ladite variation du pas variable en utilisant une valeur de pas différente parmi les valeurs de pas à chaque instance successive de l'instruction de double chargement exécutée par l'unité d'exécution. Par exemple, dans des modes de réalisation, chacun des champs comporte 4 bits, chacun permettant ainsi de spécifier l'une quelconque de seize valeurs de pas possibles différentes. Dans des modes de réalisation, la largeur du registre de pas est de 32 bits, ce qui permet de contenir 8 valeurs de pas. [0022] Dans des modes de réalisation, l'unité d'exécution peut être agencée pour réaliser ladite utilisation de différentes valeurs en décalant le contenu du registre de pas variable de la largeur en bits d'un champ à chaque instance successive de l'instruction 6 de double chargement. [0023] Dans des modes de réalisation, l'unité d'exécution peut toujours utiliser le champ le moins significatif (par exemple les quatre bits les moins significatifs), et le décalage est un décalage vers la droite. Par exemple, lorsque les champs sont de 4 bits chacun, le décalage vers la droite est un décalage à droite de 4 bits. [0024] Toutefois, dans d'autres variantes de réalisation, on peut utiliser d'autres moyens pour faire varier le pas. Par exemple, l'unité d'exécution peut être agencée pour utiliser des champs différents du registre de pas, et/ou des registres de pas successifs différents, à chaque instance successive de l'instruction de double chargement. [0025] L'unité d'exécution peut être actionnable pour charger les valeurs de pas dans le registre de pas variable, pour charger les premier et deuxième décalages dans le registre de décalage, et/ou pour charger l'adresse de base dans le registre d'adresse de base, en exécutant des instructions antérieures. [0026] Dans des modes de réalisation, le processeur peut être programmé pour exécuter un programme comprenant au moins une partie d'un réseau neuronal, le programme comprenant une pluralité d'instances de l'instruction de double chargement ; et dans chaque instance, la première opération de chargement est utilisée pour charger des poids d'un réseau neuronal, et la deuxième opération de chargement est utilisée pour charger des données sur lesquelles agit le réseau neuronal. [0027] Selon un autre aspect décrit ici, on prévoit un programme informatique incorporé dans un support de stockage lisible par un ordinateur et comprenant du code agencé pour être exécuté par le processeur de l'un quelconque des modes de réalisation décrits ici, le code comprenant une pluralité d'instances de l'instruction de double chargement. [0028] Selon un autre aspect décrit ici, on prévoit un procédé d'actionnement d'un processeur comprenant une unité d'exécution, de la mémoire et un ou plusieurs bancs de registres, l'unité d'exécution étant agencée pour exécuter des instances d'instructions de code machine provenant d'un jeu d'instructions, dans lequel : les types d'instructions définis dans le jeu d'instructions définissent une instruction de double chargement pour charger à partir de la mémoire dans au moins l'un desdits un ou plusieurs bancs de registres ; et le procédé comprend l'exécution d'une pluralité d'instances de l'instruction de double chargement par l'intermédiaire de l'unité d'exécution, l'unité d'exécution étant agencée pour exécuter chacune desdites instances de l'instruction de double chargement : en réalisant une première opération de chargement à progression à pas fixe à chaque instance successive de l'instruction de double chargement, et une deuxième opération de chargement à progression à pas variable à chaque instance successive de l'instruction de double chargement, le pas variable étant spécifié dans un registre de pas variable dans l'un desdits un ou plusieurs 7 bancs de registres. [0029] Dans des modes de réalisation, le procédé peut en outre comprendre des opérations en accord avec l'une quelconque des caractéristiques de processeur décrites ici. Brève description des dessins [0030] Pour faciliter la compréhension de modes de réalisation de la présente description et pour montrer comment de tels modes de réalisation peuvent être mis en pratique, on va faire référence, seulement à titre d'exemple, aux dessins joints dans lesquels : [0031] [fig.11 la figure 1 est un schéma blocs d'un processeur ; [0032] [fig.21 la figure 2 représente schématiquement un réseau neuronal ; [0033] [fig.31 la figure 3 est un autre schéma blocs d'un processeur ; [0034] [fig.4] la figure 4 représente schématiquement certains registres dans un banc de registres ; et [0035] [fig.5] la figure 5 représente schématiquement le fonctionnement d'une instruction de chargement semi-éparse. Description des modes de réalisation [0036] La figure 1 illustre un exemple de processeur comprenant au moins un module de traitement 4 selon des modes de réalisation de la présente description. Dans des modes de réalisation, le processeur peut comprendre une pluralité de tels modules de traitement 4, ou "pavés", mis en oeuvre sur la même puce (c'est-à-dire une puce élémentaire) et connectés entre eux via un tissu d'interconnexion leur permettant de communiquer entre eux. 100371 Le module de traitement 4 comprend une unité de traitement 10, un ou plusieurs bancs de registres 26, et une mémoire locale 11 (c'est-à-dire sur le même pavé dans le cas d'une matrice de multiples pavés, ou sur la même puce dans le cas d'une puce d'un seul processeur). 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 blocs de mémoire adressables différents ou dans des régions différentes du même bloc de mémoire adressable). La mémoire d'instructions 12 mémorise un programme comprenant des instructions de code machine à exécuter par l'unité de traitement 10. La mémoire de données 22 mémorise des données sur lesquelles doit agir le code exécuté et des données produites en sortie par le code exécuté (par exemple comme résultat de telles opérations). Les registres se trouvant dans un banc de registres 26 sont distincts de la mémoire générale en ce que les adresses des registres sont fixes sous forme de bits dans des mots d'instructions, tandis que les adresses mémoire peuvent être calculées en exécutant des instructions. 100381 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 8 opérations arithmétiques et d'autres opérations logiques, des calculs d'adresses, des opérations de chargement et de stockage, et d'autres opérations, comme défini par l'architecture du jeu d'instructions. On notera qu'une instruction telle que mentionnée ici signifie instruction de code machine, c'est-à-dire une instance de l'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. [0039] L'étage d'extraction 14 extrait des instructions du programme à partir de la mémoire 12 tour à tour, et les passe à l'étage de décodage 16 pour qu'elles soient décodées. 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 de registres décodées de tous les registres d'opérandes spécifiés dans l'instruction (c'est-à-dire l'adresse dans le ou les bancs de registres 26), afin que l'instruction soit exécutée. L'unité d'exécution 18 a accès aux registres d'opérandes et d'état de commande dans le ou les bancs de registres 26, qu'elle peut utiliser dans l'exécution de l'instruction sur la base des adresses de registres décodées. Dans des modes de réalisation, les bancs de registres 26 peuvent comprendre un premier banc de registres, ou banc de registres principal (MRF), destiné à mémoriser des entiers comprenant au moins des adresses mémoire, et un deuxième banc de registres, ou banc de registres auxiliaire (ARE), destiné à mémoriser des valeurs en virgule flottante, par exemple fl 6s et/ou f32s. [0040] Lorsque l'unité d'exécution 18 exécute certains types d'instructions, elle peut utiliser un ou plusieurs registres dans au moins l'un (lesdits un ou plusieurs bancs de registres 26, en fonction du type d'instruction. Par exemple, le jeu d'instructions du processeur va comprendre au moins un type d'instruction de chargement, et dans certains modes de réalisation une pluralité de types différents d'instructions de chargement. Une instruction de chargement prend au moins un opérande pour spécifier une adresse de source dans la mémoire 22, et au moins un opérande pour spécifier un ou des registres de destination dans au moins un banc de registres 26. Lorsqu'elle est exécutée, elle charge une valeur à partir de l'adresse de source dans la mémoire 22 dans le ou les registres spécifiés dans le ou les bancs de registres 26 (par exemple le banc ARE). Certains types d'instructions de chargement spécifient l'adresse de source via un pointeur contenu dans un autre registre se trouvant dans l'un des bancs de registres 26 (par exemple le banc MRF), qui pointe vers l'adresse de source dans la mémoire 22. Dans ce cas, l'opérande de source du chargement spécifie l'adresse mémoire de source indirectement, en spécifiant le registre dans le MRF à partir duquel il faut prendre l'adresse de source. Les pointeurs peuvent être pré-chargés dans le MRF par d'autres instances d'instructions exécutées précédemment. Par exemple, dans certains modes de réalisation il pourrait y avoir des instances d'un autre type d'instruction de chargement plus "basique" qui prend un opérande d'adresse de source immédiate. Dans d'autres 9 modes de réalisation, plutôt que le chargement ne prenne un opérande de source immédiat, cette valeur immédiate pourrait être formée à partir dc valeurs immédiates dans d'autres instructions et être mémorisée dans un registre pour qu'une instruction de chargement ultérieure l'utilise ensuite comme registre d'adresse. On notera qu'en général il n'y a pas besoin de traiter les pointeurs de manière différente d'autres types de données. Il se trouve que les contenus ne sont que des adresses, plutôt que des valeurs entières ou des valeurs en virgule flottante. Ainsi, dans certains modes de réalisation le jeu d'instructions ne comprend pas en fait d'instruction de chargement qui prend l'adresse absolue complète comme valeur immédiate (niais il comprend des instructions destinées à copier des valeurs immédiates dans des registres). [0041] Le jeu d'instructions du processeur va aussi inclure une pluralité d'instructions arith- métiques, comprenant typiquement à la fois des instructions arithmétiques en entiers et des instructions arithmétiques en virgule flottante. Une instruction arithmétique prend un ou plusieurs opérandes de source et au moins un opérande de destination, en spécifiant des registres de source et de destination dans au moins l'un des bancs de registres 26 (par exemple le banc ARF). Lorsqu'elle est exécutée, l'opération arithmétique va réaliser son type respectif d'opération arithmétique sur les valeurs contenues dans le ou les registres de source et placer le résultat dans le ou les registres de destination spécifiés. Par exemple, une instruction d'addition peut prendre deux opérandes de source et un opérande de destination, et va ajouter les valeurs trouvées dans les registres de source et placer la somme résultante dans le registre de destination. Divers autres types plus complexes d'opérations arithmétiques peuvent aussi être inclus dans le jeu d'instructions, comme par exemple pour réaliser des multiplications de matrices ou des convolutions (ou des parties de celles-ci). Par exemple, ces types d'instructions peuvent trouver une application particulière dans l'apprentissage automatique où l'on peut souhaiter que le programme réalise de façon efficace une convolution d'une matrice de poids (un noyau) avec un ensemble de données d'entrée. [0042] Le jeu d'instructions du processeur comprend en outre au moins un type d'instruction de stockage. Une instruction de stockage prend des opérandes pour spécifier au moins une source dans au moins l'un des bancs de registres 26 (par exemple le banc ARF) et au moins une destination dans la mémoire 22. Lorsqu'elle est exécutée, l'instruction de stockage mémorise la valeur trouvée dans le registre de source spécifié dans l'adresse mémoire spécifiée dans la mémoire 22. Certains types d'instructions de stockage spécifient l'adresse de destination via un pointeur contenu dans un autre registre dans l'un des bancs de registres 26 (par exemple le MRF), qui pointe vers l'adresse de destination dans la mémoire 22. Dans ce cas, l'opérande de destination du stockage spécifie l'adresse mémoire de destination indirectement, en spécifiant le registre se trouvant dans le MRF dans lequel il faut prendre l'adresse de destination. On connaît aussi des instructions de chargement-stockage qui réalisent à la fois un stockage et un chargement en une seule instruction. [0043] Dans des modes de réalisation, l'unité de traitement 10 peut prendre la forme d'une unité de traitement à fils d'exécution multiples, appelée aussi parfois unité de traitement à fils en barillet, qui est capable d'exécuter simultanément une pluralité de fils d'exécution entrelacés dans le temps. Dans ce cas, la mémoire 12 mémorise une pluralité de fils d'exécution différents d'un programme, chaque fil comprenant une séquence respective d'instructions pour réaliser une certaine tâche ou certaines tâches. L'étage d'extraction 12 est agencé pour extraire des instructions à partir de fils différents d'un ensemble simultané de fils d'exécution, tour à tour, et pour les entrelacer dans le pipeline 13. Chacun des fils simultanés se voit allouer au moins un banc de registres 26 respectif, pour contenir l'état de programme (c'est-à-dire le contexte) de cc fil respectif séparément des autres fils simultanés. Parfois, les registres de chaque fil d'exécution sont appelés ses registres de contexte. Lorsqu'un fil d'exécution donné est en cours d'exécution, l'unité d'exécution 18 utilise de manière inhérente le ou les bancs de registres 26 du fil respectif pour des instructions de ce fil comme des instructions de chargement, des instructions arithmétiques et des instructions de stockage. Dans des modes de réalisation le contexte de chaque fil est muni de ses propres bancs MRF et ARE respectifs séparés, et lorsque l'unité d'exécution 18 exécute un fil donné, elle utilise de manière inhérente le banc MRF ou le banc ARF respectif du fil respectif en fonction du type d'opérande. [0044] Dans un exemple d'application du processeur décrit, le programme exécuté sur le module de traitement 4 peut mettre en oeuvre au moins une partie cl' un réseau neuronal 100, dont l'idée est illustrée schématiquement et à titre d'exemple en figure 2. [0045] Le réseau neuronal comprend un graphe de noeuds (c'est-à-dire des sommets) 102 et d'anêtes (c'est-à-dire des connexions) 104 interconnectés. Chaque noeud 102 du graphe comporte une ou plusieurs arrêtes d'entrée et une ou plusieurs arrêtes de sortie. Certaines des arrêtes d'entrée de certains des noeuds 102 sont les arrêtes de sortie de certains autres noeuds, connectant ainsi entre eux les noeuds pour former le graphe. En outre, une ou plusieurs des arrê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 arrê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 avoir tout cela : 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 formant les entrées et les sorties fournies aux noeuds et par les noeuds 102 sur leurs arrêtes d'entrée et de sortie respectivement. 11 [0046] 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. [0047] 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'erreur se trouve dans les limites du seuil spécifié mais n'est pas satisfaite si l'erreur est au-delà du seuil. Pour un noeud 102 pararnétré par plus qu'un seul paramètre respectif, la condition pour que cc 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 cc 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 dc 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. [0048] 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 12 sortie donnée. [0049] 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. [0050] Dans des modes de réalisation où l'unité de traitement 10 est un module de traitement à fils d'exécution multiples, chaque fil peut être utilisé pour mettre en oeuvre un noeud respectif différent 102 d'un réseau neuronal. Et/ou, dans des modes de réalisation où le processeur comprend une pluralité de pavés, chacun étant une instance du module de traitement 4 décrit, chaque pavé 4 peut être utilisé pour mettre en oeuvre une partie respective du réseau neuronal comprenant un sous-ensemble d'un ou plusieurs des noeuds 102. Les communications entre des fils d'exécution et/ou des pavés, en conséquence, représentent des arrêtes 104 entre noeuds 102 dans le réseau neuronal. Le programme dans son ensemble, exécuté sur l'étendue des multiples fils d'exécution et/ ou pavés 4, peut mettre en oeuvre un algorithme d'intelligence artificielle comprenant le réseau neuronal accompagné d'un algorithme d'apprentissage agencé pour réaliser l'apprentissage du réseau neuronal, et/ou d'un algorithme d'inférence ou de prédiction pour réaliser des inférences ou des prédictions sur la base du réseau neuronal. [0051] La figure 3 représente plus en détail le module de traitement 10 selon des modes de réalisation décrits ici. Comme cela est représenté, l'unité d'exécution 18 comprend une unité de chargement-stockage (LSU) 58 pour exécuter des instructions de chargement et de stockage, et une unité logique 55 pour exécuter des instructions arithmétiques. 13 L'unité logique 55 peut comprendre une unité logique et arithmétique en entiers (IALU) pour exécuter des instructions arithmétiques en entiers, et/ou une unité en virgule flottante (FPU) pour exécuter des instructions arithmétiques en virgule flottante. [0052] Dans une application donnée, la mémoire 22 peut être utilisée pour mémoriser au moins trois types de contenus : a) des pointeurs (représentés schématiquement par des hachures en diagonale dans la figure), b) des valeurs systématiques (hachures croisées), et des données éparses (remplissage en pointillés). Les pointeurs sont des adresses mémoire, ou des décalages ou deltas d'adresses, qui doivent être chargés dans des registres dans au moins l'un des bancs de registres 26 (par exemple le MRF), pour être utilisés par d'autres instructions de chargement pour pointer dans la mémoire(22) vers les autres valeurs/données qui doivent être chargées. Les pointeurs peuvent être placés dans le ou les bancs dc registres (26) au moyen d'instructions exécutées précédemment comme cela a été mentionné précédemment. Une fois que cela est fait, un ou plusieurs autres types d'instructions de chargement peuvent effectuer des chargements à partir d'adresses définies à la place par des pas (des deltas) ou des décalages par rapport à l'adresse contenue dans le registre. Cela signifie que l'autre type d'instructions de chargement peut avoir une densité sémantique supérieure. Le fait d'inclure une instance immédiate complète d'une adresse de chargement souhaitée dans le format d'instruction, comme dans un type basique d'instruction de chargement, prend une grande quantité de bits dans le champ d'opérande de source. Ainsi si ce n'est pas nécessaire et au lieu de cela l'opérande source de l'autre type d'instruction de chargement n'a besoin de spécifier qu'une plus petite adresse de registre contenant un pointeur pour le chargement, alors on peut loger un ou plusieurs opérandes additionnels supportant plus de fonctionnalités que juste une seule opération de chargement basique. Aussi, des structures de données logicielles présentent une certaine localisation spatiale, de sorte que les adresses ont tendance à être très similaires entre elles. Il est inefficace en termes d'énergie de continuer à extraire des instructions (et leur valeurs immédiates associées) qui ne diffèrent que de quelques bits. [0053] Un exemple d'instruction de chargement à haute densité sémantique, munie d'un pas de progression, décrit ici est l'instruction de double chargement (appelée aussi instruction de chargement semi-éparse), exemple qui va être décrit plus en détail immédiatement dans la suite. [0054] Les valeurs systématiques sont des valeurs sur lesquelles le programme doit agir, et que le programme va devoir charger à partir d'emplacements systématiques sur l'étendue d'une plage d'adresses mémoire dans une région de la mémoire 22, c'est-à-dire à partir de chaque adresse contiguë ou au moins à intervalles réguliers dans l'espace d'adresse. Un exemple de cela se trouve dans les poids d'un réseau neuronal. 14 La description qui suit va prendre un exemple dans lequel les valeurs systématiques sont des poids, mais on remarquera que cela n'est pas limitatif et que les explications données ci-après peuvent aussi s'appliquer à d'autres types de valeurs systématiques. Par contre, les données éparses sont des données sur lesquelles le programme doit aussi agir, et dont le programme va avoir besoin à certains emplacements sélectionnés qui ne sont pas espacés d'une manière systématique (c'est-à-dire qui ne sont pas à intervalles réguliers). Dit d'une autre façon, seulement certaines des données contiennent des informations utiles ou pertinentes. Par exemple, de nombreuses de ces données peuvent être quantifiées à zéro et seules les entrées de données non nulles sont nécessaires ; ou dans un autre exemple, le programme peut souhaiter abandonner certaines des valeurs suivant un motif pseudo-aléatoire. Les emplacements mémoire de tels éléments de données sont en effet arbitraires, en cc qu'ils ne suivent aucun motif systématique et que dans tout programme donné ils pourraient apparaître n'importe où parmi les données. [0055] Le programme peut avoir besoin de charger côte à côte à la fois les valeurs systé- matiques et des entrées sélectionnées parmi les données éparses, par exemple pour opérer sur celles-ci conjointement. Par exemple, il peut être nécessaire de réduire un ensemble systématique de poids avec seulement des données sélectionnées parmi l'ensemble de données éparses. Par exemple, dans le contexte d'un réseau neuronal, les poids sont typiquement empaquetés de façon dense tandis que les actionnements provenant d'autres neurones peuvent être empaquetés de façon éparse. [0056] C'est au programme de déterminer quelles données il doit charger, en fonction de l'application. Toutefois, afin de permettre au programme de travailler efficacement sur l'étendue du contenu mémoire, on s'aperçoit ici qu'il serait souhaitable de prévoir dans le jeu d'instructions du processeur une instruction qui réalise deux chargements en une seule instruction avec une fonctionnalité de chargement "semi-éparse". C'est-à-dire que l'une des opérations de chargement progresse d'un pas fixe à chaque instance de l'instruction de chargement qui est exécutée, tandis que l'autre chargement progresse d'un pas variable à chaque instance de l'instruction de chargement. Ce type d'instruction de chargement peut être appelé ici instruction de double chargement ou instruction de chargement semi-éparse, ou dans certains modes de réalisation "ldbl6b16". Dans des modes de réalisation sa sémantique est la suivante. [0057] ldbl6b16 SaDstO:Dst0±1, $mBase0, $mOffset-F-F, $mDelta » [0058] Dans le but de représenter un exemple de mise en oeuvre, "$m" fait référence à un registre dans le banc MRF (utilisé pour des adresses mémoire) et "$a" fait référence à un registre dans le banc ARF (utilisé pour des valeurs en virgule flottante). [0059] Comme cela est représenté dans la sémantique susmentionnée, l'instruction de double chargement prend au moins un opérande de destination spécifiant des première et deuxième destinations, dans au moins l'un des bancs de registres 26 (par exemple le banc ARE), pour les première et deuxième opérations de chargement respectivement. Dans des modes de réalisation, il y a deux registres de destination séparés $aDstO et $aDst0+1 dans l'un des bancs de registres 26 (par exemple le banc ARE), par exemple des registres adjacents. Dans des modes de réalisation, cela nécessite un seul opérande pour identifier l'un des registres (par exemple le premier $aDst0) dans l'un des bancs de registres 26, et l'emplacement de l'autre est compris par l'unité d'exécution 18 comme étant inhérent par rapport à cela, par exemple en étant le registre adjacent précédent ou suivant $aDst0+1 (dits registres naturellement alignés). En variante, dans une autre mise en oeuvre, il n'est pas exclu que les première et deuxième destinations puissent être des premier et deuxième champs dans le même registre (auquel cas un seul opérande de destination est nécessaire pour identifier ce registre). Dans tous les cas, dans des modes de réalisation l'instruction de double chargement charge une paire (un vecteur à deux éléments) de valeurs de 16 bits, par exemple fi 6s (valeurs en virgule flottante à demi-précision). Cela peut être utilisé pour charger un poids de 16 bits et une valeur de données de 16 bits provenant de l'ensemble de données éparses, par exemple tous les deux en fl6s. [0060] Le mnémonique -1dbl6b16" fait référence au fait que, dans des modes de réalisation, les première et deuxième opérations de chargement réalisées sont des chargements diffusés de 16 bits. "Diffusé" dans cc contexte désigne la duplication d'une valeur scalaire afin qu'elle remplisse entièrement un vecteur, chaque élément du vecteur étant une copie de la valeur scalaire. Les `b' dans ldbl6b16 indiquent que les deux valeurs scalaires de 16 bits chargées doivent être diffusées. Dans des modes de réalisation, chacune des valeurs est dupliquée pour remplir un vecteur à 2 éléments de 16 bits chacun. C'est-à-dire que chacun des premier et deuxième registres de destination (par exemple $DstO et $Dst0+1) est un registre d'une largeur de 32 bits ; le poids de 16 bits chargé par la première opération de chargement étant dupliqué pour remplir les 32 bits du premier registre de destination (par exemple $Dst0), et la valeur de données de 16 bits de la deuxième opération de chargement étant dupliquée pour remplir le deuxième registre de destination (par exemple $DstO-F1). La raison de cela est que, dans au moins une mise en oeuvre, les bancs de registres 26 et le pipeline ARE peuvent fonctionner sur un minimum de 32 bits. Dans le cas de valeurs de 16 bits, la plus petite donnée est un vecteur à 2 éléments (f16v2). La diffusion assure que les mêmes valeurs d'entrée sont présentées aux deux demi-pipelines de 16 bits. La duplication signifie que toute exception résultante peut seulement être due aux opérandes d'entrée de 16 bits (tandis que si par exemple 0 était présenté à l'un des demi-pipelines, cela pourrait entraîner une exception non provoquée par les opérandes (l'entrée). [0061] L'instruction de double chargement prend aussi un ou plusieurs opérandes spécifiant 16 des première et deuxième adresses de source dans la mémoire 22 à partir desquelles il faut charger les valeurs chargées par les première et deuxième opérations de chargement, respectivement. Dans des modes de réalisation, celles-ci sont spécifiées en identifiant un ou plusieurs registres, dans au moins l'un des bancs de registres 26, qui entre eux contiennent des valeurs pour déterminer les première et deuxième adresses de source dans la mémoire 22. Pour réaliser cela, dans des modes de réalisation, l'instruction de double chargement prend un opérande de source identifiant un registre d'adresse de base $rnBase dans l'un des bancs de registres 26 (par exemple le MRF), et un autre opérande de source identifiant un registre de décalage $mOffset dans l'un des bancs de registres 26. Le registre d'adresse de base $rnBase est agencé pour contenir une adresse mémoire de base, c'est-à-dire un pointeur de base (ayant été pré-chargé là par une instance antérieure d'une autre instruction, par exemple un autre type d'instruction de chargement ou une instruction de formation de constante ou une opération arithmétique en entiers pour former une adresse de base). Cette adresse de base est une adresse de base commune pour les première et deuxième opérations de chargement. Le registre de décalage $mOffset est agencé pour contenir des première et deuxième valeurs de décalage d'adresse pour les premier et deuxième chargements, respectivement, dans des premier et deuxième champs respectifs du registre $mOffset, ici encore ayant été placées là précédemment par une instruction exécutée antérieurement. Ou, dans des variantes de réalisation, en fonction des tailles de décalage et de l'architecture des registres, deux premier et deuxième registres séparés pourraient être utilisés pour contenir les premier et deuxième décalages (par exemple l'opérande de décalage identifiant seulement l'un de ceux-ci et l'emplacement de l'autre étant inhérent par rapport à lui, par exemple un registre adjacent dans le même banc de registres). Dans tous les cas, le "++" dans l'expression sémantique susmentionnée fait référence au fait que les valeurs de décalage dans le ou les registres de décalage sont incrémentées automatiquement d'une valeur de pas à chaque instance de l'instruction de double chargement exécutée : la première d'une valeur de pas fixe, et la deuxième d'un delta programmable. [0062] L'instruction de double chargement prend en outre au moins un opérande spécifiant la valeur de pas pour la deuxième opération de chargement, c'est-à-dire un delta d'adresse à appliquer au deuxième décalage dans le registre de décalage $mOffset chaque instance de l'instruction de double chargement qui est exécutée. Dans des modes de réalisation, cela ne nécessite qu'un seul opérande. Dans des modes de réalisation, l'opérande spécifie le delta en identifiant un registre de delta SmDelta dans l'un des bancs de registres 26 (par exemple le MRF), ayant été placé précédemment là par une instruction exécutée antérieurement. Le registre de delta SmDelta est agencé pour contenir au moins une valeur de delta, et dans des modes de réalisation une 17 pluralité de deltas dans une pluralité de champs respectifs (par exemple des champs de 4 bits) du registre de delta. La fonctionnalité de l'instruction de double chargement consiste à utiliser des valeurs de delta différentes parmi les valeurs de delta à chaque instance successive dc l'instruction dc double chargement qui est exécutée. Dans des modes de réalisation, cela est mis en oeuvre en décalant le contenu du registre vers la droite de la largeur en bits d'un champ (par exemple 4 bits) à chaque fois, et toujours en utilisant le champ le moins significatif (par exemple les 4 bits les moins significatifs) pour le delta courant (c'est à dire le pas). C'est cela qui est représenté par "»" dans l'expression susmentionnée. [0063] Comme cela est représenté en figure 4, dans des modes de réalisation le registre d'adresse de base $mBase (dans le MRF) a une largeur de 32 bits et l'adresse de base (base addr) est un pointeur de 21 bits occupant les 21 bits les moins significatifs du registre d'adresse de base. Dans des modes de réalisation, le registre de décalage $mOffset (dans le MRF) a une largeur de 32 bits. Un premier champ de 16 bits du registre de décalage $mOffset, par exemple les 16 bits les plus significatifs $mOffset[31:16], est utilisé pour contenir une valeur de décalage de 16 bits (woffsct) pour la première opération dc chargement (pour le poids) ; et un deuxième champ de 16 bits du registre de décalage $mOffset, par exemple les 16 bits les moins significatifs $mOffset[l 5:0], est utilisé pour contenir une valeur de décalage de 16 bits (doffset) pour la deuxième opération de chargement (pour la valeur de données provenant des données éparses). Dans des modes de réalisation, le registre de delta $mDelta (dans le MRF) a une largeur de 32 bits, et chacun des champs de delta dans celui-ci comporte 4 bits, ce qui donne huit champs au total pour mémoriser 8 pas de 4 bits réglables indépendamment, chacun pouvant prendre l'une quelconque de 16 valeurs possibles. [0064] La figure 5 représente le fonctionnement de l'instruction de double chargement lorsqu'elle est exécutée par l'unité d'exécution 18 (l'unité d'exécution 18 comprenant de la logique agencée de façon appropriée pour réaliser cette fonctionnalité en réponse au code opération de l'instruction de double chargement). Lorsqu'une instance de l'instruction de double chargement est exécutée, la première opération de chargement charge la valeur trouvée dans la première adresse de source dans la mémoire 22, dans le premier registre de destination (par exemple SaDst0) dans l'un des bancs de registres 26 (par exemple le banc ARE). Dans des modes de réalisation, la valeur de la première adresse de source est l'adresse de base (base_addr) plus la première valeur de décalage. Dans des modes de réalisation, la première adresse de source est prise dans le registre d'adresse de base $mBase, et le premier décalage (woffset) est pris dans le premier champ du registre de décalage $mOffset, par exemple $mOffset[31:16]. C'est-à-dire que la première opération de chargement charge à partir de $mBase + $mOffset[31:16], dans $DstO. 18 [0065] La deuxième opération de chargement est aussi réalisée en réponse au même code opération de la même instance de l'instruction de double chargement. La deuxième opération de chargement charge la valeur trouvée dans la deuxième adresse de source dans la mémoire 22, dans le deuxième registre de destination (par exemple $aDst0+1) dans l'un des bancs dc registres 26 (par exemple le banc ARE). Dans des modes de réalisation, la valeur de la deuxième adresse de source est l'adresse de base (base addr) plus la deuxième valeur de décalage. Dans des modes de réalisation, la deuxième adresse de source est prise dans le registre d'adresse de base $mBase, et le deuxième décalage (doffset) est pris dans le deuxième champ du registre de décalage $mOffset, par exemple $mOffset[15:0]. C'est-à-dire que la deuxième opération de chargement charge à partir dc $mBase + $mOffset[l 5:0], dans $Dst0+1. [0066] À chaque instance successive de l'instruction de double chargement qui est exécutée, la première adresse de source est incrémentée automatiquement d'un delta fixe, par exemple une unité (atome) dc l'espace d'adressage (par exemple une unité dans le but que le pas soit de 2 multiplets - voir ci-après). Dans des modes de réalisation, cela est mis en oeuvre en ajoutant une unité à la valeur se trouvant dans le premier champ du registre de décalage $rnOffset. En outre, la deuxième adresse de source est incrémentée automatiquement d'un delta programmable. Dans des modes dc réalisation, cela est mis en oeuvre en ajoutant le delta programmable à la valeur se trouvant dans le deuxième champ du registre de décalage $mOffsct. Dans des modes de réalisation, le delta programmable est pris dans l'un des champs du registre de delta $mDelta. Cette valeur de delta représente un nombre d'unités (atomes) à ajouter au deuxième décalage (par exemple un nombre d'unités de 2 multiplets). En outre, à chaque instance successive de l'instruction de double chargement qui est exécutée, une valeur différente parmi les multiples valeurs de delta se trouvant dans le registre de delta $mDelta est utilisée. Dans des modes de réalisation, cela est mis en oeuvre en utilisant toujours le champ le moins significatif (par exemple les 4 bits les moins significatifs) du registre de delta $rnDelta, puis en décalant le contenu de ce registre vers la droite d'un champ (par exemple de 4 bits) à chaque instance de l'instruction de double chargement. Une variante équivalente serait de toujours utiliser le champ le plus significatif (par exemple les 4 bits les plus significatifs) et de décaler vers la gauche à chaque instruction. Nota bene, "gauche" et "droite" dans le contexte de la logique binaire font référence à la signification des bits, et pas à l'orientation physique. [0067] Les deux pas sont appliqués à leurs adresses respectives automatiquement, c'est-à-dire en tant que partie inhérente de l'exécution de la même et unique instance de l'instruction de double chargement, en réponse au code opération de l'instruction de double chargement. Aucune instruction de code machine séparée n'est requise pour appliquer les pas aux décalages (bien qu'elles puissent être nécessaires pour charger 19 initialement l'adresse de base, les décalages et les deltas de pas de progression dans les registres d'adresse de base, de décalage et de delta, $mBase, $mOffset et $mDelta). [0068] Dans des modes de réalisation, chacune des valeurs chargées (c'est-à-dire les valeurs de poids et de données) est une valeur de 16 bits. Par conséquent une unité de pas ou de delta dans le présent cas qui nous occupe (la taille atomique) est de 2 multiplets. Ainsi à chaque instance de l'instruction de double chargement, la première adresse de source (pour les poids) est incrémentée d'une unité dc 2 multiplets, et la deuxième adresse de source (pour les données) est incrémentée d'un nombre égal à la valeur ("delta") se trouvant dans le registre de delta plus un, multipliée par deux multiplets ; c'est-à-dire delta-El lots d'unités de 2 multiplets. On notera que lorsque delta=0, cela correspond à un pas de 1 unité (2 multiplets) ; et lorsque delta=1 cela correspond à un pas de 2 unités (4 multiplets), etc. Cela provient du fait que pour la plupart des applications un pas de zéro n'est pas utile. Cependant, il n'est pas exclu que dans des variantes de réalisation, l'une des différentes valeurs possibles de pas programmable donne l'option de pouvoir sélectionner un pas nul, c'est-à-dire d'autoriser une adresse statique pour l'une des deux opérations de chargement entre une instance et la suivante. [0069] Dans des modes de réalisation, les premier et deuxième chargements sont post- incrémentés de leurs pas respectifs. C'est-à-dire qu'à chaque instance de l'instruction de double chargement qui est exécutée, le premier pas, fixe, de cette instance est appliqué après la première opération de chargement de cette instance ; et le deuxième pas, variable, de la même instance est appliqué après la deuxième opération de chargement de cette instance (bien que l'ordre relatif du premier chargement par rapport au deuxième chargement, du premier pas par rapport au deuxième pas, du premier pas par rapport au deuxième chargement et du deuxième pas par rapport au premier chargement n'aient pas nécessairement d'importance). Toutefois, dans d'autres variantes de réalisation, il n'est pas exclu que les premier et deuxième chargements puissent être pré-incrémentés de leurs pas respectifs lorsque l'instruction de double chargement est exécutée. [0070] Mathématiquement, la fonctionnalité décrite peut être exprimée de la manière suivante. [0071] base_addr = $mBase[20:0] // lire adresse de base dans le registre de base [0072] woffset = SmOtTset[31:16] // lire le décalage de poids dans le premier champ du registre de décalage [0073] doffset = $mOffset[15:0] // lire le décalage de données dans le deuxième champ du registre de décalage [0074] delta = $mDelta[3:0] // lire le pas dans les 4 bits les moins significatifs du registre de delta [0075] EA[0] = base addr + woffsct // ajouter le décalage d'adresse de poids à l'adresse de base [0076] EA[1] = base addr + doffsct // ajouter le décalage d'adresse de données à l'adresse de base [0077] woffsct +=2 // incrémenter le décalage d'adresse de poids de 2 multiplets [0078] mdelta = (delta +1)*2 // calculer le pas en multiplets [0079] doffset Endelta // incrémenter le décalage d'adresse de données du pas [0080] SmOffset := (woffset«16)Idoffset // revenir écrire les décalages incrémentés dans le registre de décalage [0081] SmDelta := SmDelta »4 // décaler le delta de pas vers la droite de 4 bits pour obtenir le pas suivant [0082] Les première et deuxième opérations de chargement sont réalisées par l'unité de chargement-stockage (LSU) 55 de l'unité d'exécution 18 en réponse au code opération de l'instruction de double chargement. Dans des modes de réalisation, le calcul et l'application des pas peuvent aussi être réalisés par le LSU ; ou dans d'autres modes de réalisation, certaines ou la totalité de ces fonctionnalités pourraient être mises en oeuvre en réutilisant de la logique se trouvant dans une autre unité 58 dc l'unité d'exécution 18, comme l'unité arithmétique et logique en entiers, IALU. [0083] On notera que les modes de réalisation susmentionnés ont été décrits uniquement à titre d'exemple. [0084] Par exemple, la sémantique exacte donnée précédemment n'est pas nécessairement limitative, et l'homme de l'art pourra trouver d'autres façons de coder la même fonctionnalité sous-jacente ou similaire dans une seule instruction de code machine. Par exemple un ou plusieurs des opérandes peuvent être des opérandes immédiats plutôt que des opérandes qui spécifient leurs inforinations respectives comme faisant référence à une valeur contenue dans un registre comme SmBase, $mOffset ou SmDelta ("immédiat" étant un terme du contexte (l'une architecture de jeu d'instructions, signifiant que l'information est spécifiée en étant codée directement sous forme d'un nombre dans le champ d'opérande plutôt qu'en référence à un registre). [0085] À la place ou en plus, un ou plusieurs des opérandes peuvent ne pas être nécessaires, et les informations qu'ils voudraient autrement spécifier pourraient à la place être implicites ("implicite" est un terme dans la technique utilisé dans le contexte d'une architecture de jeu d'instructions, signifiant que les informations en question n'ont pas besoin (l'être spécifiées dans un opérande puisqu'elles sont supposées y être automatiquement). Par exemple, l'identité du registre de pas $mDelta pourrait être implicite. [0086] Dans d'autres variantes, davantage de champs d'opérandes peuvent être prévus, par exemple deux champs d'opérandes de destination peuvent être prévus dans 21 l'instruction, permettant aux premier et deuxième registres de destination d'être spécifiés indépendamment. De telles considérations de conception peuvent dépendre, par exemple, de la quantité de fonctionnalités de l'application visée, et de la largeur en bits des instructions de l'architecture de processeur. [0087] Dans encore d'autres exemples de variantes, les premier et deuxième décalages pourraient être des adresses absolues plutôt que des adresses relatives par rapport à une base, c'est-à-dire des décalages par rapport à 0 dans l'espace d'adressage, et par conséquent l'opérande d'adresse de base n'est pas nécessaire. Aussi, l'idée d'un décalage ou delta telle qu'elle est mentionnée ici (comprenant le cas où il est décrit d'ajouter" ou d'Incrémenter" ou similaire), ne doit pas être comprise comme excluant l'addition d'une valeur négative. C'est-à-dire que de manière équivalente, l'amplitude du décalage pourrait être soustraite de l'adresse de base, et/ou l'amplitude du pas (delta) pourrait être soustraite du deuxième décalage à chaque instance de l'instruction de double chargement (de manière à fonctionner vers l'arrière dans les adresses mémoire, en commençant à une valeur supérieure puis en descendant vers des valeurs inférieures). [0088] En outre, on notera que les largeurs en bits de l'architecture et les tailles des divers registres et valeurs qui sont décrites ici ne sont pas limitatives, et ici encore peuvent être différentes dans d'autres mises en oeuvre en fonction de considérations de conception et de l'application visée du processeur, etc. [0089] En outre, la portée de la description n'est pas limitée à une application dans des réseaux neuronaux ou dans l'apprentissage automatique, et les enseignements présentés ici peuvent de façon plus générale être utilisés dans toutes les applications qui nécessitent de charger et de traiter des valeurs systématiques côte à côte avec d'autres valeurs sélectionnées clans un ensemble de données éparses. Aussi, la portée de la description n'est pas limitée à une architecture à fils d'exécution multiples ou à pavés multiples. Les techniques peuvent être utilisées sur toute conception de processeur qui peut être utilisée pour charger et traiter à la fois des données systématiques et des données éparses. [0090] 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. La portée de la description n'est pas limitée par les modes de réalisation décrits mais seulement par les revendications jointes. [Revendication I]