FR 3164038 A1 20260102 FR 2407069 A 20240628 Dispositif de calcul informatique à mémoire optimisée pour le calcul matriciel Dispositif de calcul informatique (100) comprenant une mémoire principale (104) configurée pour stocker une matrice creuse dans un format de vecteurs denses (106, 108, 110) et pour stocker un deuxième vecteur (112) ou une deuxième matrice, une unité de calcul (102) configurée pour multiplier la matrice creuse par le deuxième vecteur ou par la deuxième matrice, et un circuit de chargement (114) comprenant : - un bloc de chargement indexé (116) comportant une mémoire secondaire (118) et une mémoire FIFO de requêtes (120) d’envoi de valeurs stockées dans la mémoire secondaire vers l’unité de calcul ; - un moteur de chargement indexé (122) configuré pour générer et stocker séquentiellement les requêtes dans la mémoire FIFO de requêtes selon un ordre dans lequel les valeurs sont destinées à être envoyées à l’unité de calcul ; l’ordre de stockage des requêtes étant calculé et stocké sous la forme d’un microprogramme (124). Figure pour l'abrégé : Fig. 1 Dispositif de calcul informatique à mémoire optimisée pour le calcul matriciel La présente description concerne de façon générale le domaine des dispositifs de calculs informatiques, ou calculateurs, utilisés notamment pour la mise en œuvre de calculs matriciels. De nombreux calculs haute performance (HPC) impliquent la mise en œuvre de calculs matriciels, comme par exemple la résolution de systèmes d’équations différentielles partielles ou de graphes sémantiques. Il est fréquent que les matrices faisant l’objet de ces calculs correspondent à des matrices creuses, également appelées matrices peu denses ou éparses, comportant un nombre important d’éléments nuls, ou de zéros, par rapport au nombre total d’éléments. Ces calculs peuvent impliquer notamment l’exécution d’algorithmes pour la résolution de problèmes linéaires formulés sous la forme d’équations du type A.x = y (opération appelée « SpMV »), où A est une matrice creuse, x est un vecteur dense et y est le vecteur résultat de cette multiplication, ou du type A.X = Y , où X est une matrice dense (opération appelée « SpMM ») ou non (opération appelée « SpMSpM ») et Y est la matrice résultat de cette multiplication. Or, il est pertinent d’optimiser les dispositifs réalisant des calculs avec de telles matrices, en particulier lorsqu’il s’agit de matrices creuses de très grandes tailles comprenant par exemple des millions d’éléments nuls. Les algorithmes utilisés pour résoudre les équations impliquant des matrice creuses sont appelés « solveurs linéaires ». Il existe deux grandes familles de solveurs linéaires : les solveurs dits « direct » qui inversent la matrice A afin de réaliser l’opération x = A -1 . y , et les solveurs dits « de Krylov » basés sur un algorithme itératif modifiant le vecteur x à chaque itération jusqu’à trouver la solution. Les solveurs itératifs mettent en œuvre plusieurs multiplications matrice - vecteur à chaque itération, avec la même matrice creuse A utilisée à chaque fois. Pour les équations du type A.x = y, seul le vecteur x évolue à chaque itération. Ainsi, il est pertinent d’optimiser cette opération qui représente la majeure partie du temps d’exécution de l’opération. Il existe différentes façons de réaliser un calcul de type SpMV ou SpMM. Ainsi, les algorithmes de calcul de produit intérieur (algorithme « inner-product » en anglais) parcourent la matrice A ligne par ligne, et ceux de calcul de produit extérieur (algorithme « outer-product » en anglais) la parcourent colonne par colonne. Dans un algorithme de type « inner-product », c’est la lecture du vecteur x ou de la matrice X qui s’effectue de manière désordonnée et qui est dépendante de la structure de la matrice A . Dans un algorithme de type « outer-product », c’est l’accumulation réalisée dans le vecteur résultat y ou la matrice résultat Y qui s’effectue de manière désordonnée. Il existe certains formats de stockage des matrices creuses qui évitent de stocker tous les zéros de ces matrices. Ces formats correspondent par exemple au format CSR (« Compressed Sparse Row » en anglais, ou à lignes éparses compressées) ou CSC (« Compressed Sparse Column », ou à colonnes éparses compressées). Ces formats permettent de réduire la taille de la mémoire nécessaire à leur stockage. Mais en contrepartie, ils nécessitent de parcourir des tables qui contiennent des indices, c’est-à-dire les coordonnées ligne et colonne, des éléments non-nuls ainsi que leurs valeurs. La représentation CSR consiste à représenter la matrice sous forme de trois vecteurs denses. Le premier vecteur stocke la localisation des débuts de ligne de la matrice dans les deux autres vecteurs. Le deuxième vecteur contient, pour chaque ligne successivement, les indices des colonnes contenant des éléments non nuls de la matrice. Enfin, le troisième vecteur contient les éléments non nuls eux-mêmes dans le même ordre que les indices de colonne. En parcourant ces trois vecteurs, il est possible d’implémenter plus facilement un algorithme de type « inner-product », au prix toutefois d’une double indirection sur les éléments du vecteur x . Pour des matrices dites non triviales (c’est-à-dire comprenant plus d’un élément non nul par ligne), des données sont réutilisées lors de la lecture du vecteur x dans le cas d’un algorithme « inner-product », ou lors de l’accumulation du vecteur y dans le cas d’un algorithme « outer-product ». Cependant, la capacité du matériel à exploiter cette réutilisation temporelle des données va dépendre de la durée entre deux lectures d’un même élément du vecteur x ou entre deux accumulations du vecteur y , rapportée à la quantité de données que le matériel peut stocker localement. Dans le cas d’un algorithme « inner-product », les accès au vecteur x à travers un cache de premier niveau d’un processeur sont assez inefficaces car ils exploitent peu la localité spatiale inhérente aux structures de cache et le premier accès à une donnée ne peut être facilement prédit, causant des pics de latence réduisant les performances générales du dispositif de calcul. Les processeurs généralistes les plus performants ont mis en place des solutions de prédiction très évoluées, mais complexes et dont les performances sont peu prédictibles. Il existe des accélérateurs de multiplication matrice creuse – vecteur/matrice dense. Certains de ces accélérateurs utilisent des caches, ou mémoires caches, classiques dans leur fonctionnement. D’autres utilisent un circuit de chargement des accès mémoire (circuit appelé « streamer » en anglais) pour les fournir au processeur dans l’ordre des calculs pour optimiser les multiplications. Néanmoins, le coût matériel de ces solutions est très important. Il existe un besoin de proposer un dispositif de calcul informatique optimisé pour le calcul matriciel impliquant une matrice creuse, en particulier optimisant la gestion de la mémoire avec un coût matériel moindre que les solutions de l’art antérieur. Un mode de réalisation pallie tout ou partie des inconvénients des solutions existantes et propose un dispositif de calcul informatique comprenant au moins une mémoire principale configurée pour stocker au moins une matrice creuse dans un format de vecteurs denses et pour stocker au moins un deuxième vecteur ou une deuxième matrice, une unité de calcul configurée pour multiplier la matrice creuse par le deuxième vecteur ou par la deuxième matrice, et un circuit de chargement comprenant : - un bloc de chargement indexé comportant une mémoire secondaire configurée pour stocker temporairement des valeurs du deuxième vecteur ou de la deuxième matrice, et une mémoire FIFO de requêtes configurée pour stocker des requêtes d’envoi de valeurs stockées dans la mémoire secondaire vers l’unité de calcul, chacune des requêtes comportant au moins un champ de localisation au sein de la mémoire secondaire de la valeur destinée à être envoyée à l’unité de calcul lors d’une exécution de ladite requête ; - un moteur de chargement indexé configuré pour générer et stocker séquentiellement les requêtes dans la mémoire FIFO de requêtes selon un ordre dans lequel les valeurs sont destinées à être envoyées à l’unité de calcul, et pour commander, lors de la génération de chacune des requêtes et en l’absence dans la mémoire secondaire de la valeur destinée à être envoyée à l’unité de calcul lors de l’exécution de ladite requête, l’envoi de ladite valeur depuis la mémoire principale vers la mémoire secondaire ; et dans lequel l’ordre de stockage des requêtes est calculé et stocké dans la mémoire principale sous la forme d’un microprogramme comportant un vecteur de données spécifiant au moins, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire, une partie du champ de localisation de ladite valeur au sein de la mémoire secondaire. Selon un mode de réalisation particulier, le microprogramme comporte un vecteur de données spécifiant au moins, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire, le champ de localisation de ladite valeur au sein de la mémoire secondaire et un champ de présence ou non de ladite valeur dans la mémoire secondaire. Selon un mode de réalisation particulier, le circuit de chargement comporte en outre un bloc de chargement linéaire comprenant plusieurs mémoires FIFO de vecteurs configurées pour stocker des valeurs des vecteurs denses et du vecteur de données du microprogramme, et pour envoyer une première partie de ces valeurs à l’unité de calcul et une deuxième partie de ces valeurs au moteur de chargement indexé. Selon un mode de réalisation particulier, la mémoire principale est configurée pour stocker la matrice creuse dans un format CSR, et : - une première des mémoires FIFO de vecteurs est configurée pour stocker des valeurs d’un premier des vecteurs denses correspondant à des indices de lignes d’éléments non nuls de la matrice creuse, et pour envoyer ces valeurs à l’unité de calcul ; - une deuxième des mémoires FIFO de vecteurs est configurée pour stocker des valeurs d’un deuxième des vecteurs denses correspondant aux éléments non nuls de la matrice creuse, et pour envoyer ces valeurs à l’unité de calcul ; - une troisième des mémoires FIFO de vecteurs est configurée pour stocker des valeurs d’un troisième des vecteurs denses correspondant à des indices de colonnes des éléments non nuls de la matrice creuse, et pour envoyer ces valeurs au moteur de chargement indexé ; - une quatrième des mémoires FIFO de vecteurs est configurée pour stocker des valeurs du vecteur de données du microprogramme et pour envoyer ces valeurs au moteur de chargement indexé. Selon un mode de réalisation particulier, le bloc de chargement linéaire comporte en outre des moteurs de chargement linéaire configurés pour envoyer à la mémoire principale des requêtes d’envoi des valeurs des vecteurs denses et du vecteur de données du microprogramme vers les mémoires FIFO de vecteurs. Selon un mode de réalisation particulier, le vecteur de données du microprogramme spécifie en outre, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire, un champ de distance représentatif du nombre de requêtes à exécuter entre la requête d’envoi de ladite valeur et une précédente requête d’envoi de ladite valeur. Selon un mode de réalisation particulier, le bloc de chargement indexé est configuré pour déterminer un nombre de requêtes stockées dans la mémoire FIFO de requêtes, et pour stocker dans la mémoire FIFO de requêtes une requête envoyée par le moteur de chargement indexé lorsque la valeur du champ de distance de la requête reçue est supérieure au nombre de requêtes stockées dans la mémoire FIFO de requêtes. Selon un mode de réalisation particulier, la mémoire FIFO de requêtes est configurée pour stocker chacune des requêtes avec un champ de confirmation d’exécution de la requête tel que : - une requête générée pour une valeur présente dans la mémoire secondaire est stockée dans la mémoire FIFO de requêtes avec une première valeur du champ de confirmation d’exécution de la requête indiquant que la requête peut être exécutée ; - une requête générée pour une valeur absente de la mémoire secondaire est stockée dans la mémoire FIFO de requêtes avec une deuxième valeur du champ d’exécution de la requête indiquant que la requête ne peut pas être encore exécutée, cette deuxième valeur étant remplacée par la première valeur lorsque la valeur est ensuite reçue et stockée dans la mémoire secondaire. Selon un mode de réalisation particulier, le microprogramme est calculé tel que les valeurs du champ de localisation dans le vecteur de données sont déterminées en appliquant une politique de remplacement dépendant de l’utilisation des données. Selon un mode de réalisation particulier, la politique de remplacement met en œuvre un algorithme de type LRU et/ou Belady. Selon un mode de réalisation particulier, le microprogramme est calculé tel que, pour chacune des valeurs du deuxième vecteur ou de la deuxième matrice destinées à être envoyées à l’unité de calcul et déjà présentes dans la mémoire secondaire, la politique de remplacement est mise en jour en considérant les localisations desdites valeurs dans la mémoire secondaire. Selon un mode de réalisation particulier, le microprogramme est calculé tel que, pour chacune des valeurs du deuxième vecteur ou de la deuxième matrice destinées à être envoyées à l’unité de calcul et absentes de la mémoire secondaire et lorsque la mémoire secondaire n’est pas pleine, ladite valeur est stockée dans un emplacement libre de la mémoire secondaire. Selon un mode de réalisation particulier, le microprogramme est calculé tel que, pour chacune des valeurs du deuxième vecteur ou de la deuxième matrice destinées à être envoyées à l’unité de calcul et absentes de la mémoire secondaire et lorsque la mémoire secondaire est pleine, un emplacement de la mémoire secondaire occupé par une valeur est choisi conformément à la politique de remplacement appliquée et ladite valeur est stockée dans l’emplacement choisi de la mémoire secondaire. Selon un mode de réalisation particulier, le bloc de chargement indexé comporte au moins un répertoire configuré pour stocker, pour chaque valeur destinée à être stockée dans la mémoire secondaire, l’adresse de ladite valeur dans la mémoire principale, et dans lequel le vecteur de données du microprogramme spécifie, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire, une indication de la localisation de ladite valeur au sein de la mémoire secondaire. Selon un mode de réalisation particulier, le bloc de chargement indexé comporte en outre au moins un compteur configuré pour compter les données échangées par le bloc de chargement indexé. Ces caractéristiques et avantages, ainsi que d'autres, seront exposés en détail dans la description suivante de modes de réalisation particuliers faite à titre non limitatif en relation avec les figures jointes parmi lesquelles : - la FIG. 1 représente schématiquement un exemple de dispositif de calcul informatique selon un mode de réalisation particulier ; - la FIG. 2 représente un exemple de logigramme de fonctionnement d’un dispositif de calcul informatique selon un mode de réalisation particulier ; - la FIG. 3 représente un exemple de logigramme mis en œuvre pour un calcul d’un microprogramme utilisé dans un dispositif de calcul informatique selon un mode de réalisation particulier ; - la FIG. 4 représente schématiquement un exemple de dispositif de calcul informatique selon une variante du mode de réalisation particulier. De mêmes éléments ont été désignés par de mêmes références dans les différentes figures. En particulier, les éléments structurels et/ou fonctionnels communs aux différents modes de réalisation peuvent présenter les mêmes références et peuvent disposer de propriétés structurelles, dimensionnelles et matérielles identiques. Par souci de clarté, seuls les étapes et éléments utiles à la compréhension des modes de réalisation décrits ont été représentés et sont détaillés. En particulier, différents éléments (unité de calcul, mémoire principale, mémoire secondaire, blocs de chargement, moteurs de chargement, etc.) du dispositif de calcul informatique ne sont pas détaillés. L’homme du métier sera à même de réaliser de manière détaillée ces éléments à partir de la description fonctionnelle donnée ici. Sauf précision contraire, lorsque l'on fait référence à deux éléments connectés entre eux, cela signifie directement connectés sans éléments intermédiaires autres que des conducteurs, et lorsque l'on fait référence à deux éléments reliés (en anglais "coupled") entre eux, cela signifie que ces deux éléments peuvent être connectés ou être reliés par l'intermédiaire d'un ou plusieurs autres éléments. Dans la description qui suit, lorsque l'on fait référence à des qualificatifs de position absolue, tels que les termes "avant", "arrière", "haut", "bas", "gauche", "droite", etc., ou relative, tels que les termes "dessus", "dessous", "supérieur", "inférieur", etc., ou à des qualificatifs d'orientation, tels que les termes "horizontal", "vertical", etc., il est fait référence sauf précision contraire à l'orientation des figures dans une position normale d'utilisation. Sauf précision contraire, les expressions "environ", "approximativement", "sensiblement", et "de l'ordre de" signifient à 10 % près, de préférence à 5 % près. Dans tout le document, le terme « vecteur » est utilisé pour désigner une matrice ligne ou une matrice colonne. Un exemple de dispositif de calcul informatique 100 selon un mode de réalisation particulier est décrit ci-dessous en lien avec la FIG. 1 . Dans l’exemple décrit, le dispositif 100 est configuré pour mettre en œuvre des algorithmes de multiplication d’une matrice creuse A avec un deuxième vecteur b (opération SpMV) ou une deuxième matrice B (opération SpMM). Le dispositif 100 comporte une unité de calcul 102 qui correspond par exemple à un processeur tel qu’un CPU (« Central Processing Unit » en anglais, ou unité centrale de calcul) ou un GPU (« Graphics Processing Unit » en anglais, ou processeur graphique) ou tout autre circuit électronique / informatique adapté à la mise en œuvre des calculs réalisés par le dispositif 100. Le dispositif 100 comporte également une mémoire principale, ou mémoire externe, 104, par exemple de type RAM (« Random Access Memory » en anglais, ou mémoire vive) et typiquement une DRAM (« Dynamic Random Access Memory » en anglais, ou mémoire vive dynamique). La mémoire principale 104 est configurée pour stocker notamment au moins une matrice creuse dans un format de vecteurs denses. Dans l’exemple de la FIG. 1 , la mémoire principale 104 stocke une matrice creuse dans un format CSR, c’est-à-dire sous la forme de données stockées dans un premier vecteur dense 106 comprenant les indices de ligne des éléments non nuls de la matrice creuse, dans un deuxième vecteur dense 108 comprenant les éléments non nuls de la matrice creuse, et dans un troisième vecteur dense 110 comprenant les indices de colonne des éléments non nuls de la matrice creuse. Dans le format CSR, les indices de ligne pointent, pour chaque ligne de la matrice, l’indice du début de cette ligne dans les vecteurs des indice de colonnes et des éléments non nuls. En variante, il est possible que la mémoire principale 104 stocke la matrice creuse dans un format de vecteurs denses autre que le format CSR. Le format d’encodage de la matrice creuse faisant l’objet du calcul réalisé par le dispositif 100 peut par exemple être choisi en fonction de la structure interne de la matrice et/ou des caractéristiques de l’unité de calcul 102. Par exemple, il est possible que la mémoire principale 104 stocke la matrice creuse dans un format COO (« COOrdinate list » en anglais, ou liste de coordonnées) dans lequel chaque élément non nul de la matrice creuse, stocké dans un vecteur dense, est associé à ses coordonnées ligne/colonne dans la matrice, ces coordonnées étant stockées dans deux autres vecteurs denses. Ces coordonnées peuvent être triées pour permettre une implémentation plus efficace d’une multiplication de la matrice creuse avec un vecteur ou une autre matrice. Selon un autre exemple, il est possible que la mémoire principale 104 stocke la matrice creuse dans un format BCSR (« Block Compressed Sparse Row » en anglais, ou à lignes éparses compressées en blocs), ou BSR (« Block Sparse Row » en anglais, ou à lignes éparses en blocs) dans lequel des blocs denses de taille fixe (2 lignes x 2 colonnes par exemple) sont stockés par indice. Ce format tire parti du fait que les matrices sont souvent localement denses et globalement creuses. Il réduit ainsi le nombre d’indices stockés en mémoire au prix de l’insertion de zéros dans les blocs denses. Des heuristiques permettent par exemple de choisir la taille idéale de ces blocs denses. Selon un autre exemple, la matrice creuse peut être stockée dans le format CSC pour la réalisation par exemple d’une multiplication du type A T .x=y ou A T est la matrice transposée de A. En variante, d’autres formats de stockage de matrice creuse sous forme de vecteurs denses sont possibles. Par exemple, toute forme d’indirection déterministe pointant sur des éléments ou des sous-blocs denses d’une matrice creuse peut être utilisée. Le format de stockage de la matrice creuse dans la mémoire principale 104 peut notamment être choisi tel qu’il soit adapté à la manière de parcourir la matrice creuse par l’algorithme de multiplication mis en œuvre dans l’unité de calcul 102. Par exemple, un stockage de la matrice creuse au format CSR peut être avantageux dans le cas d’une multiplication matricielle impliquant un algorithme de type « inner-product », alors qu’un stockage de la matrice creuse au format CSC peut être avantageux dans le cas d’une multiplication matricielle impliquant un algorithme de type « outer-product ». La mémoire principale 104 est également configurée pour stocker au moins un deuxième vecteur ou une deuxième matrice destinée à être multipliée avec la matrice creuse. Sur l’exemple de la FIG. 1 , un deuxième vecteur 112 est stocké dans la mémoire principale 104. Le dispositif 100 comporte également un circuit de chargement 114, ou « streamer », optimisé pour le chargement en mémoire des données pour la mise en œuvre d’une multiplication de la matrice creuse par le deuxième vecteur 112 ou par la deuxième matrice. Le circuit de chargement 114 comprend au moins : - un bloc de chargement indexé 116 comportant une mémoire secondaire 118 configurée pour stocker temporairement des valeurs du deuxième vecteur 112 ou de la deuxième matrice, et une mémoire FIFO (« First In First Out » en anglais, ou premier entré premier sorti) de requêtes 120 configurée pour stocker des requêtes d’envoi de valeurs stockées dans la mémoire secondaire 118 vers l’unité de calcul 102 ; – un moteur de chargement indexé 122 configuré pour générer et stocker séquentiellement les requêtes dans la mémoire FIFO de requêtes 120 selon un ordre dans lequel les valeurs sont destinées à être envoyées à l’unité de calcul 102, et pour commander, lors de la génération de chacune des requêtes et en l’absence dans la mémoire secondaire 118 de la valeur destinée à être envoyée à l’unité de calcul 102 lors de l’exécution de la requête, l’envoi de ladite valeur depuis la mémoire principale 104 vers la mémoire secondaire 118. Chacune des requêtes destinées à être stockées dans la mémoire FIFO de requêtes 120 comporte au moins un champ de localisation, représentatif de la localisation au sein de la mémoire secondaire 118, de la valeur destinée à être envoyée à l’unité de calcul 102 lors d’une exécution de la requête. En outre, dans l’exemple de réalisation décrit, la mémoire FIFO de requêtes 120 est configurée pour stocker chacune des requêtes avec un champ de confirmation d’exécution de la requête tel que : - une requête générée pour une valeur présente dans la mémoire secondaire 118 est stockée dans la mémoire FIFO de requêtes 120 avec une première valeur du champ de confirmation d’exécution de la requête indiquant que la requête peut être exécutée ; - une requête générée pour une valeur absente de la mémoire secondaire 118 est stockée dans la mémoire FIFO de requêtes 120 avec une deuxième valeur du champ d’exécution de la requête indiquant que la requête ne peut pas être encore exécutée, cette deuxième valeur étant remplacée par la première valeur lorsque la valeur est ensuite reçue et stockée dans la mémoire secondaire 118. Dans l’exemple de la FIG. 1 , la mémoire principale 104 est également configurée pour stocker un microprogramme 124 comprenant un vecteur de données spécifiant au moins, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire 118, le champ de localisation de la valeur au sein de la mémoire secondaire 118 et un champ de présence ou non de la valeur dans la mémoire secondaire 118. Le microprogramme 124 comporte des données de commande de mémoire dont la fonction est détaillée plus loin et qui sont décodées par le moteur de chargement indexé 122. En variante, le microprogramme 124 pourrait être stocké au sein d’un des vecteurs denses de la matrice creuse, par exemple le troisième vecteur 110 comprenant les indices de colonnes, en réservant certains bits de ce vecteur pour le stockage de ce microprogramme 124 (par exemple en utilisant les bits de poids fort des indices de colonne du format CSR). Dans l’exemple de la FIG. 1 , le circuit de chargement 114 comporte en outre un bloc de chargement linéaire 126 comprenant plusieurs mémoires FIFO de vecteurs configurées pour stocker les valeurs des vecteurs denses 106, 108, 110 et du vecteur de données du microprogramme 124 stockés dans la mémoire principale 104. Sur l’exemple de la FIG. 1 , une première mémoire FIFO de vecteur 128 est configurée pour recevoir les valeurs les indices de ligne stockées dans le premier vecteur dense 106, une deuxième mémoire FIFO de vecteur 130 est configurée pour recevoir les valeurs des éléments non nuls de la matrice creuse stockées dans le deuxième vecteur dense 108, une troisième mémoire FIFO de vecteur 132 est configurée pour recevoir les valeurs des indices de colonne stockées dans le troisième vecteur dense 110, et une quatrième mémoire FIFO de vecteur 134 est configurée pour recevoir les valeurs du vecteur de données du microprogramme 124. Dans l’exemple de la FIG. 1 , le bloc de chargement linéaire 126 comporte en outre des moteurs de chargement linéaire 136 configurés pour envoyer à la mémoire principale 104 des requêtes d’envoi des valeurs des vecteurs denses 106, 108, 110 et du vecteur de données du microprogramme 124 vers les mémoires FIFO de vecteur 128, 130, 132 et 134. Dans la configuration représentée sur la FIG. 1 , ces requêtes sont envoyées dans un premier MSHR 138 (« Miss Status Handling Register » en anglais), ou registre ou tracker, configuré pour retransmettre ces requêtes à la mémoire principale 104. Ces moteurs de chargement linéaire 136 correspondent par exemple à des machines, ou automates, à états finis (FSM ou « Finite State Machine » en anglais) programmées de manière logiciel dans le bloc de chargement linéaire 126. Ainsi, le bloc d’ordonnancement linéaire 126 est configuré pour lire et charger en mémoire les valeurs des vecteurs denses 106, 108, 110 représentant la matrice creuse, ainsi que le microprogramme 124 stocké dans la mémoire principale 104. Une partie des informations stockées dans les mémoires FIFO 128, 130, 132 et 134 est envoyée à l’unité de calcul 102 pour exécuter les boucles externes et internes de la multiplication de la matrice creuse par le deuxième vecteur 112. Dans l’exemple décrit, ces informations correspondent aux valeurs des indices de ligne et des éléments non nuls stockées dans les première et deuxième mémoires FIFO de vecteur 128, 130. Une autre partie de ces informations est envoyée au moteur de chargement indexé 122, à savoir les valeurs des indices de colonne et du vecteur de données du microprogramme 124 stockées dans les troisième et quatrième mémoires FIFO 132, 134. Le moteur de chargement indexé 122 est configuré pour commander, lors de la génération de chacune des requêtes et en l’absence dans la mémoire secondaire 118 de la valeur destinée à être envoyée à l’unité de calcul 102 lors de l’exécution de ladite requête, l’envoi de cette valeur depuis la mémoire principale 104 (stockée dans le deuxième vecteur 112) vers la mémoire secondaire 118. Dans l’exemple de la FIG. 1 , cette commande est réalisée à travers un deuxième MSHR 140. Le deuxième MSHR 140 peut permettre de garder la trace des éléments manquants dans la mémoire secondaire 118, et donc des accès à la mémoire principale 104 réalisés pour obtenir des valeurs du deuxième vecteur 112. Ce deuxième MSHR 140 peut permettre également de regrouper les requêtes envoyées vers la mémoire principale 104 et ainsi utiliser plus efficacement le bus mémoire entre la mémoire principale 104 et le circuit de chargement 114. Le moteur de chargement indexé 122 peut notamment être configuré pour calculer les adresses, au sein du deuxième vecteur 112, auxquelles sont stockées les valeurs à envoyer à la mémoire secondaire 118. Ainsi, la mémoire secondaire 118 forme une mémoire dans lequel les valeurs du deuxième vecteur 112 ou de la deuxième matrice sont stockées. Des accès à la mémoire principale 104 sont générés par le moteur de chargement indexé 122 en cas d’absence de la valeur souhaitée dans la mémoire secondaire 118, c’est-à-dire en fonction de l’indicateur de la présence ou non de ladite valeur dans la mémoire secondaire 118 fournit par le microprogramme 124. Une fois les éléments du deuxième vecteur 112 ou de la deuxième matrice présents dans la mémoire secondaire 118, l’exécution séquentielle des requêtes stockées dans la mémoire FIFO de requêtes 120 envoie, dans le même ordre que celui de l’exécution de ces requêtes, les données à l’unité de calcul 102 pour que celle-ci puisse exécuter l’algorithme de multiplication matricielle entre la matrice creuse et le deuxième vecteur 112 ou la deuxième matrice. Les requêtes d’envoi sont donc stockées séquentiellement dans la mémoire FIFO de requêtes 120 selon un ordre dans lequel les valeurs du deuxième vecteur 112 ou de la deuxième matrice sont destinées à être envoyées à l’unité de calcul 102. Cet ordre d’exécution des requêtes permet au circuit de chargement 114 de rester synchronisé avec l’unité de calcul 102 lors de l’exécution du calcul matriciel. Les données issues du deuxième vecteur 112 ou de la deuxième matrice peuvent être à précision variable. Ainsi, le nombre d’entrées dans la mémoire secondaire 118, c’est-à-dire le nombre de données du deuxième vecteur 112 ou de la deuxième matrice pouvant être stockées dans la mémoire secondaire 118, peut dépendre de la précision choisie, spécifiée par le choix de la configuration du circuit de chargement 114. Dans l’exemple de réalisation décrit, le vecteur de données du microprogramme 124 comporte en outre, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire 118, un champ de distance dont la valeur est représentative du nombre de requêtes à exécuter entre la requête d’envoi de cette valeur et une précédente requête d’envoi de ladite valeur. En outre, dans l’exemple de réalisation décrit, le bloc de chargement indexé 116 peut être configuré pour déterminer un nombre restant de requêtes stockées dans la mémoire FIFO de requêtes 120, et pour stocker dans la mémoire FIFO de requêtes 120 une requête envoyée par le moteur de chargement indexé 122 lorsque la valeur du champ de distance reçue est inférieure au nombre restant de requêtes stockées dans la mémoire FIFO de requêtes 120. Par exemple, à l’entrée du bloc de chargement indexé 116, des compteurs de requêtes et de réponses, par exemple intégrés au deuxième MSHR 140, peuvent permettre de bloquer ou de laisser passer une requête envoyée vers la mémoire principale 104 en fonction de la valeur du champ de distance associé à la requête. Un tel blocage peut servir à éviter un remplacement prématuré d’une donnée stockée dans la mémoire secondaire 118, et éviter au final le renvoi d’une donnée erronée à l’unité de calcul 102. Dans l’exemple de réalisation décrit, le microprogramme 124 peut être calculé tel que les valeurs du champ de localisation dans le vecteur de données du microprogramme 124 soient déterminées en appliquant une politique de remplacement dans la mémoire secondaire 118 qui soit fonction de l’utilisation des données. Le microprogramme 124 peut ainsi servir à gérer la survenance d’un conflit au moment d’un remplacement d’une donnée présente dans la mémoire secondaire 118 par une autre donnée issue du deuxième vecteur 112 ou de la deuxième matrice et envoyée à la mémoire secondaire 118. Un tel conflit peut se produire quand l’emplacement de la mémoire secondaire 118 dans lequel une donnée est destinée à être stockée contient une donnée non encore lue par l’unité de calcul 102. Bien que la politique de remplacement appliquée puisse minimiser la survenance d’un tel conflit, celui-ci peut se produire par exemple lorsqu’un grand nombre de données sont destinées à être stockées dans la mémoire secondaire 118 et qu’il y a peu d’emplacements dans celle-ci (par exemple dans le cas de stockage de gros blocs de données et/ou dans le cas d’une précision très grande des données stockées). Un exemple de fonctionnement du dispositif 100 est décrit ci-dessous en lien avec la FIG. 2 qui représente schématiquement un logigramme de fonctionnement du dispositif 100. Dans ce logigramme, les étapes mises en œuvre sont regroupées par colonne correspondant chacune à un des éléments du dispositif 100 (la référence numérique de chacun de ces éléments est indiquée dans la colonne correspondante à cet élément). Au cours d’une étape 202, l’unité de calcul 102 configure le circuit de chargement 114 et démarre les moteurs de chargement linéaire 136. Cette étape de configuration peut consister à charger dans le circuit de chargement 114 des éléments tels que les adresses de base des vecteurs et matrices, la taille des éléments de chaque vecteur et matrice et le pas fixe (« stride » en anglais) qui les sépare, le nombre d’éléments de chaque vecteur et matrice, le nombre d’éléments de la matrice dense à charger à chaque requête dans le cas d’une opération de type SpMM, le mode de fonctionnement du bloc de chargement indexé 116 (fonctionnement analogue à celui d’une mémoire cache ou d’une mémoire FIFO), des signaux de commande de démarrage et d’arrêt de chargement de données, etc. Les moteurs de chargement linéaire 136 reçoivent la configuration reçue depuis l’unité de calcul 102 et démarrent à la réception du signal de commande de démarrage. Les moteurs de chargement linéaire 136 lancent donc la lecture des différents vecteurs denses 106, 108 et 110 décrivant la matrice creuse ainsi que le microprogramme 124 (étapes 204, 206, 208 et 210 correspondant respectivement aux chargements des vecteurs 106, 108, 110 et 124). Par exemple, pour le chargement de chacun de ces vecteurs, les moteurs de chargement linéaire 126 regroupent des requêtes d’envoi des données de ces vecteurs par exemple destinées à une même ligne de cache (typiquement de 512 bits) ou de la largeur du bus mémoire reliant le bloc de chargement linéaire 126 à la mémoire principale 104 avant d’envoyer une requête agrégée au premier MSHR 138. Par exemple, au cours d’une étape 212, le premier MSHR 138 peut réaliser un arbitrage entre les requêtes reçues depuis les moteurs de chargement linéaire 136. Le premier MSHR 138 peut envoyer ensuite ces requêtes à la mémoire principale 104 (étape 214). La mémoire principale 104 peut ensuite envoyer les valeurs demandées au premier MSHR 138 (étape 216). Lorsque les données demandées dans les requêtes sont envoyées par la mémoire principale 104, elles sont reçues par le premier MSHR (étape 218) puis envoyées aux différentes mémoires FIFO de vecteur du bloc de chargement linéaire 126 (étapes 220, 222, 224 et 226 correspondant respectivement au stockage dans les mémoires FIFO de vecteur 128, 130, 132 et 134). Dans l’exemple décrit, les valeurs des indices de colonne et du vecteur de données du microprogramme 124 sont envoyées au moteur de chargement indexé 122 qui calcule les adresses des valeurs dans le deuxième vecteur 112 ou la deuxième matrice (étape 228) et décode le microprogramme 124 (étape 230). Le moteur de chargement indexé peut générer ensuite les requêtes à envoyer au bloc de chargement indexé 116 (étape 232). Pour chaque requête reçue, le bloc de chargement indexé 116 peut vérifier qu’il y a au moins une place disponible dans la mémoire FIFO de requêtes 120 et bloque le traitement de la requête si la mémoire FIFO de requêtes 120 est pleine. Pour chaque requête reçue, le bloc de chargement indexé 116 peut ensuite tester la valeur du champ de présence ou non de ladite valeur dans la mémoire secondaire 118 (étape 234). Si la valeur est déjà présente dans la mémoire secondaire 118 (survenance d’un « hit »), le bloc de chargement indexé 116 peut envoyer cette requête dans la mémoire FIFO de requête 120 avec le champ de confirmation d’exécution de la requête à une première valeur indiquant que la requête peut être exécutée (étape 236) et lire la requête suivante envoyée par le moteur de chargement indexé (étape 238). Si la valeur est absente de la mémoire secondaire 118 (survenance d’un « miss »), le bloc de chargement indexé 116 teste si la valeur du champ de distance de cette requête est nulle (étape 240). Si cette valeur est nulle, le bloc de chargement indexé 116 envoie cette requête à la mémoire FIFO de requêtes 120 avec le champ de confirmation d’exécution de la requête à une deuxième valeur indiquant que la requête ne peut pas être encore exécutée (étape 242) et envoie au deuxième MSHR 140 une requête de demande d’envoi de valeur depuis le deuxième vecteur 112 ou la deuxième matrice (étape 244). Si la valeur du champ de distance de cette requête n’est pas nulle, la valeur de ce champ est comparée au nombre de requêtes présentes dans la mémoire FIFO de requêtes 120 (étape 246). Si la valeur de ce champ est supérieure au nombre de requêtes présentes dans la mémoire FIFO de requêtes 120, le bloc de chargement indexé 116 envoie cette requête à la mémoire FIFO de requêtes 120 avec le champ de confirmation d’exécution de la requête à la deuxième valeur (étape 242) et envoie au deuxième MSHR 140 une requête de demande d’envoi de valeur depuis le deuxième vecteur 112 ou la deuxième matrice (étape 244). Dans le cas contraire, ce test est réitéré jusqu’à ce que le nombre de requêtes présentes dans la mémoire FIFO de requêtes 120 soit inférieur à la valeur du champ de distance, bloquant ainsi la requête tant que la mémoire FIFO de requêtes 120 contient plus de requêtes que la valeur du champ de distance. Suite à la réception de plusieurs requêtes, le deuxième MSHR 140 peut essayer de regrouper une ou plusieurs requêtes mémoire en cours (étapes 248, 250) puis les transmet à la mémoire principale 104 (étape 252) si le regroupement échoue. A la réception de la ou des requêtes envoyées par le deuxième MSHR 140, la mémoire principale 104 peut envoyer les valeurs demandées au deuxième MSHR 140 (étape 254). A la réception de ces valeurs par le deuxième MSHR (étape 256), la ou les valeurs reçues peuvent être envoyées dans la mémoire secondaire 118 pour écriture (étape 258), et le champ de confirmation d’exécution de la requête peut être mis à jour dans la mémoire FIFO de requêtes 120 en la passant à la première valeur (étape 260). La mémoire FIFO de requêtes 120 peut ensuite lire la requête suivante envoyée par le moteur de chargement indexé (étape 238). En présence d’une requête stocké avec le champ de confirmation à la première valeur indiquant que la requête peut être exécutée, en tête de la mémoire FIFO de requêtes 120, la mémoire secondaire 118 transmet les valeurs stockées à l’unité de calcul 102 (étape 262), celle-ci mettant en œuvre l’algorithme de calcul de multiplication entre la matrice creuse et le deuxième vecteur 112 ou la deuxième matrice à partir des données reçues depuis les mémoires FIFO de vecteur 128, 130, 132 et 134 et la mémoire secondaire 118 (étape 264). Comme indiqué précédemment, le microprogramme 124 spécifie au moins, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire 118, un champ de localisation de ladite valeur au sein de la mémoire secondaire 118 et un champ de présence ou non de ladite valeur dans la mémoire secondaire 118. Ce microprogramme 124 est précalculé avant de mettre en œuvre les étapes précédemment décrites en lien avec la FIG. 2 . La fait que le microprogramme 124 soit précalculé permet la mise en œuvre d’une politique de remplacement des données stockées dans la mémoire secondaire 118 (lorsqu’une donnée du deuxième vecteur 112 ou de la deuxième matrice doit être écrite dans la mémoire secondaire 118 mais que celle-ci est pleine) qui serait très coûteuse à implémenter de manière matérielle. La FIG. 3 représente un exemple de logigramme mis en œuvre pour le calcul du microprogramme 124. Dans l’exemple décrit, le microprogramme 124 comporte une suite de triplets (champ de localisation, champ de présence ou non, champ de distance) associé chacun à un des éléments non nuls de la matrice creuse. Le champ de localisation est utilisé pour localiser la donnée dans la mémoire secondaire 118. Le champ de présence ou non de la valeur dans la mémoire secondaire 118 indique si la donnée est présente dans la mémoire secondaire 118 ou s’il faut la charger dans la mémoire secondaire 118 depuis la mémoire principale 104. Enfin, la valeur du champ de distance est représentative du nombre de requêtes à exécuter entre deux requêtes consécutives d’envoi de la valeur associée à la requête et stockée dans la mémoire secondaire 118, et est utilisée pour ne pas remplacer une donnée stockée dans la mémoire secondaire 118 qui n’a pas encore été lue par l’unité de calcul 102. Ce logigramme peut être mis en œuvre par l’unité de calcul 102 ou un autre processeur (par exemple un processeur hôte) ou un accélérateur dédié du dispositif 100. Un indice de colonne de la matrice creuse est tout d’abord considéré (étape 300). A l’étape 302, une représentation interne de la mémoire secondaire 118 que comporte le programme mettant en œuvre ce logigramme est inspectée. Il est ensuite vérifié si la valeur du deuxième vecteur 112 ou de la deuxième matrice associée à cet indice de colonne est présente dans la mémoire secondaire 118 (étape 304). Si c’est le cas, la politique de remplacement est mise à jour (étape 306), par exemple en plaçant cette donnée à la fin d’une liste des données les moins utilisées dans le cas d’une politique de remplacement de type LRU (« Least Recently Used » en anglais, dans lequel la ligne utilisée le moins récemment est remplacée en priorité). Les données du microprogramme 124 (un triplet dans l’exemple décrit) associées à cette valeur sont alors définies telles que le champ de localisation pointe vers l’adresse dans la mémoire secondaire 118 où se trouve la donnée, que le champ de présence ou non indique la présence de la donnée dans la mémoire secondaire 118 et le champ de distance soit mis à 0 (étape 308). Dans le cas où la valeur n’est pas présente dans la mémoire secondaire 118, il est vérifié si la mémoire secondaire 118 est pleine (étape 310). Si ce n’est pas le cas, le triplet associé à cette valeur est défini tel que le champ de localisation indique une adresse libre de la mémoire secondaire 118, que le champ de présence ou non indique l’absence de la donnée dans la mémoire secondaire 118 et le champ de distance soit mis à 0 (étape 312). Si la mémoire secondaire 118 est pleine, une valeur stockée dans la mémoire secondaire 118 est choisie pour être évincée (étape 314). Par exemple, dans le cas de l’application d’une politique de remplacement de type LRU, la valeur se trouvant en tête de la liste des entrées les moins utilisées est choisie comme étant celle à évincer. Une fois cette entrée choisie, il est vérifié que la valeur remplacée n’est pas en cours d’utilisation, afin de garantir que l’unité de calcul 102 a lu cette valeur. Pour cela, une distance entre la requête courante et celle qui a utilisé cette valeur pour la dernière fois est calculée (étape 316), puis cette distance est comparée à la taille de la mémoire FIFO de requêtes 120 (étape 318). Si cette distance est supérieure à la taille de la mémoire FIFO de requêtes 120, il est possible de considérer que la valeur considérée a déjà été lue par l’unité de calcul 102 lorsque la valeur choisie est remplacée. Dans ce cas, le triplet associé à cette valeur est défini tel que le champ de localisation indique l’adresse de la valeur à évincer, que le champ de présence ou non de la valeur indique l’absence de la valeur dans la mémoire secondaire 118 et que le champ de distance est mis à 0 (étape 320). Sinon, le triplet associé à cette donnée est défini tel que le champ de localisation indique l’adresse de la valeur à évincer, que le champ de présence ou non indique l’absence de la valeur dans la mémoire secondaire 118 et que le champ de distance soit mis à la valeur de la distance calculée (étape 322). Dans l’exemple ci-dessus, la politique de remplacement appliquée pour définir les données du vecteur du microprogramme 124 est de type LRU. En variante, il est possible que cette politique de remplacement corresponde à un algorithme optimal, ou algorithme de Belady, dans lequel la valeur remplacée est celle qui ne sera pas utilisée pour la plus grande période de temps à venir. L’utilisation d’une telle politique de remplacement permet de produire un meilleur taux de hit, c’est-à-dire une plus grande fréquence de cas où les valeurs faisant l’objet des requêtes sont déjà présentes dans la mémoire secondaire 118. Toutefois, l’application de cette politique de remplacement créé le risque de remplacer une valeur n’ayant pas été encore lue par l’unité de calcul 102, pouvant causer un conflit et un blocage réduisant les performances du dispositif 100. Selon une autre variante, il est possible d’appliquer une politique de remplacement des valeurs stockées dans la mémoire secondaire 118 combinant les politiques de remplacement de types LRU et Belady. Pour cela, il est possible de n’appliquer la politique de remplacement de type Belady que sur un nombre limité N de valeurs stockées dans la mémoire secondaire 118 correspondant à celles les moins récemment utilisées. Une telle variante limite les risques de conflit exposés précédemment. La valeur de N peut être modulée selon la capacité de stockage de la mémoire secondaire 118, qui dépend également de la taille des données à stocker. En variante, d’autres types de politiques de remplacement peuvent être mises en œuvre, par exemple de type pseudo-LRU. En variante des exemples précédemment décrits, le bloc de chargement indexé 116 peut comporter un répertoire 142 comprenant par exemple, pour chaque entrée de la mémoire secondaire 118, l’adresse de cette donnée dans la mémoire principale 104. Ce répertoire 142 permet d’envisager des utilisations du dispositif 100 où seule une partie de la politique de remplacement est précalculée, voire de mettre en œuvre temporairement le calcul matriciel sans faire appel au microprogramme 124, par exemple lors du calcul de ce microprogramme 124. En outre, lorsque le bloc de chargement indexé 116 comporte un tel répertoire 142, les données du microprogramme 124 peuvent ne pas comporter le champ de présence ou non de la valeur de la requête considérée. En outre, dans une telle variante, le microprogramme 124 peut fournir au moins partiellement le numéro de voie (way) concernée de la mémoire secondaire 118 de manière à consulter un nombre plus réduit d’entrées pour déterminer la présence ou l’absence de la donnée concernée. La FIG. 4 représente schématiquement un exemple de réalisation du dispositif 100 comportant un tel répertoire 142. Dans cette variante, le dispositif 100 comporte tous les éléments précédemment décrits en lien avec la FIG. 1 , ainsi que le répertoire 142 inclus dans le bloc de chargement indexé 116. Ce répertoire 142 inclut, pour chaque entrée de la mémoire secondaire 118, son adresse dans la mémoire secondaire 118. Dans cette variante, le microprogramme 124 forme un vecteur de données spécifiant, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire 118, une indication de la localisation de ladite valeur au sein de la mémoire secondaire 118, cette indication de la localisation correspondant par exemple à une partie du numéro de voie, ou way, du cache formé par le répertoire 142 et la mémoire secondaire 118. Cette indication de la localisation de la donnée est transmise depuis le moteur de chargement indexé 122 au répertoire 142 qui peut transmettre ensuite à la mémoire FIFO de requêtes 120 l’adresse complète de la donnée concernée. Dans une telle variante, la mémoire secondaire 118 associée au répertoire 142 peuvent être vus comme fonctionnant comme un cache associatif par ensemble. Cette variante permet de réduire le coût matériel et énergétique lié à la consultation du répertoire 142. Lorsque le microprogramme 124 ne comporte, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire 118, qu’une indication de la localisation de ladite valeur au sein de la mémoire secondaire 118, et que le microprogramme 124 ne comporte pas de champ représentatif de la présence ou non de la donnée dans la mémoire secondaire 118, cette présence ou non peut être déterminée par exemple en consultant partiellement le répertoire 142. Des multiplexeurs peuvent recevoir en entrée les réponses des différentes parties du répertoire 142, ainsi que la partie de la localisation stockée dans le microprogramme 124 pour sélectionner la réponse concernée. La présence ou non de la donnée dans la mémoire secondaire 118 peut alors être déterminée à partir des réponses obtenues en sortie des multiplexeurs. En variante de l’exemple décrit ci-dessus, il est possible que le microprogramme 124 comporte le champ de présence ou non de la valeur de la requête considérée, et éventuellement le champ de distance dont la valeur est représentative du nombre de requêtes à exécuter entre la requête d’envoi de cette valeur et une précédente requête d’envoi de ladite valeur. Selon une variante, le bloc de chargement indexé 116 peut posséder également un mode de fonctionnement dit « FIFO » dans lequel la mémoire secondaire 118 fonctionne comme une mémoire FIFO. Dans ce cas, les valeurs du deuxième vecteur 112 ou de la deuxième matrice envoyées depuis la mémoire principale 104 vers la mémoire secondaire 118 peuvent être stockées les unes à la suite des autres dans la mémoire secondaire 118, sans tenir compte de leur adresse dans la mémoire secondaire 118. Ce mode peut également servir en attendant que le microprogramme 124 soit calculé ou lorsque la matrice creuse comporte un nombre extrêmement faible de valeurs non nulles par ligne de la matrice. Dans les exemples de réalisation décrits précédemment, il est considéré que l’unité de calcul 102 réalise un calcul matriciel en mettant en œuvre un algorithme de type « inner-product ». En variante, l’unité de calcul 102 peut mettre en œuvre d’autres types d’algorithmes (de type « outer-product », Gustavson, etc.) pour réaliser ces calculs matriciels. En variante des exemples de réalisation précédemment décrits, le dispositif 100 peut réaliser les étapes précédemment décrites en lien avec la FIG. 2 sur une partie seulement des données de la matrice creuse, c’est-à-dire sur une sous-matrice de la matrice creuse. Le dispositif 100 peut avantageusement être utilisé pour réaliser une multiplication d’une matrice creuse avec un vecteur dense ou une matrice dense. En variante, le dispositif 100 peut être utilisé pour réaliser une multiplication d’une matrice creuse avec un vecteur ou une matrice dont les éléments ne sont pas denses mais séparés d’un écart fixe en mémoire. Une telle variante peut servir par exemple pour travailler sur un champ d’une structure (vecteur de nombres complexes ou vecteur de vecteurs tridimensionnels par exemple). Selon une autre variante, le dispositif 100 peut être utilisé pour réaliser une multiplication d’une matrice creuse avec des blocs denses d’une matrice dense, les éléments des blocs denses pouvant ou non être espacés les uns des autres avec un écart fixe. En variante, le bloc de chargement indexé 116 peut comporter au moins un compteur d’utilisation configuré pour compter les données échangées par le bloc 116. Dans ce cas, le vecteur de données stocké dans le microprogramme 124 peut ne pas comporter le champ de distance étant donné que de tels compteurs permettent de détecter les conflits d’usage dans la mémoire secondaire 118 et d’attendre la libération d’une valeur avant d’effectuer le remplacement au sein de la mémoire secondaire 118. Selon une autre variante, il est possible qu’une valeur particulière du champ de distance dans le vecteur de données du microprogramme 124 serve à indiquer la présence ou non de la donnée dans la mémoire secondaire 118. Cette valeur peut être remplacée à la volée dans le moteur de chargement indexé 122 par cette valeur incrémentée d’une unité. Selon une variante de réalisation, le dispositif 100 peut comporter en outre un accélérateur configuré pour travailler en amont ou en parallèle du circuit de chargement 114 et exécuté le logigramme précédemment décrit en lien avec la FIG. 3 . Les différentes variantes précédemment décrites peuvent être combinées les unes avec les autres. Le dispositif 100 permet une gestion optimisée d’un cache pour la mise en œuvre d’une multiplication d’une matrice creuse par un vecteur dense ou une matrice dense, en précision configurable. Le dispositif 100 peut permettre de précalculer la politique de remplacement dans la mémoire secondaire 118 dans le cas de la multiplication matrice creuse par un vecteur dense ou une matrice dense. Ce pré-calcul peut être partiel : sur une partie seulement de la matrice (une sous-matrice) et/ou sur une partie seulement de la mémoire secondaire 118 (par exemple pour sélectionner un sous-ensemble de voies de la mémoire secondaire 118). Le dispositif 100 peut s’appliquer pour former un cache complètement associatif et sans matériel dédié à la détection de conflits sur une même donnée envoyée en entrée du cache. Dans ce cas, tout est précalculé et stocké dans un microcode formé par le microprogramme 124. Une politique de remplacement idéale devient alors utilisable, bien plus performante que ce qui peut être fait en temps réel en matériel. Le dispositif 100 permet d’améliorer les performances d’une multiplication d’une matrice creuse par un vecteur dense ou une matrice dense grâce à la réduction du nombre d’accès à la mémoire principale par l’unité de calcul, grâce à l’exploitation de la localité temporelle des données utilisées qui dépend de la structure de la matrice creuse. Cette localité temporelle vient du fait que les nombreuses multiplications SpMV ou SpMM mises en œuvre utilisent les mêmes données de la matrice creuse, et donc le même ordonnancement des accès mémoire à chaque multiplication. Le dispositif 100 permet de précalculer la gestion de la mémoire secondaire 118 pour en diminuer le coût matériel et améliorer les performances. Le dispositif 100 permet de précalculer le comportement de la mémoire secondaire 118, c’est-à-dire le calcul du hit et le choix d’un emplacement pour le remplacement d’une entrée de la mémoire secondaire 118, sous la forme d’un microprogramme 124. Le dispositif 100 permet de trouver un compromis entre le taux de hit et la survenance de conflits lors de remplacements de données dans la mémoire secondaire 118 (c’est-à-dire la sélection d’une ligne du cache encore utilisée). Le dispositif 100 forme un accélérateur, ou un streamer, à précision étendue et variable, dans lequel les routines logicielles les plus critiques sont optimisées. Cet accélérateur permet de limiter au maximum les accès mémoire, coûteux en performance et en énergie, en intégrant un cache. Cet accélérateur est couplé au cœur de calcul par des chemins de données existants et le rendent ainsi compatible avec plusieurs cœurs. De plus, cet accélérateur est compatible avec les besoins de lecture de données en précision étendue et configurable au bit près. Le dispositif 100 peut servir à former un cache complètement associatif à un coût moindre que si un tel cache étant implémenté purement en matériel. Le pré-calcul du vecteur d’indexation permet l’emploi de politiques de remplacement qu’il ne serait pas possible d’implémenter en matériel en temps réel. Le dispositif 100 peut par exemple être utilisé dans le domaine du calcul scientifique ou celui de l’intelligence artificielle, par exemple dans des solveurs algébriques, des solveurs de valeurs propres, dans l’inférence et l’apprentissage d’une intelligence artificielle. Divers modes de réalisation et variantes ont été décrits. La personne du métier comprendra que certaines caractéristiques de ces divers modes de réalisation et variantes pourraient être combinées, et d’autres variantes apparaîtront à la personne du métier. Enfin, la mise en œuvre pratique des modes de réalisation et variantes décrits est à la portée de la personne du métier à partir des indications fonctionnelles données ci-dessus. Dispositif de calcul informatique (100) comprenant au moins une mémoire principale (104) configurée pour stocker au moins une matrice creuse dans un format de vecteurs denses (106, 108, 110) et pour stocker au moins un deuxième vecteur (112) ou une deuxième matrice, une unité de calcul (102) configurée pour multiplier la matrice creuse par le deuxième vecteur (112) ou par la deuxième matrice, et un circuit de chargement (114) comprenant : un bloc de chargement indexé (116) comportant une mémoire secondaire (118) configurée pour stocker temporairement des valeurs du deuxième vecteur (112) ou de la deuxième matrice, et une mémoire FIFO de requêtes (120) configurée pour stocker des requêtes d’envoi de valeurs stockées dans la mémoire secondaire (118) vers l’unité de calcul (102), chacune des requêtes comportant au moins un champ de localisation au sein de la mémoire secondaire (118) de la valeur destinée à être envoyée à l’unité de calcul (102) lors d’une exécution de ladite requête ; un moteur de chargement indexé (122) configuré pour générer et stocker séquentiellement les requêtes dans la mémoire FIFO de requêtes (120) selon un ordre dans lequel les valeurs sont destinées à être envoyées à l’unité de calcul (102), et pour commander, lors de la génération de chacune des requêtes et en l’absence dans la mémoire secondaire (118) de la valeur destinée à être envoyée à l’unité de calcul (102) lors de l’exécution de ladite requête, l’envoi de ladite valeur depuis la mémoire principale (104) vers la mémoire secondaire (118) ; et dans lequel l’ordre de stockage des requêtes est calculé et stocké dans la mémoire principale (104) sous la forme d’un microprogramme (124) comportant un vecteur de données spécifiant au moins, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire (118), une partie du champ de localisation de ladite valeur au sein de la mémoire secondaire (118). Dispositif de calcul informatique (100) selon la revendication 1, dans lequel le microprogramme (124) comporte un vecteur de données spécifiant au moins, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire (118), le champ de localisation de ladite valeur au sein de la mémoire secondaire (118) et un champ de présence ou non de ladite valeur dans la mémoire secondaire (118). Dispositif de calcul informatique (100) selon l’une quelconque des revendications précédentes, dans lequel le circuit de chargement (114) comporte en outre un bloc de chargement linéaire (126) comprenant plusieurs mémoires FIFO de vecteurs (128, 130, 132, 134) configurées pour stocker des valeurs des vecteurs denses et du vecteur de données du microprogramme (124), et pour envoyer une première partie de ces valeurs à l’unité de calcul (102) et une deuxième partie de ces valeurs au moteur de chargement indexé (122). Dispositif de calcul informatique (100) selon la revendication 3, dans lequel la mémoire principale (104) est configurée pour stocker la matrice creuse dans un format CSR et dans lequel : une première des mémoires FIFO de vecteurs (128) est configurée pour stocker des valeurs d’un premier des vecteurs denses (106) correspondant à des indices de lignes d’éléments non nuls de la matrice creuse, et pour envoyer ces valeurs à l’unité de calcul (102) ; une deuxième des mémoires FIFO de vecteurs (130) est configurée pour stocker des valeurs d’un deuxième des vecteurs denses (108) correspondant aux éléments non nuls de la matrice creuse, et pour envoyer ces valeurs à l’unité de calcul (102) ; une troisième des mémoires FIFO de vecteurs (132) est configurée pour stocker des valeurs d’un troisième des vecteurs denses (110) correspondant à des indices de colonnes des éléments non nuls de la matrice creuse, et pour envoyer ces valeurs au moteur de chargement indexé (122) ; une quatrième des mémoires FIFO de vecteurs (134) est configurée pour stocker des valeurs du vecteur de données du microprogramme (124) et pour envoyer ces valeurs au moteur de chargement indexé (122). Dispositif de calcul informatique (100) selon la revendication 3 ou 4, dans lequel le bloc de chargement linéaire (126) comporte en outre des moteurs de chargement linéaire (136) configurés pour envoyer à la mémoire principale (104) des requêtes d’envoi des valeurs des vecteurs denses (106, 108, 110) et du vecteur de données du microprogramme (124) vers les mémoires FIFO de vecteurs (128, 130, 132, 134). Dispositif de calcul informatique (100) selon l’une quelconque des revendications précédentes, dans lequel le vecteur de données du microprogramme (124) spécifie en outre, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire (118), un champ de distance représentatif du nombre de requêtes à exécuter entre la requête d’envoi de ladite valeur et une précédente requête d’envoi de ladite valeur. Dispositif de calcul informatique (100) selon la revendication 6, dans lequel le bloc de chargement indexé (116) est configuré pour déterminer un nombre de requêtes stockées dans la mémoire FIFO de requêtes (120), et pour stocker dans la mémoire FIFO de requêtes (120) une requête envoyée par le moteur de chargement indexé (122) lorsque la valeur du champ de distance de la requête reçue est supérieure au nombre de requêtes stockées dans la mémoire FIFO de requêtes (120). Dispositif de calcul informatique (100) selon l’une quelconque des revendications précédentes, dans lequel la mémoire FIFO de requêtes (120) est configurée pour stocker chacune des requêtes avec un champ de confirmation d’exécution de la requête tel que : une requête générée pour une valeur présente dans la mémoire secondaire (118) est stockée dans la mémoire FIFO de requêtes (120) avec une première valeur du champ de confirmation d’exécution de la requête indiquant que la requête peut être exécutée ; une requête générée pour une valeur absente de la mémoire secondaire (118) est stockée dans la mémoire FIFO de requêtes (120) avec une deuxième valeur du champ d’exécution de la requête indiquant que la requête ne peut pas être encore exécutée, cette deuxième valeur étant remplacée par la première valeur lorsque la valeur est ensuite reçue et stockée dans la mémoire secondaire (118). Dispositif de calcul informatique (100) selon l’une quelconque des revendications précédentes, dans lequel le microprogramme (124) est calculé tel que les valeurs du champ de localisation dans le vecteur de données sont déterminées en appliquant une politique de remplacement dépendant de l’utilisation des données. Dispositif de calcul informatique (100) selon la revendication 9, dans lequel la politique de remplacement met en œuvre un algorithme de type LRU et/ou Belady. Dispositif de calcul informatique (100) selon la revendication 9 ou 10, dans lequel le microprogramme (124) est calculé tel que, pour chacune des valeurs du deuxième vecteur (112) ou de la deuxième matrice destinées à être envoyées à l’unité de calcul (102) et déjà présentes dans la mémoire secondaire (118), la politique de remplacement est mise en jour en considérant les localisations desdites valeurs dans la mémoire secondaire (118). Dispositif de calcul informatique (100) selon l’une quelconque des revendications 9 à 11, dans lequel le microprogramme (124) est calculé tel que, pour chacune des valeurs du deuxième vecteur (112) ou de la deuxième matrice destinées à être envoyées à l’unité de calcul (102) et absentes de la mémoire secondaire (118) et lorsque la mémoire secondaire (118) n’est pas pleine, ladite valeur est stockée dans un emplacement libre de la mémoire secondaire (118). Dispositif de calcul informatique (100) selon l’une quelconque des revendications 9 à 12, dans lequel le microprogramme (124) est calculé tel que, pour chacune des valeurs du deuxième vecteur (112) ou de la deuxième matrice destinées à être envoyées à l’unité de calcul (102) et absentes de la mémoire secondaire (118) et lorsque la mémoire secondaire (118) est pleine, un emplacement de la mémoire secondaire (118) occupé par une valeur est choisi conformément à la politique de remplacement appliquée et ladite valeur est stockée dans l’emplacement choisi de la mémoire secondaire (118). Dispositif de calcul informatique (100) selon l’une quelconque des revendications précédentes, dans lequel le bloc de chargement indexé (116) comporte au moins un répertoire (142) configuré pour stocker, pour chaque valeur destinée à être stockée dans la mémoire secondaire (118), l’adresse de ladite valeur dans la mémoire principale (104), et dans lequel le vecteur de données du microprogramme (124) spécifie, pour chacune des valeurs destinées à être stockées dans la mémoire secondaire (118), une indication de la localisation de ladite valeur au sein de la mémoire secondaire (118). Dispositif de calcul informatique (100) selon l’une quelconque des revendications précédentes, dans lequel le bloc de chargement indexé (116) comporte en outre au moins un compteur configuré pour compter les données échangées par le bloc de chargement indexé (116).