Comment concevoir des puces GPU
Chapter 4 Gpu Memory System Design

Chapitre 4 : Conception du système de mémoire GPU

Les unités de traitement graphique (GPU) se sont développées en accélérateurs programmables hautement parallèles capables d'atteindre des performances élevées et une efficacité énergétique sur une large gamme d'applications. Le système de mémoire est un composant essentiel des architectures GPU modernes, car il doit fournir aux nombreux fils d'exécution concurrents un accès rapide aux données. Dans ce chapitre, nous explorerons les éléments clés de la conception du système de mémoire GPU, notamment les structures de mémoire de premier niveau, le réseau d'interconnexion sur puce, les unités de partition de mémoire et les directions de recherche pour les futurs systèmes de mémoire GPU.

Structures de mémoire de premier niveau

Les structures de mémoire de premier niveau dans un GPU sont responsables de fournir un accès rapide aux données fréquemment utilisées et de réduire le nombre d'accès aux niveaux inférieurs de la hiérarchie de mémoire. Ces structures comprennent généralement la mémoire de scratchpad, le cache de données L1 et le cache de texture L1.

Mémoire de scratchpad et cache de données L1

La mémoire de scratchpad, également connue sous le nom de mémoire locale dans le modèle de programmation CUDA de NVIDIA ou de mémoire locale dans OpenCL, est un espace de mémoire à faible latence géré par le logiciel et partagé par tous les fils d'exécution au sein d'un tableau de fils d'exécution coopératifs (CTA) ou d'un groupe de travail. La mémoire de scratchpad est généralement mise en œuvre à l'aide d'une structure SRAM à banques multiples pour permettre un accès parallèle par plusieurs fils d'exécution.

La figure 4.1 illustre une organisation unifiée du cache de données L1 et de la mémoire de scratchpad, similaire à la conception utilisée dans les architectures Fermi et Kepler de NVIDIA [Minkin et al., 2012].

                                    Croisement d'adresses
                                          |
                                          v
                        Tableau de données (configurable en tant que scratchpad ou cache)
                                          |
                                          v  
                                    Croisement de données
                                          |
                                          v
                                 Unité de chargement/stockage
