Brevet FR3134206A1 — publié le 20231006

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 Système de gestion d'un groupe de registres tournants défini de façon arbitraire dans des registres de processeur 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. Arrière-plan 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. Résumé 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. Description sommaire des dessins 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. 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.