FR 2999773 A1 20140620 FR 1262027 A 20121213 SYSTEME DE REGROUPEMENT DE DONNEES POUR AMELIORER LE DEBIT D'ECRITURE DANS UNE MEMOIRE DYNAMIQUE Domaine technique de l'invention L'invention est relative à la gestion d'une mémoire dynamique partagée dans laquelle plusieurs sources concurrentes sont amenées à écrire de manière asynchrone, notamment dans le cadre d'une matrice de processeurs reliés par un réseau-sur-puce ou « NoC ». État de la technique Le protocole d'accès en écriture ou en lecture à une mémoire dynamique implique la présentation de deux adresses, une première adresse pour ouvrir une « page » de la mémoire, et une deuxième adresse pour accéder à un mot de la page. La vitesse de transfert maximale d'une mémoire dynamique est la vitesse de lecture ou écriture dans une même page. Une opération de changement de page est notablement plus lente qu'une opération d'accès à un nouveau mot dans une même page. Ainsi, si les données sont lues ou écrites en mémoire de manière aléatoire, la vitesse de transfert moyenne est notablement plus faible que la vitesse maximale. Pour tenter d'utiliser les mémoires dynamiques plus près de leur vitesse de transfert maximale, il est connu d'utiliser des mémoires tampon d'écriture (« write buffer » en anglais), semblables à des mémoires cache. Dans une telle mémoire tampon, les opérations d'écriture sont interceptées et mises en attente jusqu'à ce que la mémoire tampon contienne suffisamment de données pouvant être écrites en une salve dans une même page de la mémoire dynamique. Lorsque des données pouvant être écrites dans une même page de mémoire dynamique sont produites par différentes sources asynchrones, il devient difficile de gérer une mémoire tampon d'écriture. On rencontre cette situation lorsque plusieurs processeurs interconnectés par un réseau-sur-puce se répartissent le traitement d'un même ensemble de données, par exemple une image. Résumé de l'invention On souhaite donc prévoir un système de gestion d'une mémoire tampon d'écriture capable d'écrire par salves optimales des données provenant de sources concurrentes asynchrones. On tend à satisfaire ce besoin en prévoyant un dispositif de gestion de l'écriture de données provenant d'une source dans une mémoire partagée, comprenant une mémoire tampon d'écriture ayant un nombre fixe de lignes de cache, et configurée pour ordonner dans chaque ligne de cache des données à écrire à des emplacements contigus dans la 5 mémoire partagée ; et un circuit de gestion configure pour évincer les données d'une ligne de cache en une salve vers la mémoire partagée. La source est configurée pour transmettre les données par paquets dans un canal et identifier une fin de transfert dans le canal par un drapeau contenu dans le dernier paquet transmis dans le canal ; et le circuit de gestion est configure pour évincer toute ligne de cache incomplète contenant 10 des données du canal courant à la réception du drapeau de fin de transfert dans le canal courant. Selon un mode de réalisation, le dispositif comprend une table référençant toutes les lignes de cache incomplètes contenant des données du canal. Le circuit de gestion est configure pour identifier les lignes de cache à évincer à partir de la table, et supprimer 15 les références à ces lignes de cache lors de leur éviction. Selon un mode de réalisation, le dispositif est configure pour gérer l'écriture de données arrivant dans plusieurs canaux concurrents, et la table est un plan mémoire comprenant un mot par canal, une ligne de cache associée à un canal étant identifiée par le rang d'un bit actif dans le mot associé au canal. Le circuit de gestion est configure pour 20 réinitialiser tous les bits de même rang dans les mots du plan mémoire lors de l'éviction d'une ligne de cache correspondant à ce rang. Selon un mode de réalisation, le plan mémoire est configure pour permettre une réinitialisation simultanée des bits d'une colonne, le circuit de gestion étant configure pour, à l'éviction d'une ligne de cache, réinitialiser la colonne dont le rang correspond à 25 la ligne de cache. 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 figure 1 représente une connexion entre plusieurs interfaces de production de 30 données et une mémoire dynamique ; - la figure 2 représente schématiquement et partiellement une mémoire tampon d'écriture pouvant être utilisée dans la structure de la figure 1; - la figure 3 illustre schématiquement plusieurs processeurs produisant en parallèle des données à écrire dans une même zone mémoire ; - la figure 4 représente schématiquement un mode de réalisation de mémoire tampon d'écriture optimisée pour la structure de la figure 1; et - les figures 5A et 5B représentent deux variantes de gestion d'une table de correspondances de la mémoire tampon de la figure 4. Description d'un mode de réalisation préféré de l'invention La figure 1 représente schématiquement une connexion d'un circuit multiprocesseur 10 à une mémoire dynamique externe 12. La mémoire 12 comprend, par exemple, quatre 10 bancs de mémoire DDR (DDR1-DDR4) de 16 bits chacun. Les bus de données de 16 bits des bancs sont juxtaposés pour former un bus de données de 64 bits. Le circuit 10 comprend, par exemple, une matrice de processeurs interconnectés par un réseau-sur-puce NoC. Les données à échanger avec la mémoire 12 transitent par des interfaces mémoire IF, reliées à différents noeuds du réseau-sur-puce. Le nombre 15 d'interfaces IF est de préférence adapté à la bande passante de la mémoire 12. Un circuit de gestion de mémoire dynamique 14, intégré dans le circuit 10, adapte les tailles de mot et les vitesses de transfert entre les interfaces IF et la mémoire 12. Les requêtes d'accès à la mémoire des quatre interfaces IF sont stockées dans des tampons FIFO. Le circuit de gestion 14 lit successivement dans ces tampons FIFO les 20 requêtes de lecture et d'écriture lui provenant sur chacun de ses ports d'entrée à une vitesse 8 fois plus rapide que celle des interfaces. Il réordonne et envoie ces requêtes en fonction de l'occupation des différents bancs DDR de manière à optimiser le débit de ces transferts. Dans l'exemple considéré, si la vitesse de transfert maximale des bancs DDR est de 1,6 25 GT/s, et que chaque interface réseau IF a un bus bidirectionnel de 32 bits opérant à 400 MHz, on peut prévoir quatre interfaces IF1 à IF4. La somme des bandes passantes des interfaces IF, en supposant qu'elles fonctionnent dans les deux sens, est alors égale à la bande passante maximale de la mémoire 12. La figure 2 représente schématiquement un tampon mémoire d'écriture WB (ou « write 30 buffer »), que l'on utilise couramment pour former des salves à partir de flots de données discontinus. Un tel tampon peut être prévu dans chaque interface IF. Un tampon d'écriture est similaire à une mémoire cache. Il comprend une table mémoire destinée à stocker des salves dans des « lignes » de cache, ici de 128 octets. Chaque ligne est associée à une étiquette (« Tag ») qui identifie l'adresse ADi de début de la salve contenue dans la ligne. Un circuit d'indexation 20 sélectionne une ligne du tampon en fonction de l'adresse A d'une donnée D à écrire. En supposant que les données D sont de 32 bits, ces données peuvent être rangées à 32 positions différentes dans la salve. Alors, les 5 bits de poids faible de l'adresse déterminent la position de la donnée à l'aide d'un démultiplexeur DMX. Un multiplexeur MX est configure pour sélectionner des mots dans les lignes de cache afin de les transférer vers le circuit 14 de gestion de la mémoire DDR. La largeur des mots est de 32 bits dans cet exemple. Un circuit de gestion d'éviction 22 est configure, lorsque certaines conditions sont satisfaites, pour sélectionner une ligne de cache et transférer son contenu en une salve à l'aide du multiplexeur MX. L'adresse de début de la salve est identifiée à l'aide de l'étiquette associée à la ligne sélectionnée. Une première condition d'éviction est satisfaite lorsque la ligne de cache courante est pleine - elle est alors vidée ou évincée (« flushed » en anglais) et libérée pour recevoir une nouvelle salve. Une autre condition d'éviction est satisfaite en cas de collision d'index - une nouvelle donnée est reçue à une adresse correspondant au même index qu'une donnée déjà 20 présente, mais différente de l'adresse de cette donnée ; cette dernière doit alors être évincée pour faire de la place, même si la ligne n'est pas complète. En supposant qu'il y ait 256 lignes de cache, l'index fourni par le circuit 20 est codé sur 8 bits. Une forme d'indexation simple consiste à utiliser les 8 bits de poids faible de la partie de l'adresse A restant après les 5 bits fournis au démultiplexeur DMX. Cela 25 produit le même index lorsque ces parties d'adresse sont égales modulo 256. Pour diminuer la probabilité de collision d'index que cela peut entraîner, on peut utiliser une fonction de Hash sur l'adresse pour calculer l'index. Si la quantité de données à écrire n'est pas alignée sur la taille des salves, une ligne de cache peut rester incomplète à la fin d'un transfert. Il en résulte que la ligne n'est 30 évincée que si un nouveau transfert entre en collision avec l'index de cette ligne. Or, la fin d'un transfert peut provoquer le début d'un autre traitement par un autre processeur qui lira les données précédemment transmises en mémoire centrale ; ce traitement serait alors erroné si les données à utiliser sont restées dans le tampon d'écriture sans avoir été transférées dans cette mémoire centrale. Pour éviter cette incertitude dans le cas où les transferts sont de taille connue, on peut compter le nombre de données transmises et provoquer l'éviction de la ligne de cache courante quand le compte est atteint. Mais cela devient difficile à gérer lorsque le système permet un nombre inconnu de transferts en parallèle - c'est typiquement le cas d'une matrice de processeurs reliés par un réseau-sur-puce, ou lorsque le nombre de données à transférer n'est pas connu à l'avance. Une solution possible est que le processus consommateur lise les données préférentiellement dans le tampon avant de lire en mémoire centrale, mais ceci est difficile à réaliser lorsque les requêtes d'accès à la mémoire peuvent arriver par plusieurs interfaces différentes et que l'on utilise plusieurs tampons d'écriture pour des raisons de performance. Dans un réseau-sur-puce, les données sont habituellement transmises dans des paquets, et un transfert peut être formé de plusieurs paquets. Dans ce cas, le dernier paquet du transfert véhicule un drapeau de « fin de transfert » dans son entête ou son post-ambule. Ce drapeau peut servir à provoquer l'éviction d'une ligne de cache incomplète sans avoir recours à un comptage complexe. Comme cela est représenté à la figure 2, un circuit de désassemblage de paquets 24 extrait les données D et les adresses A de paquets reçus sur un bus Tx. Le circuit 24 extrait également le drapeau de fin de transfert du dernier paquet de chaque transfert, et active un signal de fin de transfert EOT. Le circuit d'éviction 22 est alors configuré pour évincer la ligne de cache courante à la réception du signal EOT. Si le drapeau de fin de transfert est situé dans l'entête du paquet, le circuit 24 peut être configuré pour compter jusqu'à la dernière donnée du paquet avant d'activer le signal EOT. Une telle solution peut toutefois s'avérer insuffisante si les transferts véhiculent séquentiellement des données destinées à des emplacements mémoire non-contigus. Par exemple, un traitement pourrait nécessiter la production d'une première série de données de rang pair, suivie d'une deuxième série de données de rang impair. Si ces deux séries de données sont véhiculées dans des transferts distincts, il est inévitable que plusieurs lignes de cache incomplètes contiennent les données d'un transfert au moment où arrive la fin du transfert. Ces plusieurs lignes de cache doivent alors être évincées, car on ne sait pas a priori si le transfert subséquent finira de les remplir à temps pour un traitement postérieur. Une difficulté dans cette situation réside dans l'identification rapide de toutes les lignes de cache à évincer. La figure 3 illustre un pas supplémentaire dans la difficulté. La matrice de processeurs 35 10 de la figure 1 comprend plusieurs processeurs pouvant travailler en parallèle sur un même jeu de données. On a représenté à titre d'exemple quatre processeurs qui produisent en parallèle des données d'une même rangée mémoire dans un ordre arbitraire. Dans cette situation, une même ligne de cache reçoit les données de plusieurs transferts concurrents. Quand on décide d'évincer une ligne de cache courante du fait qu'un premier transfert s'est terminé, d'autres transferts peuvent encore être en cours dans la même ligne de cache. Une difficulté ici est de gérer l'éviction de toutes les lignes de cache contenant des données d'un même transfert alors que ces lignes de cache peuvent contenir des données de plusieurs transferts concurrents. En pratique, un système comme celui de la figure 3 peut être configure pour que chaque processeur communique avec la mémoire par un canal virtuel différent, identifié, par exemple, dans les entêtes des paquets. Si plusieurs processeurs sont configurés pour écrire des données dans une même zone mémoire, les canaux virtuels correspondants passent de préférence par la même interface IF (figure 1), et donc par le même tampon d'écriture WB. La figure 4 représente schématiquement un mode de réalisation de tampon d'écriture permettant de gérer les évictions de lignes de cache incomplètes dans les situations décrites ci-dessus. Des mêmes éléments qu'à la figure 2 sont désignés par des mêmes références. Certains des éléments de la figure 2, bien qu'également présents dans le dispositif de la figure 4, ne sont pas représentés pour des raisons de clarté. Le circuit d'éviction, désigné ici par 22', reçoit d'une table 50 un mot identifiant les lignes de cache incomplètes associées au canal des données en cours de transfert. Le numéro du canal Ch en cours est fourni par le circuit de désassemblage de paquets 24 à partir du contenu de l'entête du paquet en cours. Ainsi, pour satisfaire toutes les situations possibles, la table 50 contient autant de mots que de canaux possibles, et chaque mot contient autant de bits que de lignes de cache. Dans une architecture où les données à écrire arrivent par un canal unique, comme dans une architecture monoprocesseur, la table 50 est réduite à un registre pour contenir un mot unique. Dans l'exemple représenté, le tampon d'écriture traite le canal numéro p et la ligne de cache en cours d'utilisation est celle de rang 1. Le numéro de canal (p) sélectionne un mot correspondant dans la table 50. Le mot sélectionné identifie par les rangs des bits actifs (« 1») les lignes de cache incomplètes contenant des données du canal p. Dans l'exemple représenté, le mot identifie les lignes de cache de rangs 1, 4 et 5. Les lignes 4 et 5 ont reçu des données du canal p, mais sont restées incomplètes. Le mot d'identification en cours de la table 50 est mis à jour lorsqu'une nouvelle ligne 35 de cache est sélectionnée par le circuit d'indexation 20. Le signal de sélection fourni par le circuit 20 sert de valeur à enregistrer dans le bit de même rang du mot d'identification. La figure 5A illustre une première procédure de réinitialisation des bits d'un mot d'identification de la table 50. Cette procédure est applicable à la situation où une ligne de cache reçoit des données d'un seul canal. Cette situation est rencontrée, par exemple, lorsqu'un seul processeur traite une série de données contiguës, ou bien lorsque plusieurs processeurs se répartissent le traitement d'une série de données contiguës et sont configurés pour utiliser le même numéro de canal pour écrire les données en mémoire. Lorsque le signal de fin de transfert EOT est activé pendant le traitement d'un canal p, le circuit d'éviction 22' procède séquentiellement à l'éviction des lignes identifiées par un bit à « 1» du mot d'identification en cours. Lorsque toutes les évictions ont été réalisées, le circuit 22' réinitialise le mot d'identification. Pour éviter de parcourir séquentiellement tous les bits nuls du mot d'identification entre deux bits actifs, on peut utiliser un circuit de conversion « thermométrique en numérique ». Un tel circuit produit le rang du bit actif de poids le plus fort à partir du mot d'identification. Dans ce cas, le circuit d'éviction annule les bits du mot d'identification au fur et à mesure qu'ils sont pris en compte. A chaque annulation de bit, le circuit de conversion fournit immédiatement le rang du bit actif suivant. Ainsi, les évictions ont lieu en partant du bit actif de poids le plus fort vers le bit actif de poids le plus faible. Pendant qu'ont lieu les évictions, des données peuvent arriver par un nouveau canal q. Le tampon d'écriture, ayant généralement des ports de lecture et d'écriture distincts, peut immédiatement recevoir ces données dans une ligne différente de celle qui est en cours d'éviction. Le mot d'identification correspondant au canal q est sélectionné dans la table 50, et ce mot reçoit la valeur « 1» dans le bit dont le rang correspond à la ligne de cache sélectionnée pour les nouvelles données, par exemple le bit à la quatrième position dans la figure 5A. La figure 5B illustre une deuxième procédure de réinitialisation des bits des mots d'identification de la table 50. Cette procédure est applicable à la situation où une ligne de cache peut recevoir des données provenant de plusieurs canaux. Dans cette situation, plusieurs mots d'identification peuvent avoir des bits actifs de mêmes rangs. Lorsqu'arrive le moment d'évincer une ligne pour le canal p, cette ligne peut aussi contenir des données d'un canal q. Par exemple, le mot associé au canal q dans la figure 5A pourrait également avoir un bit à « 1» aux rangs 1, 4 et 5, signifiant que les lignes de rangs 1, 4 et 5 sont associées aux deux canaux p et q. L'éviction d'une telle ligne implique une réinitialisation des bits de rang correspondant dans tous les mots de la table, comme l'illustre la figure 5B pour les rangs 1, 4 et 5. Pour permettre cela en un seul cycle, le plan mémoire 50 peut être muni de lignes de réinitialisation de colonne, où une colonne de rang k est formée des bits de rang k des mots. (Contrairement à la représentation habituelle d'un plan mémoire, les mots du plan mémoire 50 sont représentés verticalement, tandis que les colonnes sont représentées horizontalement.) La structure de la figure 4 permet de gérer, de façon générale, l'éviction de lignes de cache dont chacune peut être associée à plusieurs canaux et recevoir des données dans le désordre. Dans une situation plus simple où les données arrivent par un canal unique, le plan mémoire 50 est réduit à un registre contenant un mot unique servant à la gestion du canal unique. REVENDICATIONS1. Dispositif de gestion de l'écriture de données provenant d'une source dans une mémoire partagée, comprenant : - une mémoire tampon d'écriture (WB) ayant un nombre fixe de lignes de cache, et configurée pour ordonner dans chaque ligne de cache des données à écrire à des emplacements contigus dans la mémoire partagée ; et - un circuit de gestion (22') configuré pour évincer les données d'une ligne de cache en une salve vers la mémoire partagée ; caractérisé en ce que : - la source est configurée pour transmettre les données par paquets dans un canal (p) et identifier une fin de transfert dans le canal par un drapeau (EOT) contenu dans le dernier paquet transmis dans le canal ; et - le circuit de gestion (22') est configuré pour évincer toute ligne de cache incomplète contenant des données du canal courant à la réception du drapeau de fin de transfert dans le canal courant. 2. Dispositif selon la revendication 1, comprenant une table (50) référençant toutes les lignes de cache incomplètes contenant des données du canal ; le circuit de gestion (22') étant configuré pour identifier les lignes de cache à évincer à partir de la table, et supprimer les références à ces lignes de cache lors de leur éviction. 3. Dispositif selon la revendication 2 configuré pour gérer l'écriture de données arrivant dans plusieurs canaux concurrents, dans lequel la table (50) est un plan mémoire comprenant un mot par canal, une ligne de cache associée à un canal étant identifiée par le rang d'un bit actif dans le mot associé au canal, le circuit de gestion (22') étant configuré pour réinitialiser tous les bits de même rang dans les mots du plan mémoire lors de l'éviction d'une ligne de cache correspondant à ce rang. 4. Dispositif selon la revendication 3, dans lequel le plan mémoire (50) est configuré pour permettre une réinitialisation simultanée des bits d'une colonne, le circuit de gestion étant configuré pour, à l'éviction d'une ligne de cache, réinitialiser la colonne dont le rang correspond à la ligne de cache.