```Voici la traduction française du fichier Markdown, avec les commentaires traduits mais le code non traduit :

Figure 4.1 : Organisation unifiée du cache de données L1 et de la mémoire de scratchpad.

Les composants clés de cette conception sont :

1. **Tableau de données** : Une structure SRAM très segmentée qui peut être configurée soit comme mémoire de scratchpad, soit comme cache de données L1. Chaque banque fait 32 bits de large et possède son propre décodeur pour un accès indépendant.

2. **Croisement d'adresses** : Distribue les adresses mémoire de l'unité de chargement/stockage aux banques appropriées du tableau de données.

3. **Croisement de données** : Achemine les données des banques vers l'unité de chargement/stockage, qui les écrit ensuite dans le registre.

4. **Unité de chargement/stockage** : Calcule les adresses mémoire, applique les règles de coalescence et décompose les accès mémoire en accès coalescés individuels.

Les accès à la mémoire de scratchpad contournent l'étape de recherche dans la table des étiquettes, car la mémoire est directement mappée. Les conflits de banque sont gérés en divisant les accès en conflit en plusieurs cycles, les portions en conflit étant rejouées dans les cycles suivants.

Le cache de données L1 est utilisé pour stocker un sous-ensemble de l'espace d'adressage de la mémoire globale. Les accès au cache de données L1 impliquent une recherche dans la table des étiquettes pour déterminer si les données demandées sont présentes. La taille du bloc de cache est généralement de 128 octets, qui peut être divisée en secteurs de 32 octets pour correspondre à la taille minimale des données qui peuvent être lues à partir de la mémoire DRAM graphique (par exemple, GDDR5) en un seul accès.

### Cache de texture L1

La mémoire de texture est un espace mémoire en lecture seule optimisé pour la localité spatiale et est couramment utilisé dans les charges de travail graphiques. Le cache de texture L1 est conçu pour exploiter la localité spatiale 2D présente dans les accès aux textures.

La figure 4.2 montre une organisation typique du cache de texture L1.Voici la traduction française du fichier markdown :

                                  |
                                  v
                           Filtrage de texture
                                  |
                                  v
                           Texels filtrés

Figure 4.2 : Organisation du cache de texture L1.

Les principaux composants du cache de texture L1 sont :

  1. Mappage d'adresses : Convertit les coordonnées de texture en adresses de cache.

  2. Tableau des étiquettes : Stocke les étiquettes de chaque ligne de cache pour déterminer si les données demandées sont présentes.

  3. Tableau des données : Stocke les données de texture réelles.

  4. Filtrage de texture : Effectue des opérations d'interpolation et de filtrage sur les données de texture récupérées pour générer les texels filtrés finaux.

Le cache de texture L1 utilise généralement une organisation basée sur des tuiles pour exploiter la localité spatiale. Le cache est divisé en tuiles plus petites (par exemple, 4x4 ou 8x8 texels), et chaque tuile est stockée de manière contiguë pour minimiser le nombre de lignes de cache accédées pour une récupération de texture donnée.

Cache de texture et de données unifiés

Les architectures GPU récentes, comme celles de NVIDIA Maxwell et Pascal, ont introduit un cache de texture et de données unifiés pour améliorer l'utilisation du cache et réduire l'empreinte totale du cache [Heinrich et al., 2017]. Dans cette conception, le cache de données L1 et le cache de texture L1 sont combinés en un seul cache physique, avec la possibilité d'allouer dynamiquement la capacité entre les deux en fonction des besoins de la charge de travail.

La figure 4.3 illustre l'organisation d'un cache de texture et de données unifiés.

                                Requêtes mémoire
                                       |
                                       v
                                  Contrôleur de cache
                                 /             \
                                /               \
                               /                 \
                              v                   v
                      Partition du cache de données   Partition du cache de texture
                              |Voici la traduction française du fichier Markdown, avec les commentaires traduits mais le code non traduit :

Figure 4.3 : Organisation unifiée du cache de texture et de données.

Les principaux composants de la conception du cache unifié sont :

1. **Contrôleur de cache** : Reçoit les requêtes de mémoire et détermine si elles doivent être traitées par la partition du cache de données ou la partition du cache de texture.

2. **Partition du cache de données** : Gère les accès à l'espace de mémoire global, similaire au cache de données L1 autonome.

3. **Partition du cache de texture** : Gère les accès à la mémoire de texture, similaire au cache de texture L1 autonome.

4. **Tableau de données** : Un tableau de données partagé qui stocke à la fois les données de mémoire globale et les données de texture.

La conception du cache unifié permet une meilleure utilisation de la capacité de cache disponible, car les tailles des partitions peuvent être ajustées en fonction des modèles d'accès de la charge de travail. Cette flexibilité peut conduire à de meilleures performances et à une meilleure efficacité énergétique par rapport aux caches L1 séparés de taille fixe.

## Réseau d'interconnexion sur puce

Le réseau d'interconnexion sur puce est responsable de la connexion des cœurs GPU (également appelés multiprocesseurs de flux ou unités de calcul) aux unités de partition de mémoire. L'interconnexion doit fournir une bande passante élevée et une latence faible pour prendre en charge le parallélisme massif des charges de travail GPU.

Les GPU modernes utilisent généralement une topologie en croix ou en maille pour l'interconnexion sur puce. Une croix offre une connectivité complète entre tous les cœurs et les partitions de mémoire, permettant une communication à haute bande passante au prix d'une augmentation de la surface et de la consommation d'énergie. Une topologie en maille, d'autre part, offre une solution plus évolutive en connectant chaque cœur à ses cœurs et partitions de mémoire voisins, formant une structure en grille.

La figure 4.4 montre un exemple d'interconnexion en maille dans un GPU.

Cœur Cœur Cœur Cœur | | | |
—— —— —— —— | |


|      |
        Cœur   Cœur   Cœur   Cœur
         |      |      |      |
        ——     ——     ——     ——  
         |      |      |      |
        Cœur   Cœur   Cœur   Cœur
         |      |      |      |
        ——     ——     ——     ——
         |      |      |      |  
        Mém.   Mém.   Mém.   Mém.
        Part.  Part.  Part.  Part.

Figure 4.4 : Interconnexion en maille dans un GPU.

L'interconnexion en maille permet un transfert de données efficace entre les cœurs et les partitions mémoire tout en minimisant la surface et la consommation d'énergie. Des algorithmes de routage avancés et des mécanismes de contrôle de flux sont utilisés pour assurer des performances élevées et éviter la congestion.

Unité de partition mémoire

L'unité de partition mémoire est responsable de la gestion des requêtes mémoire provenant des cœurs GPU et de la gestion de la DRAM hors puce. Chaque partition mémoire comprend généralement un cache L2, un support pour les opérations atomiques et un ordonnanceur d'accès mémoire.

Cache L2

Le cache L2 est un cache partagé situé entre les cœurs GPU et la DRAM hors puce. Son principal objectif est de réduire le nombre d'accès à la DRAM à haute latence et énergivore en mettant en cache les données fréquemment utilisées.

Les caches L2 des GPU sont généralement conçus comme des caches à associativité par ensemble, avec écriture différée, d'une grande capacité (par exemple, 2-4 Mo) et d'une bande passante élevée. Le cache L2 est partitionné sur plusieurs partitions mémoire pour permettre un accès parallèle et améliorer le débit.

La figure 4.5 illustre l'organisation d'un cache L2 dans une partition mémoire GPU.

                            Requêtes mémoire
                                   |
                                   v
                             Contrôleur de cache L2
                                   |
                                   v
                              Tableau des tags
                                   |
                                   v
                              Tableau des données
                                   |
                                   v
                             Ordonnanceur mémoire
```Voici la traduction française du fichier Markdown, avec les commentaires traduits mais le code non traduit :

                                 DRAM

