[Republié] Il s'avère que le CPU a tant fait pour optimiser les performances du programme

Il s'avère que le CPU a tant fait pour l'optimisation des performances du programme

Cet article se concentre sur l'apprentissage des barrières de mémoire et des connaissances sur le cache du processeur, afin que nous puissions comprendre quels efforts le processeur a faits pour optimiser les performances du programme.

Regardez d'abord le cache du processeur:

Cache CPU

Le cache du processeur est utilisé pour améliorer les performances du programme. Le processeur a apporté de nombreux ajustements à l'architecture interne de nombreux processus, tels que le cache du processeur. Tout le monde sait que parce que le disque dur est très lent, vous pouvez charger des données dans la mémoire via le cache pour augmenter la vitesse d'accès. Le traitement du processeur dispose également de ce mécanisme. Si possible, placez la surcharge de temps du processeur accédant à la mémoire principale sur le cache du processeur. La vitesse d'accès au processeur est plusieurs fois plus rapide que la vitesse d'accès à la mémoire. Il s'agit du mécanisme que la plupart des processeurs utilisent actuellement. Utilisez le cache du processeur pour améliorer les performances.

Cache à plusieurs niveaux

Le cache du processeur est divisé en trois niveaux de cache, de sorte que le processeur multicœur aura plusieurs caches, nous examinons d'abord le niveau de cache suivant (cache L1):

Le cache L1 est le cache de premier niveau du processeur, qui est divisé en cache de données et cache d'instructions.La capacité du cache L1 du processeur général du serveur est généralement de 32 à 4096 Ko.

En raison de la limitation de la capacité du cache L1, afin d'augmenter à nouveau la vitesse de fonctionnement du CPU, une mémoire haute vitesse est placée à l'extérieur du CPU, c'est-à-dire le cache L2.

La capacité de L1 et L2 étant toujours limitée, un cache à trois niveaux est proposé et L3 est désormais intégré. Son rôle réel est que l'application du cache L3 peut réduire davantage la latence de la mémoire et améliorer le processeur lors du calcul de grandes quantités de données. Les performances d'un processeur avec un cache L3 plus important offrent un comportement de cache du système de fichiers plus efficace et des longueurs de file d'attente de messages et de processeur plus courtes, et généralement plusieurs cœurs partagent un cache L3.

Lorsque le CPU lit des données, il regarde d'abord dans le cache L1, puis dans le cache L2, puis dans le cache L3, puis en mémoire, puis sur le disque dur de stockage externe.

Comme le montre la figure ci-dessous, dans l'architecture de cache du processeur, plus le niveau de cache est proche du cœur du processeur, plus la capacité est petite et plus la vitesse est rapide. Le cache du processeur se compose de plusieurs lignes de cache. La ligne de cache est la plus petite unité du cache du processeur. La taille d'une ligne de cache est généralement de 64 octets, ce qui est un multiple de 2. Elle varie de 32 à 64 octets sur différentes machines, et elle est efficace. Référencez un bloc d'adresse dans la mémoire principale.

Après que plusieurs processeurs lisent les mêmes données et les mettent en cache, après avoir effectué différents calculs, quel processeur finira par écrire dans la mémoire principale? Cela nécessite le protocole de synchronisation du cache:

Protocole de synchronisation du cache

Dans ce scénario de réécriture du cache, de nombreux fabricants de CPU ont proposé des protocoles communs, le protocole MESI, qui spécifie que chaque cache a un bit d'état et définit les quatre états suivants:

  • Modifié: la ligne de cache a été modifiée (ligne sale) et le contenu est différent de la mémoire principale, donc ce cache est exclusif;
  • Exclusif: le contenu de cette ligne de cache est le même que la mémoire principale, mais il n'apparaît pas dans les autres caches;
  • Partagé (partagé): le contenu de cette ligne de cache est le même que la mémoire principale, mais il apparaît également dans d'autres caches;
  • État non valide: le contenu de cette ligne de cache n'est pas valide (ligne vide).

