FR3134206A1 - Système de gestion d'un groupe de registres tournants défini de façon arbitraire dans des registres de processeur - Google Patents
Système de gestion d'un groupe de registres tournants défini de façon arbitraire dans des registres de processeur Download PDFInfo
- Publication number
- FR3134206A1 FR3134206A1 FR2202950A FR2202950A FR3134206A1 FR 3134206 A1 FR3134206 A1 FR 3134206A1 FR 2202950 A FR2202950 A FR 2202950A FR 2202950 A FR2202950 A FR 2202950A FR 3134206 A1 FR3134206 A1 FR 3134206A1
- Authority
- FR
- France
- Prior art keywords
- register
- registers
- vector
- instruction
- buffer zone
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 239000000872 buffer Substances 0.000 claims abstract description 68
- 238000000034 method Methods 0.000 claims description 12
- 239000000284 extract Substances 0.000 claims description 3
- 238000010586 diagram Methods 0.000 description 4
- 230000008520 organization Effects 0.000 description 2
- 230000000295 complement effect Effects 0.000 description 1
- 238000009987 spinning Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3004—Arrangements for executing specific machine instructions to perform operations on memory
- G06F9/30043—LOAD or STORE instructions; Clear instruction
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30032—Movement instructions, e.g. MOVE, SHIFT, ROTATE, SHUFFLE
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30036—Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30105—Register structure
- G06F9/30112—Register structure comprising data of variable length
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Mathematical Physics (AREA)
- Complex Calculations (AREA)
Abstract
L’invention est relative à un cœur de processeur comprenant : une interface mémoire système de N bits ; un jeu de registres de travail comprenant une pluralité de registres à usage général ($r) de capacité inférieure à N bits ; un jeu de registres vectoriels ($a) de N bits ; dans son jeu d'instructions, une instruction de manipulation de registres (VLOAD, VALIGN) exécutable avec les paramètres suivants : a) une valeur (BUF) définissant dans le jeu de registres vectoriels une zone tampon formée d'une pluralité de registres vectoriels consécutifs, et b) une référence à un premier registre à usage général ($rV), le premier registre à usage général contenant un index (idx) identifiant un registre vectoriel ($a(B+idx)) à l'intérieur de la zone tampon ; et une unité d'exécution (10, 20) configurée, lors de l'exécution d'une instruction de manipulation de registres, lire ou écrire, en un cycle, N bits dans le registre vectoriel identifié à partir de la valeur définissant la zone tampon et de l'index contenu dans le premier registre à usage général ($rV). Figure pour l’abrégé : Fig. 1
Description
L’invention est relative au chargement de blocs de données à partir d'une mémoire vers les registres d’un processeur, où les blocs de données peuvent commencer à des adresses désalignées par rapport à un bus de données de la mémoire.
Dans certaines applications de traitement de données, comme le "streaming", un ou plusieurs flots de données peuvent être enregistrés dans une mémoire, pour être relus par un processeur en vue de recevoir un traitement ultérieur. Dans une telle application, les opérations de lecture en mémoire pour récupérer les données du flot n'utilisent pas de mémoire cache, de sorte que chaque lecture présente une latence de plusieurs cycles d'une horloge système. Les opérations de lecture sont souvent exécutées dans une boucle pour créer un pipeline de traitements où les instructions de lecture peuvent s'enchaîner sans latence.
Le cœur d'une telle boucle est une instruction qui charge un nombre de bits de la largeur du bus de données dans des registres de travail du processeur, désignés explicitement par l'instruction de chargement. Une première difficulté réside dans la gestion des registres destinataires en tenant compte de la latence mémoire. En effet, les registres désignés par une itération de la boucle ne reçoivent leurs données que plusieurs cycles plus tard, de sorte que l'itération suivante ne peut pas désigner les mêmes registres. Une seconde difficulté est que le bus d’accès mémoire fonctionne à performance maximale uniquement lorsque les adresses de lecture mémoire sont alignées, c’est-à-dire multiples de la taille des données accédées en lecture. Cependant l’organisation du logiciel applicatif ne permet pas de respecter cet alignement dans la majorité des cas.
Pour surmonter la première difficulté dans une architecture de processeur générique, on utilise une technique d'expansion de variables modulaire ou MVE ("Modulo Variable Expansion"). Selon cette technique, on conçoit une macro-boucle dans laquelle plusieurs itérations de lecture sont "déroulées" pour utiliser des registres destination différents. Le nombre d'itérations déroulées est choisi pour avoir un temps d'exécution supérieur à la latence mémoire maximale. Cette technique est difficile à appliquer lorsque la latence mémoire est grande, ce qui est typiquement le cas en mode "streaming", car le nombre de registres disponibles pourrait devenir insuffisant compte tenu que d'autres opérations de la boucle ont aussi besoin de registres.
Certaines architectures de processeur disposent d'un groupe de registres tournants permettant de dérouler une boucle de manière transparente. Des écritures ou lectures successives à la même adresse du groupe de registres tournants résultent en des accès à des registres successifs du groupe de registres. Lorsque le dernier registre est atteint, la succession redémarre du premier registre. Une boucle peut alors être écrite de manière traditionnelle avec une seule opération d'accès qui utilise comme destination une adresse affectée au groupe de registres tournants. Le brevet US7594102 évoque un tel groupe de registres. Le document de Hewlett-Packard "HPL-PD Architecture Specification", disponible sur le lien https://www.hpl.hp.com/techreports/93/HPL-93-80R1.pdf, décrit une architecture de processeur comprenant un groupe de registres tournants.
Pour surmonter la seconde difficulté, liée au fait que les données à traiter ne sont pas généralement alignées en mémoire, il a été proposé par exemple dans le brevet US7197625B1 de charger les valeurs de deux lectures mémoire successives dans des registres spécialisés, à partir desquels une instruction extrait les données correctement alignées pour les traitements dans le processeur.
On prévoit de façon générale un cœur de processeur comprenant une interface mémoire système de N bits ; un jeu de registres de travail comprenant une pluralité de registres à usage général de capacité inférieure à N bits ; un jeu de registres vectoriels de N bits ; dans son jeu d'instructions, une instruction de manipulation de registres exécutable avec les paramètres suivants : a) une valeur définissant dans le jeu de registres vectoriels une zone tampon formée d'une pluralité de registres vectoriels consécutifs, et b) une référence à un premier registre à usage général, le premier registre à usage général contenant un index identifiant un registre vectoriel à l'intérieur de la zone tampon ; et une unité d'exécution configurée pour, lors de l'exécution d'une instruction de manipulation de registres, lire ou écrire, en un cycle, N bits dans le registre vectoriel identifié à partir de la valeur définissant la zone tampon et de l'index contenu dans le premier registre à usage général.
L'instruction de manipulation de registres peut être une instruction de chargement de vecteur exécutable avec les paramètres suivants : a) la valeur définissant la zone tampon, b) la référence au premier registre à usage général contenant l'index, et c) une référence à un deuxième registre à usage général contenant une adresse mémoire source. L'unité d'exécution est alors configurée pour, lors de l'exécution d'une instruction de chargement de vecteur, transférer des données de la mémoire depuis l'adresse contenue dans le deuxième registre à usage général dans le registre vectoriel identifié par l'index.
L'instruction de manipulation de registres peut également être une instruction d'alignement exécutable avec les paramètres suivants : a) la valeur définissant la zone tampon, b) la référence au premier registre à usage général, le premier registre à usage général contenant une valeur combinant l'index identifiant le registre vectoriel dans la zone tampon et un compte de décalage à droite, et d) une destination définissant un registre vectoriel ou une pluralité de registres à usage général consécutifs ayant ensemble une capacité de N bits. L'unité d'exécution est alors configurée pour, lors de l'exécution d'une instruction d'alignement, lire simultanément deux registres vectoriels consécutifs à partir de l'index, décaler les contenus concaténés des deux registres vectoriels vers la droite par le compte de décalage à droite, et écrire les N bits de poids faible des contenus décalés dans la destination.
La valeur définissant la zone tampon peut coder le rang du registre vectoriel de départ de la zone tampon et la taille de la zone tampon, et l'unité d'exécution peut être configurée pour produire l'index modulo la taille de la zone tampon, d'où il résulte que la zone tampon est utilisée de manière circulaire.
On prévoit également un procédé d'alignement de données lues dans une mémoire, comprenant les étapes suivantes mises en œuvre à bas niveau dans un cœur de processeur : prévoir une zone tampon circulaire de plusieurs registres du cœur de processeur ; exécuter une série d'instructions de chargement pour transférer des blocs de données de la mémoire vers des premiers registres successifs de la zone tampon, le nombre d'instructions de la série étant choisi en fonction d'une latence en lecture de la mémoire ; et exécuter une boucle incluant : i) une instruction de chargement pour transférer un bloc mémoire vers un registre successif de la zone tampon, ii) une instruction d'alignement pour accéder simultanément à deux registres successifs précédemment chargés et extraire un bloc de données à cheval sur les deux registres successifs, et iii) traiter le bloc de données extrait.
L'instruction de chargement et l'instruction d'alignement peuvent être exécutées chacune avec un premier paramètre définissant le départ et la taille de la zone tampon, et un deuxième paramètre référençant un index qui identifie une position dans la zone tampon, le procédé comprenant des étapes de mise à jour des index pour désigner des registres successifs dans la zone tampon.
Des modes de réalisation seront exposés dans la description suivante, faite à titre non limitatif en relation avec les figures jointes parmi lesquelles :
La représente un schéma-bloc d'éléments d'une unité de traitement centrale d'un cœur de processeur, configurés pour exécuter une instruction spéciale qui gère une écriture dans un ensemble arbitraire de registres, comme dans un groupe de registres tournants ;
La représente un schéma-bloc d'éléments supplémentaires de l'unité de traitement de la , configurés pour exécuter une instruction d'alignement de données qui gère deux lectures dans un ensemble de registres, tel qu'un groupe de registres tournants.
Comme on l'a précédemment indiqué, les groupes de registres tournants classiques ne sont pas prévus pour recevoir des données lues en mode "streaming" ni pour supporter les opérations de réalignement nécessaires à chaque itération de la boucle. Un tel alignement implique, par exemple, de concaténer les contenus de deux registres successifs pour extraire un bloc de données à cheval sur les deux registres.
On notera en passant que la mémoire est souvent conçue pour permettre l'accès aux données avec une granularité d'un octet, ce qui permet en principe de récupérer des données correctement alignées sur le bus D. Toutefois, de tels accès de granularité fine coûtent au moins deux cycles pour aligner les données sur le bus. On préfère ainsi utiliser des accès mémoire qui coûtent un seul cycle, en utilisant leur granularité maximale d’accès. Malgré les opérations d'alignement ultérieures que cela implique, les performances sont meilleures globalement.
On propose ci-après une structure particulière permettant d’exploiter un ensemble arbitraire de registres formant un groupe de registres tournants, ou une zone tampon de façon plus générale, gérable par des instructions bas-niveau dédiées du jeu d'instructions du processeur. L'une de ces instructions permet notamment d'opérer simultanément (en un cycle) sur deux registres tournants qui ont été chargés à des itérations différentes.
La représente un schéma-bloc d'un certain nombre d'éléments d'une unité de traitement centrale CPU d'un cœur de processeur servant à l'exécution d'une instruction spéciale de chargement de registre vectoriel à partir de données en mémoire, notée VLOAD. Seuls les éléments utiles à la compréhension de l'exécution de l'instruction sont illustrés ; de nombreux autres éléments classiques d'un cœur de processeur ne sont pas décrits.
La CPU est reliée à une mémoire partagée MEM par un bus de données D. La largeur N du bus D est égale à 256 bits, à titre d'exemple, c'est-à-dire 32 octets. La mémoire MEM est commandée par un bus d'adresses A, qui peut avoir une taille de 64 bits pour accéder à la mémoire avec une granularité d'un octet.
La CPU comprend un jeu de registres à usage général GPRF ("General-Purpose Register File"), servant à stocker des adresses, des opérandes d'instructions courantes et des résultats d'instructions courantes. Chaque registre est désigné par $rX (où X est le rang du registre) et a une capacité de 64 bits, par exemple. Les registres peuvent être organisés en bancs de quatre, chaque registre d'un banc étant relié au bus de données D par un groupe respectif de 64 lignes. Les registres sont également câblés, ce qui n'est pas représenté en détail, pour être accessibles individuellement par des unités d'exécution matérielles mettant en œuvre les différentes instructions du jeu d'instructions du processeur.
Une telle organisation des registres permet aux unités d'exécution d'opérer sur des données de 64 bits en désignant des registres individuels, ou d'effectuer des transferts de blocs de données de 256 bits en désignant des quadruplets de registres.
La CPU comprend également un jeu de registres vectoriels VRF ("Vector Register File"), servant typiquement à stocker plusieurs données à traiter en mode SIMD ("Single Instruction - Multiple Data"). Chaque registre vectoriel est noté $aX (où X est le rang du registre) et a une capacité de 256 bits, c'est-à-dire la largeur du bus de données auquel il est relié. Les registres vectoriels $a peuvent être un sur-ensemble des registres à usage général $r, chaque registre vectoriel correspondant alors à un banc de quatre registres à usage général.
Une pluralité de registres vectoriels consécutifs $aB à $a(B+s-1) sont interprétés par l'instruction VLOAD comme une zone tampon BUF. La zone tampon peut démarrer sur un rang de registre vectoriel arbitraire B et avoir une taille arbitraire s, généralement un nombre pair.
Une unité d'exécution 10 est conçue pour mettre en œuvre l'exécution d'une instruction de chargement de registre vectoriel VLOAD. L'instruction VLOAD véhicule trois paramètres, à savoir :
une valeur BUF qui code le rang de départ (ou base) B et la taille s de la zone tampon BUF,
une référence à un registre à usage général $rV qui contient un index idx identifiant un registre vectoriel courant dans la zone tampon BUF, et
une référence à un registre d'usage général $rS qui contient une adresse mémoire source @src.
A l'exécution de l'instruction VLOAD, l'unité d'exécution récupère l'index idx contenu dans le registre référencé $rV et l'adresse mémoire source @src contenue dans le registre référencé $rS. Pour des raisons de cohérence avec l'instruction VALIGN abordée plus loin, l'index tel que stocké dans le registre $rV est un nombre d'octets. Pour obtenir l'index idx indiquant une position de registre vectoriel dans la zone tampon, le contenu du registre $rV est divisé par 32, comme cela est illustré, ce qui revient à décaler le contenu du registre à droite de 5 positions.
L'adresse @src est présentée à la mémoire pour lire 256 bits correspondants par le bus D, qui seront chargés dans un registre vectoriel $a(B+idx) correspondant à l'index idx. Comme cela est illustré, la sélection du registre vectoriel est opérée en ajoutant l'index idx à la base B contenue dans le premier paramètre BUF de l'instruction VLOAD. Pour rendre la zone tampon circulaire, l'index idx est ajusté modulo s, la taille de la zone tampon contenue également dans le paramètre BUF. La base B et la taille s peuvent être codées dans deux champs respectifs du paramètre BUF. Un paramètre d'instruction, pouvant servir de valeur immédiate, a typiquement la même taille que les registres à usage général, ici 64 bits.
La représente un schéma-bloc d'éléments supplémentaires de l'unité de traitement centrale CPU servant à l'exécution d'une instruction spéciale d'alignement, notée VALIGN.
Pour les besoins de l'instruction VALIGN, les registres vectoriels pairs et impairs sont accessibles aux unités d'exécution de la CPU par deux bus distincts de 256 bits, ce qui permet de lire ou écrire simultanément dans un registre pair (par exemple $a0) et un registre impair (par exemple $a1).
Une unité d'exécution 20 est conçue pour mettre en œuvre l'exécution d'une instruction d'alignement VALIGN. L'instruction VALIGN véhicule trois paramètres, à savoir :
une destination D qui identifie une ressource capable de recevoir 256 bits, comme un quadruplet de registres d'usage général, par exemple $r4 à $r7, ou un registre vectoriel,
une valeur BUF qui, comme pour l'instruction VLOAD, code la base B et la taille s de la zone tampon BUF, et
une référence à un registre à usage général $rV qui code un index idx identifiant un registre vectoriel courant dans la zone tampon BUF, par exemple $a0, et aussi un compte de décalage à droite rsc.
A l'exécution de l'instruction VALIGN, l'unité d'exécution récupère le contenu du registre référencé $rV. L'index idx codé dans ce registre est utilisé, comme pour l'instruction VLOAD, en combinaison avec le paramètre BUF, pour désigner un registre vectoriel dans la zone tampon, par exemple $a0. Par ailleurs, le registre vectoriel immédiatement suivant $a1 est implicitement désigné aussi. Les contenus des registres vectoriels désignés $a0 et $a1 sont concaténés, le registre $a0 étant placé à droite, du côté des bits de poids faibles. En d'autres termes, les poids sont croissants de droite à gauche. Les contenus ainsi concaténés sont présentés simultanément à un circuit de décalage à droite SHIFT-R de 512 bits en entrée. Ce circuit opère un décalage à droite des 512 entrées par le compte rsc extrait du registre référencé $rV, et présente à sa sortie les 256 bits de poids faible des contenus concaténés décalés. Ainsi, un bloc de données de 256 bits utiles à cheval sur les registres $a0 et $a1, comme illustré en grisé, est présenté sur les 256 bits de sortie du circuit de décalage.
La sortie du circuit de décalage est chargée dans les registres désignés par le paramètre destination D, ici le banc de registres $r4 à $r7. Selon une alternative, la sortie du circuit de décalage pourrait être chargée dans un autre registre vectoriel, désigné par le paramètre D.
En pratique, le compte de décalage à droite rsc a la granularité de l'adressage de la mémoire, ici un octet. Comme la largeur du bus mémoire D est de 32 octets, le décalage à une valeur maximale de 31*8 bits ou 31 octets, valeur qui peut être codée sur 5 bits. Ainsi, le compte rsc peut être codé sur les 5 bits de poids faible du registre $rV, et l'index idx sur les bits restants. Comme cela est illustré à la , l'index idx et le compte rsc peuvent être formalisés comme le quotient Q et le reste R de la division par 32 du contenu du registre $rV.
Les instructions VLOAD et VALIGN dévoilent leur intérêt en les utilisant conjointement dans une boucle pour traiter un ou plusieurs flots de données, chaque flot étant associé à un tampon de données. Un exemple de boucle pour traiter un seul flot est exposé ci-après dans le Tableau 1. Cette boucle est prévue pour copier un bloc de données désaligné stocké en mémoire à une adresse @src vers une adresse @dst dans la même mémoire. Le fait que le bloc soit désaligné est reflété par une adresse @src dont les 5 bits de poids faible véhiculent une valeur non-nulle, par exemple 8.
Le registre $r0 est le registre $rV référencé par les instructions VALIGN, codant l'index dans la zone tampon et le compte de décalage.
Le registre $r1 est le registre $rS référencé par les instructions VLOAD, contenant l'adresse de lecture en mémoire.
Le registre $r2 est le registre $rV référencé par les instructions VLOAD, contenant l'index dans la zone tampon.
1 | AND $r0 = @src, 31 |
2 | AND $r1 = @src, -32 |
3 | MAKE $r2 =0 |
4 | MAKE $r3 = @dst |
5 | VLOAD $a0..a3, $r2 = 0[$r1] |
6 | ADD $r2 = $r2, 32 |
7 | ADD $r1 = $r1, 32 |
8 | VLOAD $a0..a3, $r2 = 0[$r1] |
9 | ADD $r2 = $r2, 32 |
10 | ADD $r1 = $r1, 32 |
11 | VLOAD $a0..a3, $r2 = 0[$r1] |
12 | ADD $r2 = $r2, 32 |
13 | ADD $r1 = $r1, 32 |
LOOP_BEGIN <i> | |
14 | VLOAD $a0..a3, $r2 = 0[$r1] |
15 | ADD $r2 = $r2, 32 |
16 | ADD $r1 = $r1, 32 |
17 | VALIGN $r8r9r10r11 = $a0..a3, $r0 |
18 | ADD $r0 = $r0, 32 |
19 | STORE 0[$r3] = $r8r9r10r11 |
20 | ADD $r3 = $r3, 32 |
LOOP_END |
A la ligne 1, le registre $r0 reçoit un ET bit à bit entre l'adresse @src et la valeur 31. En d'autres termes, tous les bits de l'adresse @src sont annulés sauf les 5 bits de poids faible. Ainsi, le registre $r0 reçoit la valeur 8 dans cet exemple.
A la ligne 2, le registre $r1 reçoit un ET bit à bit entre l'adresse @src et la valeur -32, codée dans un format de complément à deux permettant de représenter les nombres négatifs. Cela annule les cinq bits de poids faible, et stocke dans le registre $r1 une adresse alignée sur le bus de données.
Aux lignes 3 et 4, on initialise les registres $r2 et $r3 aux valeurs 0 et l'adresse @dst, respectivement.
A la ligne 5, on exécute une première instruction VLOAD utilisant : (i) une zone tampon formée des registres $a0 à $a3, (ii) l'index (valant 0) contenu dans le registre $r2, désignant le registre $a0, et (iii) un bloc de données de 32 octets (256 bits) commençant à l'adresse contenue dans le registre $r1. Cette adresse est alignée sur la frontière de 32 octets précédant la position (+8) où démarre le bloc de données utile.
Aux lignes 6 et 7, on incrémente de la valeur 32 le contenu de chacun des registres $r2 et $r1 pour désigner, respectivement, le registre suivant $a1 de la zone tampon et le bloc suivant de 32 octets à lire en mémoire.
Les opérations des lignes 5 à 7 sont répétées deux fois des lignes 8 à 13. Il en résulte que les trois premiers registres vectoriels $a0 à $a2 de la zone tampon sont chargés avec des blocs consécutifs de 32 octets de la mémoire.
Les opérations suivantes, des lignes 14 à 20, sont exécutées dans une boucle d'indice i qui peut être exécutée indéfiniment.
Aux lignes 14 à 16, on répète encore les opérations des lignes 5 à 7. A la première itération, cela charge le bloc suivant de 32 octets dans le dernier registre $a3 de la zone tampon. La zone tampon est pleine. L'incrément du contenu du registre $r2 fait passer la valeur de l'index à 4, sortant de la zone tampon. L'index idx effectivement appliqué est calculé modulo la taille (ici 4) de la zone tampon, comme cela est illustré à la , de sorte que la valeur idx repasse à 0.
A la ligne 17, on exécute une instruction d'alignement VALIGN, utilisant : (i) le banc de registres à usage général $r8 à $r11 pour recevoir le bloc de données alignées, (ii) la zone tampon $a0 à $a3, et (iii) l'index et le compte contenus dans le registre $r0.
A la première itération, le registre $r0 contient la valeur 8, d'après l'initialisation à la ligne 1. L'index idx vaut 0 et le décalage à droite rsc vaut 8. Les contenus concaténés des registres $a0 et $a1 sont décalés à droite de 8 octets, et le résultat décalé est écrit dans les registres $r8 à $r11.
On suppose que l'instruction VALIGN est exécutée à un moment où les données mémoire ont eu le temps d'arriver dans les registres $a0 et $a1 compte tenu de la latence de la mémoire. L'instruction VLOAD de la ligne 8 est celle qui charge les données dans le deuxième registre $a1, et elle a été exécutée 10 cycles plus tôt. Ainsi, cette boucle autorise une latence mémoire de jusqu'à 10 cycles. Si on souhaite compenser une latence plus importante, on utilisera une taille de zone tampon plus grande, ce qui augmente le nombre de cycles du "préambule" avant la boucle pour pré-remplir la zone tampon.
A la ligne 18, le contenu du registre $r0 est incrémenté de 32. A la première itération, le registre $r0 est mis à jour à la valeur 40, codant un index idx égal à 1 et un décalage à droite rsc toujours égal à 8 (ce décalage reste constant dans la boucle).
A la ligne 19 on exécute une écriture en mémoire du contenu des registres $r8 à $r11 à l'adresse contenue dans le registre $r3, à savoir @dst.
A la ligne 20 on incrémente le contenu du registre $r3 de 32, pour mettre à jour l'adresse destination du bloc de données qui sera écrit en mémoire à l'itération suivante.
Dans la deuxième itération de la boucle, l'instruction VLOAD charge le contenu mémoire correspondant dans le registre vectoriel d'index 4 modulo 4, soit $a0, en écrasant la valeur qui a été utilisée par l'instruction VALIGN à l'itération précédente. L'instruction VALIGN de la deuxième itération utilise les registres vectoriels suivants $a1 et $a2. Et ainsi de suite.
On remarquera que les instructions VLOAD et VALIGN définissent et gèrent un ensemble de registres vectoriels comme un groupe de registres tournants en utilisant notamment un index idx explicite et en le gérant de manière logicielle. Le matériel est adapté pour simplifier certains détails de la gestion des registres tournants (comme l'opération modulo s pour produire l'index effectif idx) et mettre en œuvre un alignement des contenus de deux registres vectoriels consécutifs (512 bits) en un cycle (les lignes d'accès séparées pour les registres pairs et impairs). Ces instructions permettent en outre de définir la zone tampon de manière arbitraire (position et taille) dans le jeu de registres vectoriels.
L'instruction VLOAD décrite jusqu'à présent lit un bloc de 256 bits pour le transférer intégralement dans une registre de 256 bits. Une structure mémoire typique permet généralement de lire aussi des blocs de taille plus petite, comme 128, 64, 32, 16 ou 8 bits. On peut ainsi envisager des extensions de cette instruction VLOAD qui lisent des blocs plus petits en mémoire pour les transférer à une position spécifiée du registre destination, par exemple lire 64 bits qui peuvent être écrits à la position 0, 64, 128 ou 192 du registre destination de 256 bits. La position destination peut être codée dans les cinq bits de poids faible du registre $rV référencé par l'instruction VLOAD. Une telle instruction VLOAD, exécutée plusieurs fois avec une position destination différente, permet de rassembler dans un même registre vectoriel des blocs de données qui sont disjoints dans la mémoire.
Dans un mode de réalisation où la souplesse offerte par un index explicite n'est pas indispensable, on peut néanmoins réaliser une fonctionnalité d'alignement sur la base d'une structure de registres tournants classique, comme décrite dans le document "HPL-93-80 HPL-PD Architecture Specification", appelée RRB ("Rotating Register Buffer"). Une particularité d'un tel tampon circulaire est que la plage d'adresses servant à accéder aux registres est une fenêtre sur un cercle de registres qui tourne d'un registre à chaque exécution du branchement qui itère la boucle, ce qui impose que tous les tampons circulaires évoluent de la même manière. Outre la surcharge de l’instruction de branchement qui va à l’encontre des tendances modernes d’architecture de CPU, cette solution impose d’utiliser des techniques d’allocation de registres complexes et spécifiques comme décrit dans le document "HPL-92-48 Register Allocation for Modulo Scheduled Loops : Strategies, Algorithms and Heuristics".
Dans un tel cas de registres tournants, le préambule de la boucle exécute trois instructions VLOAD à destination d'une même adresse du tampon circulaire, disons 4, et trois mises à jour correspondantes de l'adresse de lecture en mémoire. A l'intérieur de la boucle, on exécute une nouvelle instruction VLOAD aussi à destination de l'adresse 4. Après cette instruction, le tampon circulaire effectue une rotation présentant un nouveau registre derrière l'adresse 4 et les quatre blocs lus en mémoire sont disponibles aux adresses 0 à 3 du tampon circulaire.
L'instruction d'alignement VALIGN exécutée après dans la boucle a besoin, pour effectuer le décalage, des deux blocs écrits 4 et 3 cycles plus tôt, qui sont disponibles aux adresses 4 - 4 = 0 et 4 - 3 = 1. L'unité d'exécution correspondante peut être configurée pour accéder simultanément aux registres derrière les adresses 0 et 1 sans provoquer une rotation des registres. Pour cela, les registres peuvent être câblés, comme précédemment, pour que les registres pairs et impairs soient accessibles individuellement et simultanément.
Ce mode de réalisation permet d'écrire un code plus compact, car on omet les instructions de mise à jour de l'index explicite.
Claims (6)
- Cœur de processeur comprenant :
une interface mémoire système de N bits ;
un jeu de registres de travail comprenant une pluralité de registres à usage général ($r) de capacité inférieure à N bits ;
un jeu de registres vectoriels ($a) de N bits ;
dans son jeu d'instructions, une instruction de manipulation de registres (VLOAD, VALIGN) exécutable avec les paramètres suivants :
a) une valeur (BUF) définissant dans le jeu de registres vectoriels une zone tampon formée d'une pluralité de registres vectoriels consécutifs, et
b) une référence à un premier registre à usage général ($rV), le premier registre à usage général contenant un index (idx) identifiant un registre vectoriel ($a(B+idx)) à l'intérieur de la zone tampon ; et
une unité d'exécution (10, 20) configurée pour, lors de l'exécution d'une instruction de manipulation de registres, lire ou écrire, en un cycle, N bits dans le registre vectoriel identifié à partir de la valeur définissant la zone tampon et de l'index contenu dans le premier registre à usage général ($rV). - Cœur de processeur selon la revendication 1, dans lequel l'instruction de manipulation de registres est une instruction de chargement de vecteur (VLOAD) exécutable avec les paramètres suivants :
a) la valeur (BUF) définissant la zone tampon,
b) la référence au premier registre à usage général ($rV) contenant l'index, et
c) une référence à un deuxième registre à usage général ($rS) contenant une adresse mémoire source (@src) ; et
l'unité d'exécution (10) est configurée pour, lors de l'exécution d'une instruction de chargement de vecteur, transférer des données de la mémoire depuis l'adresse (@src) contenue dans le deuxième registre à usage général ($rS) dans le registre vectoriel identifié par l'index. - Cœur de processeur selon la revendication 1, dans lequel l'instruction de manipulation de registres est une instruction d'alignement (VALIGN) exécutable avec les paramètres suivants :
a) la valeur (BUF) définissant la zone tampon,
b) la référence au premier registre à usage général ($rV), le premier registre à usage général ($rV) contenant une valeur combinant l'index (idx) identifiant le registre vectoriel dans la zone tampon et un compte de décalage à droite (rsc), et
d) une destination (D) définissant un registre vectoriel ou une pluralité de registres à usage général consécutifs ($r4r5r6r7) ayant ensemble une capacité de N bits ; et
l'unité d'exécution (20) est configurée pour, lors de l'exécution d'une instruction d'alignement, lire simultanément deux registres vectoriels consécutifs ($a0, $a1) à partir de l'index, décaler les contenus concaténés des deux registres vectoriels vers la droite par le compte de décalage à droite (rsc), et écrire les N bits de poids faible des contenus décalés dans la destination. - Cœur de processeur selon la revendication 1, dans lequel la valeur (BUF) définissant la zone tampon code le rang du registre vectoriel de départ (B) de la zone tampon et la taille (s) de la zone tampon, et l'unité d'exécution est configurée pour produire l'index modulo la taille de la zone tampon, d'où il résulte que la zone tampon est utilisée de manière circulaire.
- Procédé d'alignement de données lues dans une mémoire, comprenant les étapes suivantes mises en œuvre à bas niveau dans un cœur de processeur :
prévoir une zone tampon circulaire (BUF) de plusieurs registres du cœur de processeur ;
exécuter une série d'instructions de chargement (VLOAD) pour transférer des blocs de données de la mémoire vers des premiers registres successifs de la zone tampon, le nombre d'instructions de la série étant choisi en fonction d'une latence en lecture de la mémoire ; et
exécuter une boucle incluant :
i) une instruction de chargement pour transférer un bloc mémoire vers un registre successif de la zone tampon,
ii) une instruction d'alignement pour accéder simultanément à deux registres successifs précédemment chargés et extraire un bloc de données à cheval sur les deux registres successifs, et
iii) traiter le bloc de données extrait. - Procédé selon la revendication 5, dans lequel l'instruction de chargement (VLOAD) et l'instruction d'alignement (VALIGN) sont exécutées chacune avec un premier paramètre (BUF) définissant le départ et la taille de la zone tampon, et un deuxième paramètre ($rV) référençant un index (idx) qui identifie une position dans la zone tampon, le procédé comprenant des étapes de mise à jour des index pour désigner des registres successifs dans la zone tampon.
Priority Applications (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
FR2202950A FR3134206A1 (fr) | 2022-03-31 | 2022-03-31 | Système de gestion d'un groupe de registres tournants défini de façon arbitraire dans des registres de processeur |
EP23163156.5A EP4254176A1 (fr) | 2022-03-31 | 2023-03-21 | Système de gestion d'un groupe de registres tournants définis arbitrairement dans un fichier de registres de processeur |
CN202310318068.3A CN116893989A (zh) | 2022-03-31 | 2023-03-29 | 管理在处理器寄存器堆中任意定义的旋转寄存器组的系统 |
US18/192,947 US20230315472A1 (en) | 2022-03-31 | 2023-03-30 | System for managing a group of rotating registers defined arbitrarily in a processor register file |
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
FR2202950A FR3134206A1 (fr) | 2022-03-31 | 2022-03-31 | Système de gestion d'un groupe de registres tournants défini de façon arbitraire dans des registres de processeur |
FR2202950 | 2022-03-31 |
Publications (1)
Publication Number | Publication Date |
---|---|
FR3134206A1 true FR3134206A1 (fr) | 2023-10-06 |
Family
ID=82694033
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
FR2202950A Pending FR3134206A1 (fr) | 2022-03-31 | 2022-03-31 | Système de gestion d'un groupe de registres tournants défini de façon arbitraire dans des registres de processeur |
Country Status (4)
Country | Link |
---|---|
US (1) | US20230315472A1 (fr) |
EP (1) | EP4254176A1 (fr) |
CN (1) | CN116893989A (fr) |
FR (1) | FR3134206A1 (fr) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0918290A1 (fr) * | 1997-11-19 | 1999-05-26 | Interuniversitair Micro-Elektronica Centrum Vzw | Méthode pour le transfert de structures de données de et aux registres de vecteurs d' un processeur |
GB2338094A (en) * | 1998-05-27 | 1999-12-08 | Advanced Risc Mach Ltd | Vector register addressing |
US20040073773A1 (en) * | 2002-02-06 | 2004-04-15 | Victor Demjanenko | Vector processor architecture and methods performed therein |
US20050125624A1 (en) * | 2003-12-09 | 2005-06-09 | Arm Limited | Data processing apparatus and method for moving data between registers and memory |
US20050219422A1 (en) * | 2004-03-31 | 2005-10-06 | Mikhail Dorojevets | Parallel vector processing |
US7197625B1 (en) | 1997-10-09 | 2007-03-27 | Mips Technologies, Inc. | Alignment and ordering of vector elements for single instruction multiple data processing |
US7594102B2 (en) | 2004-12-15 | 2009-09-22 | Stmicroelectronics, Inc. | Method and apparatus for vector execution on a scalar machine |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5933650A (en) * | 1997-10-09 | 1999-08-03 | Mips Technologies, Inc. | Alignment and ordering of vector elements for single instruction multiple data processing |
-
2022
- 2022-03-31 FR FR2202950A patent/FR3134206A1/fr active Pending
-
2023
- 2023-03-21 EP EP23163156.5A patent/EP4254176A1/fr active Pending
- 2023-03-29 CN CN202310318068.3A patent/CN116893989A/zh active Pending
- 2023-03-30 US US18/192,947 patent/US20230315472A1/en active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7197625B1 (en) | 1997-10-09 | 2007-03-27 | Mips Technologies, Inc. | Alignment and ordering of vector elements for single instruction multiple data processing |
EP0918290A1 (fr) * | 1997-11-19 | 1999-05-26 | Interuniversitair Micro-Elektronica Centrum Vzw | Méthode pour le transfert de structures de données de et aux registres de vecteurs d' un processeur |
GB2338094A (en) * | 1998-05-27 | 1999-12-08 | Advanced Risc Mach Ltd | Vector register addressing |
US20040073773A1 (en) * | 2002-02-06 | 2004-04-15 | Victor Demjanenko | Vector processor architecture and methods performed therein |
US20050125624A1 (en) * | 2003-12-09 | 2005-06-09 | Arm Limited | Data processing apparatus and method for moving data between registers and memory |
US20050219422A1 (en) * | 2004-03-31 | 2005-10-06 | Mikhail Dorojevets | Parallel vector processing |
US7594102B2 (en) | 2004-12-15 | 2009-09-22 | Stmicroelectronics, Inc. | Method and apparatus for vector execution on a scalar machine |
Also Published As
Publication number | Publication date |
---|---|
EP4254176A1 (fr) | 2023-10-04 |
CN116893989A (zh) | 2023-10-17 |
US20230315472A1 (en) | 2023-10-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20220108148A1 (en) | System and architecture neural network accelerator including filter circuit | |
Vigna | Broadword implementation of rank/select queries | |
CN111213125B (zh) | 使用simd指令进行高效的直接卷积 | |
EP0029131B1 (fr) | Procédé de commande de l'affectation de ressources dans un système comportant plusieurs processeurs à fonctionnement simultané | |
US20210311744A1 (en) | Microprocessor with Multistep-Ahead Branch Predictor | |
US8407456B2 (en) | Method and instruction set including register shifts and rotates for data processing | |
GB2496934A (en) | Multi-stage register renaming using dependency removal and renaming maps. | |
US20200226228A1 (en) | Language and compiler that generate synchronous digital circuits that maintain thread execution order | |
US20210203354A1 (en) | Compression and decompression engines and compressed domain processors | |
US20070050598A1 (en) | Transferring data from integer to vector registers | |
CN114064984B (zh) | 一种基于稀疏数组链表的世界状态增量更新方法及装置 | |
EP0485921B1 (fr) | Dispositif prévu pour le traitement de l'algorithme de Viterbi comprenant un processeur et un opérateur spécialisé | |
FR3101980A1 (fr) | Processeur | |
FR3134206A1 (fr) | Système de gestion d'un groupe de registres tournants défini de façon arbitraire dans des registres de processeur | |
JPH0476884A (ja) | スタックメモリ | |
EP3611623B1 (fr) | Contrôleur mémoire comprenant deux buffers et un selecteur d'un mode de remplissage desdits buffers | |
CN110554886B (zh) | 数据拆分结构、方法及其片上实现 | |
FR3021432A1 (fr) | Processeur a instructions conditionnelles | |
US20210082082A1 (en) | Data processing method and processing circuit | |
FR2796736A1 (fr) | Procede pour effectuer une multiplication avec accumulation dans un corps de galois | |
Modanese | Lower bounds and hardness magnification for sublinear-time shrinking cellular automata | |
WO2022191730A1 (fr) | Exécution accélérée d'opération de convolution par réseau neuronal convolutif | |
Liao et al. | SFVInt: Simple, Fast and Generic Variable-Length Integer Decoding using Bit Manipulation Instructions | |
US20050010628A1 (en) | In-place memory management for FFT | |
Lin et al. | Hardware accelerator design for dynamic-programming-based protein sequence alignment with affine gap tracebacks |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PLFP | Fee payment |
Year of fee payment: 2 |
|
PLSC | Publication of the preliminary search report |
Effective date: 20231006 |
|
PLFP | Fee payment |
Year of fee payment: 3 |