Figure 4.5 : Organisation du cache L2 dans une partition de mémoire GPU.

Le contrôleur de cache L2 reçoit les requêtes de mémoire des cœurs GPU et vérifie le tableau des étiquettes pour déterminer si les données demandées sont présentes dans le cache. En cas de succès du cache, les données sont récupérées dans le tableau de données et renvoyées au cœur demandeur. En cas d'échec du cache, la requête est transmise au planificateur de mémoire, qui récupère alors les données depuis la DRAM.

Opérations atomiques

Les opérations atomiques sont essentielles pour la synchronisation et la communication entre les threads dans les charges de travail parallèles. Les GPU prennent en charge une variété d'opérations atomiques, telles que l'ajout atomique, le minimum, le maximum et la comparaison-et-échange, qui garantissent l'atomicité lorsque plusieurs threads accèdent simultanément au même emplacement de mémoire.

Les opérations atomiques sont généralement mises en œuvre dans les unités de partition de mémoire pour assurer une exécution à faible latence et à haut débit. Des unités matérielles dédiées, telles que les unités d'opérations atomiques (AOUs), sont utilisées pour gérer efficacement les requêtes atomiques.

La figure 4.6 montre un exemple d'unité d'opération atomique dans une partition de mémoire GPU.

                            Requêtes atomiques
                                   |
                                   v
                          Unité d'opération atomique
                                   |
                                   v
                            Cache L2/DRAM

Figure 4.6 : Unité d'opération atomique dans une partition de mémoire GPU.

L'AOU reçoit les requêtes atomiques des cœurs GPU et effectue l'opération demandée sur l'emplacement de mémoire cible. Si l'emplacement de mémoire est présent dans le cache L2, l'AOU met à jour directement les données du cache. Si l'emplacement de mémoire n'est pas mis en cache, l'AOU récupère les données depuis la DRAM, effectue l'opération atomique, puis écrit le résultat de retour dans la DRAM.

Planificateur d'accès mémoire

Le planificateur d'accès mémoire est responsable de la gestion du flux deVoici la traduction française du fichier markdown, avec les commentaires traduits mais le code non traduit :

Requêtes de mémoire vers la DRAM hors puce. Son objectif principal est de maximiser l'utilisation de la bande passante DRAM tout en minimisant la latence des accès à la mémoire.