Multi-processeur, un seul processeur modifie les données dans le cache, vous devez informer les autres processeurs, ce qui signifie que le traitement du processeur doit contrôler ses propres opérations de lecture et d'écriture, et également surveiller les notifications envoyées par d'autres processeurs pour garantir une cohérence éventuelle.

Réorganisation des commandes lors de l'exécution

En plus du cache, l'optimisation des performances du processeur comporte également un réarrangement des instructions d'exécution. Vous pouvez le comprendre à travers le diagramme suivant:

Par exemple, il y a le code x = 10; y = z; dans la figure, l'ordre d'exécution normal de ce code doit être d'écrire 10 sur x, de lire la valeur de z, puis d'écrire la valeur de z sur y. Lors de l'exécution, il peut s'agir de lire d'abord la valeur de z, d'écrire la valeur de z en y et enfin d'écrire 10 en x, pourquoi ces changements?

Parce que lorsque le CPU écrit le cache, il se trouve que la zone du cache est occupée par d'autres CPU (par exemple: cache L3). Afin d'améliorer les performances de traitement du CPU, la commande de lecture du cache suivante peut être exécutée en premier.

La réorganisation des instructions n'est pas une réorganisation aléatoire, il est nécessaire de se conformer à la sémantique as-if-serial, as-if-serial signifie que peu importe la façon dont la réorganisation (compilateur et processeur afin d'améliorer le parallélisme), l'exécution du programme à un seul thread Le résultat ne peut pas être modifié. Le compilateur, le runtime et le processeur doivent tous respecter la sémantique comme si de série, ce qui signifie que le compilateur et le processeur ne réorganiseront pas les opérations qui ont des dépendances de données.

Ensuite, il y aura les deux problèmes suivants:

  1. Il y a un problème sous le cache CPU:

Les données dans le cache et les données dans la mémoire principale ne sont pas synchronisées en temps réel, et les données mises en cache entre les CPU (ou noyaux CPU) ne sont pas synchronisées en temps réel. Dans le même temps, les valeurs des données à la même adresse mémoire vue par chaque CPU peuvent être incohérentes.

  1. Il y a un problème sous l'optimisation de la réorganisation du processeur:

Bien que la sémantique as-if-serial soit respectée, les résultats ne sont garantis que si le processeur unique l'exécute lui-même. Dans le multithread multicœur, la logique d'instruction ne peut pas distinguer la relation de cause à effet et peut être exécutée dans le désordre, ce qui entraîne un résultat d'exécution de programme incorrect.

Comment résoudre les deux problèmes ci-dessus, cela doit parler de la barrière de la mémoire:

Barrière mémoire

Le processeur fournit deux instructions de barrière de mémoire pour résoudre les deux problèmes ci-dessus:

Store Memory Barrier: Store Barrier est inséré après l'instruction pour permettre aux dernières données du cache d'écriture d'être écrites dans la mémoire principale et visibles par les autres threads. Forcé d'écrire dans la mémoire principale, ce type d'appel d'affichage, le CPU ne réordonnera pas les instructions pour des raisons de performances.

Charger la barrière de mémoire: l'insertion d'une barrière de charge avant l'instruction peut invalider les données du cache et forcer le chargement des données à partir de la nouvelle mémoire principale. Lire de force le contenu de la mémoire principale, garder le cache CPU cohérent avec la mémoire principale et éviter le problème de cohérence provoqué par le cache.

Il existe des mécanismes similaires en Java, tels que Synchronized et volatile, qui utilisent le principe de la barrière de mémoire.

Résumé

Cet article présente principalement les optimisations apportées par le processeur pour améliorer les performances du programme: réarrangement du cache et des instructions d'exécution, et présente enfin la connaissance de la barrière de mémoire.

Référence http://dwz.win/7ps

Je suppose que tu aimes

Origine www.cnblogs.com/jinanxiaolaohu/p/12683635.html
conseillé
Classement