FR 3022372 A1 20151218 FR 1455394 A 20140613 La présente invention concerne le domaine de l'informatique. Plus particulièrement, elle concerne l'implémentation de la recherche d'éléments dans des listes de manière matérielle. L'implémentation de cartes réseau supportant l'interface MPI (sigle 5 de « Message Passing Interface » en anglais) nécessite la mise en oeuvre massive de recherche d'éléments dans des listes. Il s'agit par exemple, de lister les messages attendus par un noeud d'un réseau de communication avec une indication sur son lieu de stockage et de comparer tous les messages entrants du noeud à ceux de la liste. Ainsi, 10 lorsqu'un message arrive, il peut être acheminé vers son lieu de stockage pour être traité. Classiquement, chaque message dispose d'une étiquette qui doit être comparée à l'étiquette des messages dans la liste. Les étiquettes des messages de la liste sont éventuellement masquées pour que la comparaison 15 des étiquettes se fasse sur un nombre de bits réduit. Lorsqu'un message arrive, son étiquette est comparée à celle du premier élément de la liste, puis le deuxième, puis le troisième et ainsi de suite, jusqu'à ce qu'une correspondance d'étiquette soit trouvée. Dans ce cas, le message entrant est acheminé vers le lieu de 20 stockage et l'élément correspondant de la liste est supprimé. La liste est ensuite mise à jour. La liste des messages attendus est donc une liste dynamiquement modifiée avec des éléments pouvant être retirés, lorsqu'un message correspondant arrive ou pouvant être ajoutés lorsqu'un nouveau message est 25 attendu. Ce type de recherche dans une liste peut être mis en oeuvre de manière logicielle, avec des parcours de liste, mais ce type d'implémentation est très consommateur en ressources de calcul. En outre, le message entrant devant être séquentiellement comparé 30 à tous les éléments de la liste, le temps de traitement est proportionnel à la taille de liste. Dans les applications mettant en oeuvre un très grand nombre de processeurs, typiquement les supercalculateurs, l'implémentation logicielle peut retarder trop lourdement le système. Ainsi, les implémentations matérielles peuvent être préférées. Il a notamment été proposé de réaliser des recherches de correspondance en parallèle, par exemple en utilisant des arbres de recherche. Les recherches de correspondance parallèles sont cependant complexes car, dans le contexte des interfaces MPI par exemple, seul le premier élément correspondant au message entrant doit être retourné. La notion d'ordre des éléments de la liste doit être conservée, même dans les recherches de correspondance parallèles. Il existe donc un besoin pour améliorer les implémentations informatiques matérielles de recherche de correspondance d'éléments dans des listes. La présente invention s'inscrit dans ce cadre. Un premier aspect de l'invention concerne un dispositif de recherche de correspondance d'élément dans une liste, le dispositif comportant: - une pluralité de modules de mémoire adressable par contenu configurés pour comparer en parallèle un élément d'entrée avec leur contenu, ladite liste étant représentée par la concaténation du contenu valide desdites mémoires selon un ordre défini par une liste de priorité, - un module de de détermination, dans ladite liste de priorité, du premier module lequel l'élément d'entrée correspond à un élément stocké dans ledit module, et - un module de lecture du premier élément dudit module déterminé correspondant à l'élément d'entrée. Un dispositif selon le premier aspect permet de réaliser des recherches de correspondance d'éléments en un nombre réduit de cycles d'horloge dans un système informatique. Par exemple, la recherche de correspondance d'un élément dans une liste de 1024 élément peut être réalisée en moins de 10 cycles. Par exemple, ce dispositif est une unité de traitement de liste associative (ALPU sigle de « Associative List Processing Unit » en anglais). Selon des modes de réalisation, le dispositif comporte en outre : - un module d'invalidation dudit premier élément, et - un module de mise à jour d'un compteur d'éléments associé à ladite mémoire déterminée, ledit compteur d'élément représentant le nombre d'éléments stockés valides dans ladite mémoire. Selon des modes de réalisation, ledit module de mise à jour est en outre configuré pour lancer une mise à jour, lorsqu'un un module est vide, de ladite liste de priorité, ladite mise à jour permettant de placer ledit module à un niveau de priorité inférieur à celui des modules non vides. Par exemple, un indice de priorité associée auxdites mémoires est mis à jour. Par exemple, ladite mise à jour comporte un décalage dudit module et des modules suivants dans la liste. Selon des modes de réalisation, ladite liste de priorité comporte un paramètre pour chaque module, indiquant si chaque module est vide ou non. Par exemple, les modules sont classés en fonction dudit paramètre. Par exemple encore, l'ordre des modules dans ladite liste de priorité reflète un ordre d'allocation. Selon des modes de réalisation, ladite recherche de correspondance est effectuée par association d'une étiquette dudit élément avec une étiquette d'un élément de ladite liste. Par exemple, lesdits modules sont des modules à mémoire adressable par contenu ternaires. Ce type de module consomme moins d'énergie que des registres (dits « flip-flops ») habituellement utilisés. Pour traiter une liste de SxN éléments, le dispositif peut contenir N modules de mémoire adressable par contenu, chaque module pouvant contenir S éléments. Par exemple, au moins un module de traitement du dispositif est réalisé à partir de log2(N) étages de multiplexeurs (10g2 représentant le logarithme de base 2), N étant le nombre de modules de mémoire adressable par contenu. Par exemple une unité de traitement est un module de ré-ordonnancement, un module de sélection ou autre. Un deuxième aspect de l'invention concerne un procédé de recherche de correspondance d'élément dans une liste, le procédé comportant les étapes suivantes : - de comparaison parallèle d'un élément d'entrée avec le contenu d'une pluralité de modules de mémoire adressable par contenu, ladite liste étant représentée par la concaténation du contenu valide desdites mémoires selon un ordre défini par une liste de priorité, - de détermination, dans ladite liste de priorité, du premier module lequel l'élément d'entrée correspond à un élément stocké dans ledit module, - de lecture du premier élément dudit module déterminé correspondant à l'élément d'entrée. Le procédé peut en outre comporter les étapes suivantes: - d'invalidation dudit premier élément, et - de mise à jour d'un compteur d'éléments associé à ladite mémoire déterminée, ledit compteur d'élément représentant le nombre d'éléments stockés valides dans ladite mémoire. Le procédé peut en outre comporter une étape de mise à jour, lorsqu'un un module est vide, de ladite liste de priorité, ladite mise à jour permettant de placer ledit module à un niveau de priorité inférieur à celui des modules non vides. Par exemple, un indice de priorité associée audites mémoires est mis à jour. Par exemple, ladite mise à jour comporte un décalage dudit module et des modules suivants dans la liste. Par exemple, ladite liste de priorité comporte un paramètre pour chaque module, indiquant si chaque module est vide ou non. Selon des modes de réalisation, les modules sont classés en fonction dudit paramètre. Par exemple, l'ordre des modules dans ladite liste de priorité reflète un ordre d'allocation. Selon des modes de réalisation, ladite recherche de correspondance est effectuée par association d'une étiquette dudit élément avec une étiquette d'un élément de ladite liste. Selon des modes de réalisation, lesdits modules sont des modules à mémoire adressable par contenu ternaires.. Un troisième aspect de l'invention concerne un programme d'ordinateur ainsi qu'un produit programme d'ordinateur et un support de stockage pour de tels programme et produit, permettant la mise en oeuvre d'un procédé selon le deuxième aspect de l'invention. D'autres caractéristiques et avantages de l'invention apparaîtront à la lecture de la présente description détaillée qui suit, à titre d'exemple non limitatif, et des figures annexées parmi lesquelles : - la figure 1 illustre un objectif général de modes de réalisations de l'invention, - la figure 2 illustre le stockage d'une liste dans des modules de mémoire adressable par contenu selon des modes de réalisation, - les figures 3A-3B illustrent la mise à jour d'une liste de priorité selon des modes de réalisation, - la figure 4 illustre une table de comptage selon des modes de réalisation, et - la figure 5 illustre une implémentation matérielle selon des modes de réalisation. Selon un objectif général illustré par la figure 1, une liste 100 comporte un certain nombre d'éléments 101, 102, 103 etc. ordonnés selon des indices respectifs « 0 », « 1 », « 2 » etc. Chaque élément de la liste comporte, comme l'élément 101, des données 104 (« 0 »), une étiquette 105 (« TAG ») et éventuellement un masque 106 (« MSK »). Il s'agit de déterminer dans cette liste, le premier élément correspondant à un élément d'entrée 107 comportant des données 108 et une étiquette 109. La correspondance se fait par comparaison entre l'étiquette de l'élément d'entrée et celles des éléments de la liste. Pour simplifier la recherche de correspondance, la comparaison peut se faire avec les masques des éléments de la liste. En comparant avec les masques, la correspondance peut se faire sur un nombre plus faible de bits. Plutôt que de réaliser la recherche de correspondance en parcourant la liste et faire les comparaisons une à une, il est proposé de réaliser une recherche parallèle. Pour cela, comme illustré par la figure 2, des modules de mémoire adressables par contenu sont utilisées (CAM, sigle de « Content Adressable Memory »). Par exemple, il s'agit de modules de mémoire adressables par contenu ternaires (TCAM, sigle de « Ternary Content Adressable Memory »). La liste 200 (« LIST ») dans laquelle doit se faire la recherche est stockée dans un ensemble de modules 201 (« TCAMO »), 202 (« TCAM1 ») 203 (« TCAM31 »). Par exemple, la liste 200 comporte 1024 éléments répartis dans 32 modules de 32 éléments. Les modules sont initialement alloués dans un ordre initial, par exemple selon leur valeur d'index. Ainsi, le module 201 (« TCAMO »), d'index « 0» est alloué en premier, suivi du module 202 (« TCAM1 »), d'index « 1 » et ainsi de suite jusqu'au module 203 (« TCAM31 ») d'index « 31 ». Un autre ordre d'allocation initial peut être prévu. Lorsqu'un élément de la liste correspond à l'élément d'entré, il est retiré de la liste. Ainsi, la ligne du module dans lequel il est stocké est invalidée. Par exemple, un bit de validité est mis à jour pour indiquer que la ligne est « vide ». Par exemple encore, la ligne est mise à zéro. Lorsque la totalité des lignes d'un module est invalidée, le module redevient disponible pour y stocker de nouveau éléments. La concaténation des lignes valides des modules placés dans leur ordre d'allocation permet de reconstituer la liste dans son état courant. Afin de traiter une liste de NxS élements, on utilise par exemple N 30 TCAM, chacune pouvant contenir S entrées. Afin de gérer l'allocation dynamique des modules, une liste de priorité (non représentée) recense les modules et permet de les ordonner pour permettre de reconstituer correctement la liste initiale. La figure 3A illustre une liste de priorité 300. Une première colonne 301 comporte l'index des modules, dans leur ordre de priorité. Une deuxième colonne 302 comporte un paramètre de validité (V) indiquant si le module est alloué (V=1), c'est-à-dire qu'au moins une ligne du module stocke un élément de la liste dans laquelle la correspondance est recherchée, ou si le module n'est pas alloué (V=0), c'est-à-dire que le module est libre pour y stocker de nouveaux éléments de la liste. Pour reconstituer la liste dans laquelle la correspondance est recherchée, il suffit de concaténer, dans l'ordre donné par la liste de priorité, les lignes valides des modules alloués. Ainsi, dans l'exemple de la figure 3, pour reconstituer la liste, il faut concaténer les lignes valides du module d'index « 5 », puis celui d'index « 2 », puis celui d'index « 4 ». Dans la liste de priorité, les modules alloués sont placés avant les modules non alloués. Si par exemple, le module d'index « 5 » (TCAM5) vient à être vidé, c'est-à-dire que toutes ses lignes sont invalidées (ou effacées) son paramètre de validité V passe à « 0» et toutes les lignes de la liste 300 sont décalées comme illustré par la figure 3B. Ainsi, le module d'index « 2 » passe en tête de la liste et le module d'index « 5 » passe en module non alloué à la fin de la liste de priorité. Les modules vidés au cours du processus de recherche de correspondance peuvent se trouver dans n'importe quelle position dans la liste de priorité, en fonction des correspondances trouvées. Pour déterminer si un module est vide ou non, une table de comptage 400, illustrée par la figure 4, est mise à jour en fonction des inscriptions et ou effacement (ou invalidation) dans les modules. La table 400 comporte une colonne 401 listant les modules, par exemple en fonction de leur index, le module d'index « 0» (TCAMO) étant listé en premier, suivi du module d'index « 1 » (TCAM1) etc. Une deuxième colonne comporte une valeur de comptage pour chaque module, représentant le nombre de lignes valides dans le module. Ainsi, par exemple, le module d'index « 0» (TCAMO) comporte 20 lignes valides, c'est-à-dire que 20 éléments de la liste dans laquelle la correspondance est recherchée sont stockés dans ce module. Le module d'index « 1 » (TCAM1) comporte 31 lignes valides. Le module d'index « 3» (TCAM3) comporte 0 ligne valides, c'est-à-dire qu'il est vide et donc disponible pour allocation. Chaque fois qu'un nouvel élément intègre la liste, le compteur d'un module est incrémenté. Chaque fois qu'une correspondance est trouvée entre un élément entrant et un élément de la liste, cet élément de la liste est supprimé et le compteur du module dans lequel il était stocké est décrémenté. La recherche de correspondance entre un élément d'entrée et les éléments d'une liste peut être mise en oeuvre dans une unité de traitement de liste associative (ALPU), par exemple dans un routeur mettant en oeuvre une interface M Pl. Dans ce type d'interface, les messages arrivant à un noeud d'un réseau de communication doivent être acheminés pour être traités. Ainsi, une liste d'attente des messages à recevoir est établie et les adresses de stockage pour ces messages y sont associées. Lorsqu'un message arrive au noeud, il est comparé avec ceux de la liste d'attente (en utilisant une étiquette comme évoqué ci-dessus). Lorsqu'une correspondance est trouvée, le premier message correspondant dans l'ordre de la liste d'attente en est supprimé. Le message est alors acheminé en fonction de l'adresse associée. En référence à la figure 5, une implémentation matérielle pour une recherche de correspondance selon des modes de réalisation est décrite. Cette implémentation peut par exemple être faite sous la forme d'un circuit ASIC (acronyme de l'anglais « Application-Specific Integrated Circuit »). Une étiquette 500 (« hdr ») d'un élément est fournie parallèlement à une série de modules mémoire adressables par contenu. Dans cet exemple, il s'agit de N modules ternaires (modules TCAM) 501, ..., 502, nommés « TCAM 0 », ..., « TCAM N-1 » (par exemple N=32). Cette étiquette est ainsi comparée aux étiquettes (éventuellement masquées) des données stockées dans les modules. On le rappelle, les éléments stockés dans les modules sont ceux de la liste dans laquelle on recherche la correspondance avec l'élément de l'étiquette 500. Chaque module fournit en sortie un bit de correspondance 503, ..., 504 (nommés « hit_O », ..., « hit_N-1 ») dont la valeur est « 1 » si une correspondance a été trouvée et « O» si aucune correspondance n'a été trouvée dans le module. Chaque module fournit également un mot 505, ..., 506 (nommés « hit_addr_O », ..., « hit_addr_N-1 ») représentant l'adresse du premier élément dans le module à laquelle la correspondance a été trouvée. Les bits de correspondance fournis par les modules forment ainsi un 10 vecteur de résultat qui est donné en entrée à un module de ré-ordonnancement 507. On le rappelle, une correspondance peut être trouvée dans plusieurs modules, mais l'on ne souhaite conserver que la première. L'ordre dans lequel les bits de correspondance sont classés dans le vecteur de résultat est fixe alors que l'allocation des modules est dynamique. 15 Ainsi, le module 507donne en sortie, une liste de couples (V[K]&hit_[K] , T[K]) où T[K] et V[K] proviennent d'une liste de priorité telle que déjà décrite ci-avant en référence à la figure 3A d'un module 508 de gestion de liste de priorité. Dans cette liste de priorité, T[K] = Q si le module TCAM (TCAMQ) d'index Q a la priorité K dans la liste. 20 Cette liste ordonnée de couples permet à un module de sélection 509 de sélectionner le premier module TCAM de la liste vérifiant V[K] = hit_K = 1, c'est-à-dire le module TCAM de plus haute priorité, valide (V[K] = 1) et dans lequel une correspondance a été trouvée (hit_K = 1). Les modules 507 et 509 peuvent par exemple être réalisés au moyen 25 d'étages de multiplexeurs, log2(N+1) étages pour le module 507 et log2(N) étages pour le module 509 (10g2 représentant le logarithme de base 2). Il s'agit ici d'une mesure pouvant être généralisée à d'autres éléments de traitement du système. Ces éléments peuvent être réalisés au moyen d'étages de multiplexeurs dont le nombre (d'étages) peut être de l'ordre de log2(N), N étant 30 le nombre de TCAM utilisées (10g2 représentant le logarithme de base 2). Dans un exemple, on suppose que des correspondances sont trouvées dans les modules TCAM2 et TCAM5 (comme illustré par la figure 3A). En prenant l'exemple d'un vecteur de résultat avec des positions de 0 à 31 de gauche à droite (de manière générale, dans l'architecture matérielle, la convention est inverse, comme représenté dans la figure 5) celui-ci a pour six premiers bits 0, 0, 1, 0, 0, 1, 0, ... Le module de ré-ordonnancement produit les couples suivants (en prenant les priorités schématisées dans la figure 3) : , , , , ... (chaque couple est de la forme ). Le module 509 choisit le premier élément de cette liste (ou vecteur de couples) avec V[K]=hit_K=1, c'est-à-dire dans cet exemple, le couple . De retour à la figure 5, lorsque le module TCAM a été sélectionné par le module 509, le compteur associé à ce module TCAM est décrémenté. Ainsi, le module 509 fournit l'index de ce module TCAM à un module 510 de mise à jour. Ce module de mise à jour envoie un signal de décrémentation vers un module 511 de gestion de liste de priorité telle que décrite en référence à la figure 4 pour décrémenter la valeur de comptage associée au module TCAM sélectionné par le module 507. En réponse, le module 511 peut indiquer au module 510 que la valeur de comptage a atteint la valeur « 0 ». Dans ce cas, le module 510 envoie un signal de décalage vers un module 512 de décalage afin de placer le module TCAM en question (celui sélectionné par le module 509 et dont la valeur de comptage a atteint « 0 ») en queue de liste dans le module 508 et de décaler toutes les lignes de la liste comme décrit ci-avant en référence à la figure 3B. Ce signal de décalage indique aussi qu'il faut invalider le module en plaçant son bit de validité à « 0 ». Le module 512 se charge alors d'envoyer les signaux nécessaires au module 508 pour opérer ce décalage et cette invalidation. Dans l'exemple donné ci-avant où l'on a supposé que des correspondances sont trouvées dans les modules TCAM2 et TCAM5, on suppose en outre qu'il faut décrémenter le compteur du module TCAM5 car sa valeur de comptage a atteint « 0 ». De retour à la figure 5, une fois le module TCAM sélectionné par le module de sélection 509, il convient de délivrer la valeur qu'elle stocke. Ainsi, l'index du module TCAM est fourni à un multiplexeur 513 en tant que signal de sélection. Le multiplexeur reçoit par ailleurs en entrée les mots 505, ..., 506 (« hit_addr_O », ..., « hit_addr_N-1 ») délivrés par les modules TCAM 501, ..., 502. Le multiplexeur fournit ainsi le mot correspondant au module TCAM indiqué par le module de sélection 509 à une module de lecture 514. Le module de lecture se charge de lire la valeur stockée dans la TCAM indiquée par le module 509 (il reçoit le même signal de sélection que le module 513) et d'invalider la ligne de mémoire stockant cette valeur. L'invalidation se fait par exemple en mettant la ligne à zéro. L'invalidation peut aussi se faire en mettant un bit de validité associé à la ligne à zéro. La présente invention a été décrite et illustrée dans la présente description détaillée en référence aux figures jointes. Toutefois la présente invention ne se limite pas aux formes de réalisation présentées. D'autres variantes et modes de réalisation peuvent être déduits et mis en oeuvre par la personne du métier à la lecture de la présente description et des figures annexées. Dans les revendications, le terme "comporter" n'exclut pas d'autres éléments ou d'autres étapes. L'article indéfini « un » n'exclut pas le pluriel. Un seul processeur ou plusieurs autres unités peuvent être utilisées pour mettre en oeuvre l'invention. Les différentes caractéristiques présentées et/ou revendiquées peuvent être avantageusement combinées. Leur présence dans la description ou dans des revendications dépendantes différentes, n'exclut pas en effet la possibilité de les combiner. Les signes de référence ne sauraient être compris comme limitant la portée de l'invention. REVENDICATIONS1. Dispositif de recherche de correspondance d'élément dans une liste, le dispositif comportant: - une pluralité de modules (501, 502) de mémoire adressable par contenu configurés pour comparer en parallèle un élément d'entrée avec leur contenu, ladite liste étant représentée par la concaténation du contenu valide desdites mémoires selon un ordre défini par une liste de priorité, - un module (509) de de détermination, dans ladite liste de priorité, du premier module lequel l'élément d'entrée correspond à un élément stocké dans ledit module, et - un module (514) de lecture du premier élément dudit module déterminé correspondant à l'élément d'entrée. 2. Dispositif selon la revendication 1, comportant en outre : - un module (514) d'invalidation dudit premier élément, et - un module (510) de mise à jour d'un compteur d'éléments associé à ladite mémoire déterminée, ledit compteur d'élément représentant le nombre d'éléments stockés valides dans ladite mémoire. 3. Dispositif selon la revendication 2, dans lequel ledit module de mise à jour est en outre configuré pour lancer une mise à jour, lorsqu'un un module est vide, de ladite liste de priorité, ladite mise à jour permettant de placer ledit module à un niveau de priorité inférieur à celui des modules non vides. 4. Dispositif selon la revendication 2 ou 3, dans lequel un indice de priorité associé auxdites mémoires est mis à jour. 5. Dispositif selon la revendication 4, dans lequel ladite mise à jour comporte un décalage dudit module et des modules suivants dans la liste. 6. Dispositif selon l'une des revendications 1 à 5, dans lequel ladite liste de priorité comporte un paramètre pour chaque module, indiquant si chaque module est vide ou non. 7. Dispositif selon la revendication 6, dans lequel les modules sont classés en fonction dudit paramètre. 8. Dispositif selon l'une des revendications 1 à 7, dans lequel l'ordre des modules dans ladite liste de priorité reflète un ordre d'allocation. 9. Dispositif selon l'une des revendications 1 à 8, dans lequel ladite recherche de correspondance est effectuée par association d'une étiquette dudit élément avec une étiquette d'un élément de ladite liste. 10. Dispositif selon l'une des revendications 1 à 9, dans lequel lesdits modules sont des modules à mémoire adressable par contenu ternaires. 11. Dispositif selon l'une des revendications précédentes, comportant, pour traiter une liste de SxN éléments, N modules de mémoire 20 adressable par contenu, chaque module pouvant contenir S éléments. 12. Dispositif selon l'une des revendications précédentes, comportant au moins un module de traitement réalisé à partir de log2(N) étages de multiplexeurs, N étant le nombre de modules de mémoire adressable par 25 contenu. 13. Procédé de recherche de correspondance d'élément dans une liste, le procédé comportant les étapes suivantes : - de comparaison parallèle d'un élément d'entrée avec le contenu 30 d'une pluralité de modules de mémoire adressable par contenu, ladite liste étant représentée par la concaténation du contenu valide desdites mémoires selon un ordre défini par une liste de priorité,- de détermination, dans ladite liste de priorité, du premier module lequel l'élément d'entrée correspond à un élément stocké dans ledit module, - de lecture du premier élément dudit module déterminé correspondant à l'élément d'entrée. 5 14. Procédé selon la revendication 13, comportant en outre les étapes suivantes: - d'invalidation dudit premier élément, et - de mise à jour d'un compteur d'éléments associé à ladite mémoire 10 déterminée, ledit compteur d'élément représentant le nombre d'éléments stockés valides dans ladite mémoire. 15. Procédé selon la revendication 14, comportant en outre une étape de mise à jour, lorsqu'un un module est vide, de ladite liste de priorité, 15 ladite mise à jour permettant de placer ledit module à un niveau de priorité inférieur à celui des modules non vides. 16. Procédé selon la revendication 14 ou 15, dans lequel un indice de priorité associée audites mémoires est mis à jour. 17. Procédé selon la revendication 16, dans lequel ladite mise à jour comporte un décalage dudit module et des modules suivants dans la liste. 20 25