Les ordonnanceurs de mémoire GPU utilisent diverses algorithmes d'ordonnancement et optimisations pour atteindre des performances élevées. Certaines techniques courantes incluent :

  1. Ordonnancement hors-ordre : Réorganisation des requêtes de mémoire pour maximiser les hits de tampon de ligne et minimiser les frais généraux de précharge et d'activation DRAM.

  2. Parallélisme au niveau de la banque : Exploitation du parallélisme disponible sur plusieurs banques DRAM pour permettre un accès concurrent à différentes régions de mémoire.

  3. Optimisation du retournement écriture-lecture : Minimisation de la pénalité de latence encourue lors du passage des opérations d'écriture aux opérations de lecture dans la DRAM.

  4. Entrelacement d'adresses : Répartition des accès mémoire sur différents canaux, rangs et banques pour maximiser le parallélisme et éviter les conflits.

La figure 4.7 illustre une vue d'ensemble d'un ordonnanceur d'accès mémoire dans une partition de mémoire GPU.

                            Requêtes de mémoire
                                   |
                                   v
                           Ordonnanceur de mémoire
                                   |
                                   v
                    Canal   Canal   Canal   Canal
                      |         |         |         |
                      v         v         v         v
                    Rang      Rang      Rang      Rang
                      |         |         |         |
                      v         v         v         v  
                    Banque    Banque    Banque    Banque

Figure 4.7 : Ordonnanceur d'accès mémoire dans une partition de mémoire GPU.

L'ordonnanceur de mémoire reçoit les requêtes de mémoire du cache L2 et des unités d'opérations atomiques, et décide quand et dans quel ordre émettre ces requêtes vers la DRAM. En ordonnançant soigneusement les accès mémoire, l'ordonnanceur peut considérablement améliorer l'utilisation de la bande passante DRAM et réduire la latence moyenne des accès mémoire.

RechercheVoici la traduction française du fichier Markdown avec les commentaires traduits, mais le code non traduit :

Directions pour les systèmes de mémoire GPU

Alors que les architectures GPU continuent d'évoluer et que les demandes des charges de travail parallèles augmentent, il y a plusieurs directions de recherche visant à améliorer les performances et l'efficacité des systèmes de mémoire GPU. Certains des principaux domaines de recherche incluent :

Ordonnancement de l'accès à la mémoire et conception du réseau d'interconnexion

Alors que le nombre de cœurs et de partitions mémoire dans les GPU continue d'augmenter, la conception de l'ordonnanceur d'accès à la mémoire et du réseau d'interconnexion devient cruciale pour atteindre des performances élevées. La recherche dans ce domaine se concentre sur le développement de nouveaux algorithmes d'ordonnancement et de topologies d'interconnexion qui peuvent gérer efficacement le parallélisme massif et les modèles d'accès mémoire complexes des charges de travail GPU.

Par exemple, Jia et al. [2012] proposent un algorithme d'ordonnancement de la mémoire appelé "Staged Memory Scheduling" (SMS) qui vise à améliorer le parallélisme au niveau de la banque DRAM et à réduire la latence d'accès à la mémoire. SMS divise la file d'attente des requêtes mémoire en deux étapes : la formation de lots et l'ordonnancement des lots. Dans l'étape de formation de lots, les requêtes sont regroupées en lots en fonction de leurs adresses de banque et de ligne pour exploiter la localité des lignes. Dans l'étape d'ordonnancement des lots, les lots sont classés par priorité en fonction de leur âge et de leur criticité pour assurer l'équité et réduire les blocages.

Un autre exemple est le travail de Kim et al. [2012], qui propose une architecture de mémoire haute bande passante (HBM) pour les GPU. HBM empile plusieurs puces DRAM les unes sur les autres et les connecte à l'aide de vias traversants (TSV), permettant une bande passante beaucoup plus élevée et une latence plus faible par rapport aux mémoires GDDR traditionnelles. Les auteurs proposent également une nouvelle conception de contrôleur de mémoire qui peut gérer efficacement le parallélisme et la complexité accrus de HBM.

Efficacité de la mise en cache

Les GPU utilisent une variété de mécanismes de mise en cache pour réduire le nombre d'accès à la mémoire hors puce et améliorer les performances. Cependant, l'efficacité de ces caches peut varier considérablement en fonction des caractéristiques de la charge de travail et de la conception du cache.Voici la traduction française du fichier markdown, avec les commentaires traduits mais le code non traduit :

La recherche dans ce domaine vise à améliorer l'efficacité des caches GPU à travers des techniques telles que le contournement du cache, la compression du cache et la gestion adaptative du cache.

Par exemple, Huangfu et Xie [2016] proposent un schéma de contournement dynamique du cache pour les GPU qui utilise une heuristique simple mais efficace pour déterminer si une demande de mémoire doit être mise en cache ou contournée en fonction de sa distance de réutilisation. Le schéma s'adapte au comportement d'exécution de l'application et peut réduire considérablement la pollution du cache et améliorer les performances.

Un autre exemple est le travail de Vijaykumar et al. [2015], qui propose une architecture de cache compressé pour les GPU. Les auteurs observent que de nombreuses applications GPU présentent une redondance de données importante, qui peut être exploitée pour augmenter la capacité effective des caches. Ils proposent un nouveau schéma de compression qui peut atteindre des taux de compression élevés tout en entraînant un overhead de latence minimal.

Priorisation des demandes de mémoire et contournement du cache

Sur les GPU, les demandes de mémoire provenant de différentes warps et threads peuvent avoir des niveaux de criticité variables et un impact différent sur les performances globales. Prioriser les demandes critiques et contourner les demandes non critiques peut aider à réduire la latence mémoire et à améliorer l'utilisation des ressources.

La recherche dans ce domaine explore les techniques d'identification et de priorisation des demandes de mémoire critiques, ainsi que les mécanismes de contournement sélectif des caches.

Par exemple, Jog et al. [2013] proposent un schéma de priorisation des demandes de mémoire appelé "Critical-Aware Warp Acceleration" (CAWA). CAWA identifie les warps critiques susceptibles de bloquer le pipeline et priorise leurs demandes de mémoire par rapport à celles des warps non critiques. Le schéma utilise une combinaison d'informations statiques et dynamiques, telles que le nombre d'instructions dépendantes et l'âge de la warp, pour déterminer la criticité.

Lee et al. [2015] proposent un schéma de contournement du cache pour les GPU visant à réduire la pollution du cache et à améliorer la ponctualité des accès mémoire. Le schéma utilise une approche basée sur le PC pour déterminer si une demande de mémoire doit être mise en cache ou contournée.Voici la traduction française du fichier Markdown, avec les commentaires traduits mais le code non traduit :

Exploiter l'hétérogénéité inter-warps

Les GPU exécutent un grand nombre de warps de manière concurrente pour masquer la latence mémoire et atteindre un débit élevé. Cependant, les différents warps peuvent présenter une hétérogénéité significative en termes de leurs besoins en ressources, de leurs modèles d'accès mémoire et de leurs caractéristiques de performance.

La recherche dans ce domaine vise à exploiter cette hétérogénéité inter-warps pour améliorer l'allocation des ressources, l'ordonnancement et la gestion de la mémoire dans les GPU.

Par exemple, Kayıran et al. [2014] proposent un schéma de gestion du cache sensible à la divergence au niveau des warps qui adapte dynamiquement les politiques d'allocation et de remplacement du cache en fonction des caractéristiques de divergence de chaque warp. Les warps avec une forte divergence se voient allouer plus de ressources de cache pour réduire la divergence mémoire, tandis que les warps avec une faible divergence se voient allouer moins de ressources pour améliorer l'utilisation du cache.

Un autre exemple est le travail de Sethia et al. [2015], qui propose une conception de contrôleur de mémoire exploitant l'hétérogénéité inter-warps pour améliorer le parallélisme au niveau des banques DRAM. Les auteurs observent que différents warps peuvent avoir des degrés de parallélisme au niveau des banques différents, et proposent un algorithme d'ordonnancement de la mémoire sensible aux warps qui donne la priorité aux warps avec un parallélisme élevé au niveau des banques pour réduire la contention mémoire et améliorer le débit du système.

Contournement coordonné du cache

Le contournement du cache est une technique qui permet aux requêtes mémoire de sauter le cache et d'accéder directement à la hiérarchie mémoire de niveau inférieur. Bien que le contournement puisse aider à réduire la pollution du cache et à améliorer la ponctualité des accès mémoire, les décisions de contournement non coordonnées entre les différents cœurs et partitions mémoire peuvent conduire à des performances sous-optimales.

La recherche dans ce domaine explore des techniques...Voici la traduction française du fichier Markdown, avec les commentaires traduits mais le code non traduit :

Utilisation de la coordination des décisions de contournement du cache sur le GPU pour améliorer les performances globales du système et l'utilisation des ressources.

Par exemple, Li et al. [2015] proposent un système coordonné de contournement du cache pour les GPU qui utilise un contrôleur de contournement centralisé pour prendre des décisions de contournement globales. Le contrôleur collecte des informations d'exécution de chaque cœur, comme les taux de défauts de cache et les modèles d'accès à la mémoire, et utilise ces informations pour déterminer la stratégie de contournement optimale pour chaque cœur. Les auteurs montrent que leur système peut améliorer de manière significative les performances et l'efficacité énergétique par rapport à un contournement non coordonné.

Gestion adaptative du cache

La configuration de cache optimale pour une application GPU peut varier considérablement en fonction de ses modèles d'accès à la mémoire, de la taille de son ensemble de travail et de ses besoins en ressources. Les politiques de gestion de cache statiques fixées au moment de la conception peuvent ne pas être en mesure de s'adapter au comportement diversifié et dynamique de différentes applications.

Les recherches dans ce domaine explorent des techniques pour adapter dynamiquement la configuration du cache et les politiques de gestion en fonction du comportement d'exécution de l'application.

Par exemple, Wang et al. [2016] proposent un système de gestion adaptative du cache pour les GPU qui ajuste dynamiquement les tailles de partition du cache et les politiques de remplacement en fonction des modèles d'accès à la mémoire de l'application. Le système utilise une combinaison de techniques matérielles et logicielles pour surveiller le comportement du cache et effectuer des ajustements dynamiques afin d'améliorer l'utilisation du cache et les performances.

Un autre exemple est le travail de Dai et al. [2018], qui propose une approche basée sur l'apprentissage automatique pour la gestion adaptative du cache dans les GPU. Les auteurs utilisent l'apprentissage par renforcement pour apprendre automatiquement la configuration de cache optimale pour chaque application en fonction de son comportement d'exécution. Les politiques apprises sont ensuite mises en œuvre à l'aide d'une architecture de cache reconfigurable qui peut s'adapter aux besoins spécifiques de chaque application.

Prioritisation du cache

Dans les GPU, différents types deVoici la traduction française du fichier markdown :

Les demandes de mémoire, telles que les demandes de chargement, de stockage et de texture, peuvent avoir des exigences de latence et de bande passante différentes. Donner la priorité à certains types de demandes par rapport à d'autres peut contribuer à améliorer les performances globales du système et l'utilisation des ressources.

La recherche dans ce domaine explore les techniques de priorisation des différents types de demandes de mémoire dans la hiérarchie du cache GPU.

Par exemple, Zhao et al. [2018] proposent un schéma de priorisation du cache pour les GPU qui attribue différentes priorités aux différents types de demandes de mémoire en fonction de leur criticité et de leur sensibilité à la latence. Le schéma utilise une combinaison d'informations statiques et dynamiques, telles que le type d'instruction et le nombre d'instructions dépendantes, pour déterminer la priorité de chaque demande. Les auteurs montrent que leur schéma peut améliorer de manière significative les performances et l'efficacité énergétique par rapport à un GPU de base sans priorisation.

Placement de pages de mémoire virtuelle

Les GPU se sont traditionnellement appuyés sur une gestion manuelle de la mémoire, où le programmeur est responsable de l'allocation et de la libération explicites de la mémoire. Cependant, les GPU récents ont commencé à prendre en charge la mémoire virtuelle, ce qui permet au système d'exploitation de gérer automatiquement l'allocation et le placement de la mémoire.

La recherche dans ce domaine explore les techniques d'optimisation du placement des pages de mémoire virtuelle dans les GPU afin d'améliorer la localité des accès mémoire et de réduire les coûts de la traduction d'adresses.

Par exemple, Zheng et al. [2016] proposent un schéma de placement de pages pour les GPU qui vise à améliorer la localité des accès mémoire en plaçant les pages fréquemment accédées ensemble dans le même canal ou la même banque de mémoire. Le schéma utilise une combinaison de techniques matérielles et logicielles pour surveiller les modèles d'accès mémoire de l'application et prendre des décisions dynamiques de placement de pages.

Un autre exemple est le travail de Ganguly et al. [2019], qui propose un schéma de gestion de la mémoire virtuelle pour les GPU visant à réduire les coûts de la traduction d'adresses. Le schéma utilise une combinaison de techniques matérielles et logiciellesVoici la traduction française du fichier Markdown, avec les commentaires traduits mais le code non traduit :

Placement des données

Le placement des données dans la hiérarchie de mémoire du GPU peut avoir un impact significatif sur la localité d'accès à la mémoire et les performances. L'optimisation du placement des données peut aider à réduire la latence de la mémoire, à améliorer l'utilisation du cache et à augmenter l'utilisation de la bande passante mémoire.

La recherche dans ce domaine explore les techniques d'optimisation du placement des données dans les GPU en fonction des modèles d'accès à la mémoire et des besoins en ressources de l'application.

Par exemple, Agarwal et al. [2015] proposent un schéma de placement des données pour les GPU visant à améliorer la localité d'accès à la mémoire en plaçant les données fréquemment accédées ensemble dans le même canal ou la même banque de mémoire. Le schéma utilise une combinaison d'analyse statique et dynamique pour déterminer le placement optimal des données pour chaque application.

Un autre exemple est le travail de Tang et al. [2017], qui propose un schéma de placement des données pour les GPU visant à améliorer l'utilisation de la bande passante mémoire en plaçant les données dans différents canaux mémoire en fonction de leurs modèles d'accès. Le schéma utilise une approche basée sur l'apprentissage automatique pour prédire les modèles d'accès à la mémoire de l'application et prendre des décisions de placement des données de manière dynamique.

Cartes graphiques multi-puces

Alors que les exigences en matière de performances et d'alimentation des GPU continuent d'augmenter, les conceptions monopuces traditionnelles ne pourront peut-être pas suivre la demande. Les conceptions multi-puces (MCM), où plusieurs puces GPU sont intégrées dans un seul boîtier, sont apparues comme une solution prometteuse à ce problème.

La recherche dans ce domaine explore la conception et l'optimisation des GPU MCM, y compris l'architecture du système mémoire, la conception de l'interconnexion et la gestion des ressources.

Par exemple, Arunkumar et al. [2017] proposent une conception de GPU MCM utilisant une interconnexion à haute bande passante et à faible latence pour connecter plusieurs puces GPU. Les auteurs proposent également une architecture de système mémoire qui exploiteVoici la traduction française du fichier Markdown, avec les commentaires du code traduits en français :

Le système de mémoire est un composant essentiel des architectures GPU modernes, et sa conception et son optimisation peuvent avoir un impact significatif sur les performances et l'efficacité globales du système. Alors que les demandes des charges de travail parallèles continuent de croître, les chercheurs explorent une large gamme de techniques pour améliorer les performances, la scalabilité et l'adaptabilité des systèmes de mémoire GPU.

Certaines des principales directions de recherche dans ce domaine incluent la planification de l'accès à la mémoire et la conception de l'interconnexion, l'efficacité de la mise en cache, la priorisation des demandes de mémoire et le contournement du cache, l'exploitation de l'hétérogénéité inter-warp, le contournage du cache coordonné, la gestion adaptative du cache, la priorisation du cache, le placement des pages de mémoire virtuelle, le placement des données et les conceptions de modules multi-puces.

En explorant ces techniques et d'autres, les chercheurs visent à développer des systèmes de mémoire GPU qui peuvent suivre les demandes croissantes des charges de travail parallèles tout en maintenant des performances élevées et une efficacité énergétique. Alors que les GPU continuent d'évoluer et de trouver de nouvelles applications dans des domaines tels que l'apprentissage automatique, le calcul scientifique et l'analyse de données, la conception et l'optimisation de leurs systèmes de mémoire resteront un domaine important de recherche et d'innovation.