En quoi l'architecture ARM est-elle différente de x86. Historique des processeurs x86

Principales caractéristiques de l'architecture

SSE4 se compose de 54 instructions, 47 d'entre elles appartiennent à SSE4.1 (elles ne sont que dans les processeurs Penryn). Le jeu d'instructions complet (SSE4.1 et SSE4.2, soit 47 + 7 instructions restantes) est disponible dans les processeurs Nehalem. Aucune des instructions SSE4 ne fonctionne avec les registres mmx 64 bits, uniquement avec xmm0-15 128 bits. Les processeurs 32 bits avec SSE4 n'ont pas été publiés.

Des instructions ont été ajoutées pour accélérer la compensation de mouvement dans les codecs vidéo, une lecture rapide de la mémoire USWC, de nombreuses instructions pour simplifier la vectorisation des programmes par les compilateurs. De plus, des instructions pour le traitement des chaînes de caractères 8/16 bits, les calculs CRC32, popcnt ont été ajoutées à SSE4.2. Pour la première fois dans SSE4, le registre xmm0 a été utilisé comme argument implicite pour certaines instructions.

Les nouvelles instructions SSE4.1 incluent l'accélération vidéo, les primitives vectorielles, l'insertion/extraction, la multiplication de points vectoriels, le mélange, la vérification des bits, l'arrondi et la lecture de la mémoire WC.

Les nouvelles instructions SSE4.2 incluent le traitement des chaînes, le comptage CRC32, le comptage d'une population de 1 bits et l'utilisation de primitives vectorielles.

ESS5

La nouvelle extension d'instruction x86 d'AMD appelée SSE5. Ce tout nouveau jeu d'instructions SSE, créé par AMD, sera pris en charge par les sociétés de processeurs montantes à partir de 2009.

SSE5 apporte à l'architecture x86 classique certaines des fonctionnalités qui étaient auparavant disponibles exclusivement dans les processeurs RISC. Le jeu d'instructions SSE5 définit 47 nouvelles instructions de base conçues pour accélérer les calculs monothread en augmentant la "densité" des données traitées.

Il existe deux groupes principaux de nouvelles instructions. Le premier comprend des instructions qui accumulent les résultats de la multiplication. Les instructions de ce type peuvent être utiles pour organiser des processus de calcul itératifs lors du rendu d'images ou de la création d'effets audio 3D. Le deuxième groupe de nouvelles instructions comprend des instructions qui opèrent sur deux registres et stockent le résultat dans un troisième. Cette innovation peut permettre aux développeurs de se passer de transferts inutiles de données entre registres dans les algorithmes de calcul. SSE5 contient également plusieurs nouvelles instructions pour comparer des vecteurs, pour permuter et déplacer des données, et pour changer la précision et l'arrondi.

Les principales applications pour SSE5 AMD voient les tâches de calcul, le traitement de contenu multimédia et les outils de chiffrement. On s'attend à ce que dans les applications informatiques utilisant des opérations matricielles, l'utilisation de SSE5 puisse donner une augmentation des performances de 30 %. Les tâches multimédias qui nécessitent une transformée en cosinus discrète peuvent obtenir une accélération de 20 %. Et les algorithmes de chiffrement grâce à SSE5 peuvent obtenir un quintuple de la vitesse de traitement des données.

AVX

La prochaine série d'extensions d'Intel. Le traitement des nombres à virgule flottante emballés dans des "mots" de 256 bits est pris en charge. Pour eux, la prise en charge des mêmes commandes est introduite que dans la famille SSE. Les registres SSE 128 bits XMM0 - XMM15 sont étendus à 256 bits YMM0-YMM15

Extensions de processeur Intel Post 32 nm - un nouveau jeu d'instructions Intel qui vous permet de convertir des nombres à demi-précision en nombres à simple et double précision, d'obtenir de vrais nombres aléatoires dans le matériel et d'accéder aux registres FS / GS.

AVX2

Poursuite du développement d'AVX. Les instructions entières SSE commencent à fonctionner avec des registres AVX 256 bits.

AES

Extension du jeu de commandes AES - mise en œuvre par microprocesseur du cryptage AES.

3DNow !

Un ensemble d'instructions pour le traitement de flux de nombres réels simple précision. Pris en charge par les processeurs AMD depuis K6-2. Non pris en charge par les processeurs Intel.

3DNow ! utiliser les registres MMX comme opérandes (deux nombres simple précision sont placés dans un registre), par conséquent, contrairement à SSE, lors du changement de tâche, il n'est pas nécessaire d'enregistrer le contexte 3DNow! séparément.

mode 64 bits

Superscalaire signifie que le processeur peut effectuer plus d'une opération par cycle d'horloge. Le super-pipelining signifie que le processeur dispose de plusieurs pipelines de calcul. Le Pentium en possède deux, ce qui lui permet idéalement d'être deux fois plus productif que le 486 aux mêmes fréquences, exécutant 2 instructions par horloge à la fois.

De plus, le processeur Pentium comportait à l'époque un FPU entièrement repensé et très puissant, dont les performances restaient inaccessibles pour les concurrents jusqu'à la fin des années 1990.

Pentium sur disque

De plus, un bloc MMX a été ajouté au cœur du Pentium II.

Céléron

Le premier représentant de cette famille était basé sur l'architecture Pentium II, c'était une cartouche avec une carte de circuit imprimé sur laquelle étaient montés le noyau, le cache L2 et la balise de cache. Monté dans l'emplacement Slot 2.

Les Xeons modernes sont basés sur l'architecture Core 2 / Core i7.

Processeurs AMD

Am8086 / Am8088 / Am186 / Am286 / Am386 / Am486

Fondamentalement nouveau Processeur AMD(avril 1997), basé sur un noyau acheté à NexGen. Ce processeur avait une construction de cinquième génération, mais appartenait à la sixième génération et se positionnait comme un concurrent du Pentium II. Inclus un bloc MMX et un bloc FPU quelque peu repensé. Cependant, ces blocs fonctionnaient toujours 15 à 20% plus lentement que ceux de fréquence similaire Processeurs Intel. Le processeur avait 64 Ko de cache L1.

Dans l'ensemble, les performances de type Pentium II, la compatibilité avec les cartes mères plus anciennes et un lancement plus précoce (AMD a introduit le K6 un mois plus tôt qu'Intel n'a introduit le P-II) et un prix plus bas l'ont rendu très populaire, mais les problèmes de production d'AMD ont considérablement gâché la réputation de ce processeur.

K6-2

Poursuite du développement du noyau K6. Ces processeurs ont ajouté un support pour le 3DNow spécialisé ! . Les performances réelles, cependant, se sont avérées nettement inférieures à celles des Pentium II cadencés de manière similaire (cela était dû au fait que l'augmentation des performances avec l'augmentation de la fréquence était plus élevée pour le P-II en raison du cache interne) et seul le Celeron pourrait rivaliser avec le K6-2. Le processeur avait 64 Ko de cache L1.

K6-III

Plus abouti technologiquement que le K6-2, une tentative de créer un analogue du Pentium III. Cependant, ce ne fut pas un succès marketing. Il se distingue par la présence de 64 Ko de cache de premier niveau et 256 Ko de cache de second niveau dans le cœur, ce qui lui a permis de fréquence d'horloge surpasse Intel Celeron et n'est pas très significativement inférieur au premier Pentium III.

K6-III+

Similaire au K6-III avec PowerNow ! et plus haute fréquence et un ensemble étendu d'instructions. Initialement destiné aux ordinateurs portables. Il a également été installé dans les systèmes de bureau avec un socket de processeur Super 7. Utilisé pour mettre à niveau les systèmes de bureau avec un socket de processeur Socket 7 (Uniquement sur les cartes mères qui fournissent deux tensions au processeur, la première pour les blocs d'E / S du processeur et la seconde pour le cœur du processeur. Tous les fabricants n'ont pas fourni la double alimentation sur les premiers modèles de leurs cartes mères avec un socket socket 7).

Un analogue de K6-III + avec un cache du deuxième niveau réduit à 128 KB.

Athènes

Un processeur très réussi, grâce auquel AMD a pu retrouver sa position presque perdue sur le marché des microprocesseurs. Cache de premier niveau - 128 Ko. Initialement, le processeur était produit dans une cartouche avec un cache de second niveau (512 Ko) sur la carte et installé dans le slot A (qui est mécaniquement, mais pas électriquement compatible avec le slot 1 d'Intel). Ensuite, je suis passé au Socket A et j'avais 256 Ko de cache L2 dans le noyau. En termes de vitesse - un analogue approximatif du Pentium III.

Duron

Une version simplifiée d'Athlon diffère de son parent par la taille du cache de second niveau (seulement 64 Ko, mais intégré à la puce et fonctionnant à la fréquence du cœur).

Celeron concurrent des générations Pentium III / Pentium 4. Les performances sont nettement supérieures à celles des Celerons similaires et, dans de nombreuses tâches, elles correspondent au Pentium III.

Athlon XP

Développement continu de l'architecture Athlon. En termes de performances, il est analogue au Pentium 4. Par rapport à l'Athlon standard, la prise en charge des instructions SSE a été ajoutée.

Sempron

Option moins chère (en raison de la réduction du cache L2) Processeurs Athlon XP et Athlon 64.

Les premiers modèles Sempron ont été rebaptisés puces Athlon XP basées sur des cœurs Thoroughbred et Thorton, qui avaient 256 Ko de cache L2 et fonctionnaient sur un bus 166 (333 DDR). Plus tard, des versions allégées de l'Athlon 64/Athlon II ont été produites (et sont en cours de production) sous la marque Sempron, positionnée comme Concurrents d'Intel Céléron. Tous les Sempron ont un cache de niveau 2 tronqué ; les modèles plus jeunes de Socket 754 avaient Cool&quiet et x86-64 bloqués ; Les modèles Socket 939 avaient un mode mémoire à double canal bloqué.

optéron

Premier processeur à prendre en charge l'architecture x86-64.

Athlon 64

Le premier processeur non serveur à prendre en charge l'architecture x86-64.

Athlon 64X2

Continuation de l'architecture Athlon 64, a 2 cœurs.

AthlonFX

Avait la réputation de "processeur de jouets le plus rapide". Il s'agit en fait d'un processeur de serveur Opteron 1xx sur des sockets de bureau sans prise en charge de la mémoire enregistrée. Produit en petites quantités. Il coûte beaucoup plus cher que ses homologues "de masse".

Phénomène

Evolution de l'architecture Athlon 64, il se décline en versions à deux (Athlon 64 X2 Kuma), trois (Phenom X3 Toliman) et quatre (Phenom X4 Agena) cœurs.

Phenom II

Processeurs VIA

Cyrix III / VIA C3

Premier processeur commercialisé sous la marque VIA. Publié avec différents noyaux de différentes équipes de développement. Connecteur femelle 370.

La première version est basée sur le noyau Joshua, acquis par VIA avec l'équipe de développement de Cyrix.

La deuxième version est avec le noyau Samuel, développé sur la base de l'IDT WinChip -3 jamais sorti. Il se distinguait par l'absence de mémoire cache de deuxième niveau et, par conséquent, par un niveau de performances extrêmement bas.

La troisième version est avec le noyau Samuel-2, une version améliorée du noyau précédent, équipé d'un cache de second niveau. Le processeur a été produit à l'aide d'une technologie plus fine et avait une consommation d'énergie réduite. Après la sortie de ce core, la marque VIA Cyrix III a finalement cédé sa place au VIA C3.

La quatrième version est avec le noyau Ezra. Il y avait aussi une variante Ezra-T adaptée pour fonctionner avec un bus conçu pour les processeurs Intel Core Tualatin. Poursuite du développement dans le sens des économies d'énergie.

La cinquième version est avec le noyau Nehemiah (C5P). Ce noyau a finalement obtenu un coprocesseur à pleine vitesse, un support pour les instructions ou .

Les processeurs basés sur le cœur V33 n'avaient pas de mode d'émulation 8080, mais supportaient, à l'aide de deux instructions supplémentaires, un mode d'adressage étendu.

Processeurs NexGen

Nx586

En mars 1994, le processeur NexGen Nx586 a été introduit. Il se positionnait comme un concurrent du Pentium, mais ne disposait initialement pas de coprocesseur intégré. L'utilisation d'un bus propriétaire impliquait la nécessité d'utiliser des chipsets propriétaires, NxVL (VESA Local Bus) et NxPCI 820C500 (PCI), et un socket de processeur incompatible. Les chipsets ont été développés conjointement avec VLSI et Fujitsu. Le Nx586 était un processeur superscalaire et pouvait exécuter deux instructions par horloge. Le cache L1 était séparé (16 Ko pour les instructions + 16 Ko pour les données). Le contrôleur de cache L2 était intégré au processeur, tandis que le cache lui-même était situé sur carte mère. Tout comme le Pentium Pro, le Nx586 était un processeur RISC à l'intérieur. Le manque de prise en charge des instructions CPUID dans les premières modifications de ce processeur a conduit au fait qu'il a été défini par programme comme un processeur 386 rapide. Cela était également lié au fait que Windows 95 refusait d'être installé sur des ordinateurs dotés de tels processeurs. Pour résoudre ce problème, un utilitaire spécial (IDON.COM) a été utilisé, qui représentait le Nx586 pour Windows comme un processeur de classe 586. Nx586 a été produit dans les installations d'IBM.

Un coprocesseur Nx587 FPU a également été développé, qui a été monté en usine sur le dessus de la puce du processeur. Ces "assemblages" étaient étiquetés Nx586Pf. Lors de la désignation des performances du Nx586, la cote P a été utilisée - de PR75 (70 MHz) à PR120 (111 MHz).

La prochaine génération de processeurs NexGen, qui n'est jamais sortie, mais a servi de base à l'AMD K6.

Processeurs SiS

SiS550

La famille de SoC SiS550 est basée sur le cœur Rise mP6 sous licence et est disponible à des fréquences de 166 à 266 MHz. Dans le même temps, les solutions les plus rapides ne consomment que 1,8 watts. Le noyau a trois pipelines entiers à 8 étages. Cache L1 séparé, 8+8 Ko. Le coprocesseur intégré est pipeliné. Le SiS550, en plus de l'ensemble standard de ports, comprend un noyau vidéo AGP 4x UMA 128 bits, un son 5.1 canaux, la prise en charge de 2 instructions appelées Code Morphing Software. Cela permet au processeur de s'adapter à n'importe quel jeu d'instructions et améliore l'efficacité énergétique, mais les performances d'une telle solution sont évidemment inférieures à celles des processeurs avec un système d'instructions x86 natif, et les variantes avec un coprocesseur étaient censées s'appeler U5D, mais n'ont jamais été publiés.

Intel a obtenu une injonction contre la vente de processeurs verts aux États-Unis, arguant qu'UMC utilisait le microcode Intel dans ses processeurs sans licence.

Il y avait aussi quelques problèmes avec le logiciel. Par exemple, le jeu Doom refusait de tourner sur ce processeur sans changer la configuration, et Windows 95 se bloquait de temps en temps. Cela était dû au fait que les programmes ont trouvé un coprocesseur manquant dans l'U5S et que les tentatives d'y accéder se sont soldées par un échec.

Processeurs produits en URSS et en Russie

KR1810VM86

Conception de circuits intégrés BLX/processeurs TIC

BLX IC Design et Institut la technologie informatique La Chine développe des processeurs basés sur MIPS avec traduction matérielle des instructions x86 depuis 2001. Ces processeurs sont produits par STMicroelectronics. Un partenariat avec TSMC est envisagé.

Filleul (Longxin, Loongson, Dragon)

Godson est un processeur RISC 32 bits basé sur MIPS. Technologie - 180 nm. Introduit en 2002. Fréquence - 266 MHz, un an plus tard - une version avec une fréquence de 500 MHz.

Filleul 2

  • Godson 2 est un processeur RISC 64 bits basé sur MIPS III. Technologie 90 nm. A fréquence égale, il surpasse de 10 fois son prédécesseur en performances. Introduit le 19 avril 2005.
  • Godson-2E - 500 MHz, 750 MHz, plus tard - 1 GHz. Technologie - 90 nm. 47 millions de transistors, consommation électrique - 5 ... 7,5 W. Le premier filleul avec traduction matérielle des commandes x86, et jusqu'à 60% des performances du processeur y sont consacrés. Introduit en novembre 2006.
  • Filleul 2F - 1,2 GHz, disponible depuis mars 2007. Une augmentation des performances par rapport à son prédécesseur de 20 à 30% est déclarée.
  • Filleul 2H - sortie prévue en 2011. Il sera équipé d'un cœur vidéo intégré et d'un contrôleur de mémoire et est destiné aux systèmes grand public.
Filleul 3
  • Godson 3 - 4 cœurs, technologie 65nm. Consommation d'énergie - environ 20 watts.
  • Godson 3B - 8 cœurs, technologie 65 nm (28 nm est prévu), fréquence d'horloge inférieure à 1 GHz. Surface cristalline - 300 mm². Les performances en virgule flottante sont de 128 GigaFLOPS. Consommation d'énergie de 8 cœurs Godson 3-40W. La traduction en code x86 est effectuée à l'aide d'un ensemble de 200 instructions, et la traduction consomme environ 20 % des performances du processeur. Le processeur dispose d'une unité de traitement SIMD vectorielle de 256 bits. Le processeur est destiné à être utilisé dans les serveurs et les systèmes embarqués.
  • La structure d'une instruction arbitraire est la suivante :

  1. Préfixes (chacun est facultatif) :
    1. Préfixe de changement d'adresse d'un octet AddressSize (valeur 67h).
    2. Préfixe de changement de segment d'un octet (valeurs 26h, 2Eh, 36h, 3Eh, 64h et 65h).
    3. Un préfixe BranchHint d'un octet pour indiquer la branche préférée de la branche (valeurs 2Eh et 3Eh).
    4. Un préfixe Vex complexe de 2 ou 3 octets (le premier octet est toujours C4h pour la version 2 octets ou C5h pour la version 3 octets).
    5. Préfixe de verrouillage à un octet pour empêcher la modification de la mémoire par d'autres processeurs ou cœurs (valeur F0h).
    6. Préfixe d'un octet OperandsSize pour modifier la taille de l'opérande (valeur 66h).
    7. Préfixe obligatoire d'un octet pour la qualification de l'instruction (valeurs F2h et F3h).
    8. Le préfixe à un octet Repeat signifie répétition (valeurs F2h et F3h).
    9. Le préfixe structuré Rex à un octet est nécessaire pour spécifier les registres 64 bits ou étendus (valeurs 40h..4Fh).
    10. Préfixe d'échappement. Se compose toujours d'au moins un octet 0Fh. Cet octet est éventuellement suivi de l'octet 38h ou 3Ah. Conçu pour clarifier les instructions.
  2. Octets spécifiques à l'instruction :
    1. Octet Opcode (valeur constante arbitraire).
    2. Octet Opcode2 (valeur constante arbitraire).
    3. Byte Params (a une structure complexe).
    4. L'octet ModRm est utilisé pour les opérandes en mémoire (a une structure complexe).
    5. L'octet SIB est également utilisé pour les opérandes en mémoire et a une structure complexe.
  3. Données intégrées dans l'instruction (facultatif) :
    1. Décalage ou adresse en mémoire (Déplacement). Un entier signé de taille 8, 16, 32 ou 64 bits.
    2. Le premier ou le seul opérande immédiat (Immédiat). Peut être 8, 16, 32 ou 64 bits.
    3. Deuxième opérande immédiat (Immediate2). S'il est présent, il a généralement une taille de 8 bits.

Dans la liste ci-dessus et ci-dessous, pour les noms techniques, le nom "uniquement les chiffres latins, arabes" et le signe moins "-" avec un trait de soulignement "_" sont acceptés, et le registre est CamelCase (tout mot commence par une majuscule, et puis uniquement en minuscules, même si l'abréviation est : " UTF-8" → "Utf8" - tous les mots ensemble). Les préfixes AddressSize, Segment, BranchHint, Lock, OperandsSize et Repeat peuvent être mélangés. Le reste des éléments doit aller exactement dans l'ordre spécifié. Et vous pouvez voir que les valeurs d'octets de certains préfixes sont les mêmes. Leur but et leur présence sont déterminés par l'instruction elle-même. Les préfixes de remplacement de segment peuvent être utilisés avec la plupart des instructions, tandis que les préfixes BranchHint ne peuvent être utilisés qu'avec des instructions de branchement conditionnel. La situation est similaire avec les préfixes Mandatory et Repeat - quelque part ils spécifient l'instruction, et quelque part ils indiquent la répétition. Le préfixe OperandSize ainsi que les préfixes obligatoires sont également appelés préfixes d'instruction SIMD. Séparément, il faut dire à propos du préfixe Vex. Il remplace les préfixes Rex, Mandatory, Escape et OperandsSize, en les compactant en lui-même. Il n'est pas permis d'utiliser le préfixe Lock avec. Le préfixe de verrouillage lui-même peut être ajouté lorsque la destination est un opérande en mémoire.

Une liste récapitulative de tous les modes intéressants en termes de codage des instructions :

  • 16 bits ("Real Mode", mode réel avec adressage de segment).
  • 32 bits ("Protected Mode", un mode protégé avec un modèle de mémoire plate).
  • 64 bits ("Long Mode", comme 32 bits protégés avec un modèle de mémoire plate, mais les adresses sont déjà en 64 bits).

Entre parenthèses, les noms anglais des modes correspondent aux noms officiels. Il existe également des modes synthétiques sur quelque chose comme unreal (Unreal x86 Mode), mais ils découlent tous de ces trois (en fait, ce sont des hybrides qui ne diffèrent que par la taille de l'adresse, des opérandes, etc.). Chacun d'eux utilise le mode d'adressage "natif", mais il peut être remplacé par un mode alternatif avec le préfixe OperandsSize. En mode 16 bits, l'adressage 32 bits sera activé, en mode 32 bits, l'adressage 16 bits et en mode 64 bits, l'adressage 32 bits. Mais si cela est fait, alors l'adresse est complétée par des zéros (si elle est inférieure) ou ses bits de poids fort sont réinitialisés (si elle est supérieure).

Le premier microprocesseur décrit, le 8086, était un appareil entièrement 16 bits conçu pour être utilisé dans des appareils informatiques à usage général en tant qu'unité centrale de traitement (CPU) unique. Ce microprocesseur avait des registres internes 16 bits, des bus de données internes et externes 16 bits et pouvait adresser jusqu'à 1 Mo de mémoire physique. Les performances du microprocesseur 8086 pourraient atteindre 0,8 MIPS (millions d'opérations par seconde).

En 1982, Intel a apporté des améliorations significatives à l'architecture x86 et a lancé le nouveau microprocesseur Intel286. Il était également entièrement 16 bits, cependant, il pouvait adresser jusqu'à 16 Mo de mémoire physique et disposait d'un mode de fonctionnement protégé spécial, qui fournissait des mécanismes flexibles d'adressage, de contrôle d'accès à la mémoire, de gestion des privilèges, etc. Le jeu d'instructions de ce microprocesseur a également été considérablement élargi. Ses performances ont déjà atteint 2,7 MIPS.

Des innovations encore plus importantes dans l'architecture x86 ont été incorporées dans le processeur Intel386, sorti en 1985. C'était un microprocesseur entièrement 32 bits qui avait des registres internes 32 bits et des bus de données 32 bits. L'espace d'adressage du microprocesseur Intel386 était à l'époque tout simplement illimité - 4 Go. Ont également été ajoutés: un mécanisme de page spécial et un nouveau mode de fonctionnement - V86, qui garantissait la compatibilité de ce microprocesseur avec les programmes écrits pour les appareils précédents de la série. La microarchitecture interne du microprocesseur Intel386 était également unique - pour la première fois, elle permettait l'exécution parallèle de plusieurs actions (récupération de commandes et de données, décodage de commandes, exécution de commandes, etc.), ce qui assurait une augmentation des performances jusqu'à 6 MIPS . À peu près à la même époque, un nouveau système d'exploitation a été développé pour Ordinateur personnel construit sur des microprocesseurs x86 - Windows. Depuis, le couple Windows-Intel est si populaire et indissociable qu'un nouveau terme est même apparu pour désigner l'architecture x86 : Wintel.

Le développement des technologies de la microélectronique a permis d'augmenter considérablement la capacité des cristaux circuits électroniques. En 1989, le microprocesseur Intel486 est apparu. Il contenait une unité à virgule flottante (FPU) intégrée et un cache interne pour les données et les instructions. La vitesse du processeur a également été augmentée (notamment en améliorant la microarchitecture, ce qui a permis de paralléliser encore plus l'exécution de nombreuses actions à l'intérieur du microprocesseur).

En 1993, le premier microprocesseur de la famille P5 est sorti. Le microprocesseur Pentium avait une microarchitecture considérablement améliorée. Désormais, le dispositif de calcul d'entiers avait deux blocs presque identiques dans lesquels différentes instructions pouvaient être exécutées en parallèle. Les modules responsables de la récupération et du décodage des commandes ont été améliorés, ils sont devenus plus intelligents et ont tenté de prédire les actions du processeur en préchargeant et en pré-décodant les commandes avant même de recevoir les résultats des commandes précédentes. L'unité à virgule flottante a été considérablement repensée pour obtenir des performances plus rapides. Quelques améliorations ont également été apportées à l'architecture logicielle du processeur : le support des grandes pages est apparu, le mode V86 est devenu plus souple dans la gestion des interruptions, et les outils d'autodiagnostic internes n'en étaient qu'à leurs balbutiements. La vitesse des premiers processeurs Pentium pouvait atteindre 100 MIPS.

De 1993 à 1997 Intel a continué d'améliorer l'architecture de ses processeurs. Le Pentium Pro est sorti - un microprocesseur de la microarchitecture P6, qui est devenu la base des microprocesseurs ultérieurs. Pas deux, mais quatre modules internes exécutaient des commandes en parallèle, la prélecture était complétée par de nombreuses fonctions intelligentes, telles que la prédiction de branchement, etc. La mémoire cache interne est devenue à deux niveaux, ce qui a permis, d'une part, d'augmenter son volume, et, d'autre part, d'assurer un coût raisonnable du microprocesseur. Un nouveau jeu d'instructions multimédia étendu (MMX) a été introduit dans les nouveaux modèles de microprocesseurs Pentium et Pentium Pro.

L'industrie moderne des microprocesseurs a pratiquement cessé de développer des architectures x86 32 bits (ayant reçu ici le concurrent le plus sérieux face à l'architecture ARM) et est passée à un nouveau segment d'architectures 64 bits. La dernière des innovations importantes dans le segment 32 bits était les nouvelles instructions dites SIMD (ou SSE), introduites pour la première fois dans le microprocesseur Pentium III. Cependant, toutes ces améliorations et fonctionnalités logicielles étonnantes sont toujours basées sur l'architecture x86 standard qui existe depuis plus de 30 ans.

Les principaux éléments de l'architecture x86 sont décrits séquentiellement dans les sections suivantes.

    Système de commande- contient ici des informations détaillées sur toutes les commandes des processeurs x86, incl. et les jeux d'instructions étendus MMX, 3DNow! et SIMD (SSE). Pour chaque commande, les actions effectuées par celle-ci et les conséquences possibles de son utilisation dans diverses situations sont indiquées, des commentaires et des recommandations sont donnés.

    Registres internes- contient une description de tous les registres internes du processeur. Ceux-ci incluent des registres à usage général, des registres de segment, des registres de contrôle et de débogage, des registres système, des registres de coprocesseur mathématique et certains registres à usage spécial.

    Adressage, gestion de la mémoire, multitâche et mécanismes de sécurité- Dédié à la description du fonctionnement du mécanisme d'adressage du processeur dans différents modes. Le mécanisme de pagination, le mécanisme de support multitâche et les outils de protection sont également décrits, les formats de tous les éléments de l'architecture du système sont donnés.

    Interruptions, exceptions et exceptions- contient Description détaillée actions du processeur pour gérer les interruptions et les exceptions. Toutes les raisons possibles de leur génération et un protocole pour la réaction du processeur à leur apparition sont donnés. Les exceptions du coprocesseur mathématique et les exceptions pour les instructions de diffusion SIMD (SSE) sont également décrites.

    Formats de données est une description de tous les formats de données utilisés dans l'architecture x86. Ici sont présentés les deux formats pour l'arithmétique entière et l'arithmétique à virgule flottante, la description des données pour les commandes MMX, 3DNow, SIMD (SSE).

    Formats de commande– contient des informations sur le codage des commandes. Tous les formats possibles pour les codes d'instruction du processeur sont décrits ici, le but et les règles de codage des champs individuels sont donnés.

Depuis l'avènement du tout premier microprocesseur x86, une grande variété d'entreprises à travers le monde ont développé des appareils compatibles. En règle générale, ces microprocesseurs copient complètement l'architecture des appareils Intel et sont compatibles avec les logiciels qui les concernent.

Des microprocesseurs clones existent pour tous les appareils de la série x86. À diverses époques, les plus célèbres d'entre eux étaient : MII (Cyrix, IBM), K6 (AMD), Winchip (IDT) et quelques autres. La spécificité de ces microprocesseurs est qu'ils étaient destinés à être utilisés dans des équipements industriels et des calculateurs bas coût de performances moyennes et ne revendiquaient pas le leadership dans le domaine des systèmes ultra-performants multiprocesseurs puissants. Jusqu'à un certain temps, les fabricants de clones ne faisaient que suivre les traces d'Intel, produisant des appareils aussi proches que possible dans leurs caractéristiques des appareils Intel et ne contenant aucune extension structurelle. L'innovation a été l'étape d'AMD, qui a développé et implémenté dans ses microprocesseurs un nouveau système d'instructions étendu 3DNow! Cette extension était également prise en charge par d'autres fabricants. Intel, cependant, n'a pas copié Développements AMD et introduit une autre extension appelée SIMD ou SSE dans ses nouveaux microprocesseurs. Par la suite, la plupart des 3DNow! ont été implémentés dans le cadre des nouvelles extensions SSE2 et SSE3 qui sont apparues dans les processeurs Intel à partir du Pentium IV.

En règle générale, les fabricants déclarent que leurs produits sont entièrement compatibles avec les microprocesseurs Intel, cependant, comme le montre la pratique, le comportement des clones peut différer du comportement des appareils Intel (par exemple, dans le cas d'interruptions concurrentes). Néanmoins, dans l'écrasante majorité des cas, tout ce qui est dit sur ce site à propos des processeurs Intel est également vrai pour leurs homologues fabriqués par d'autres sociétés.

Code et données : le principe de base du processeur

Donc, si vous n'essayez pas de présenter ici un cours d'informatique "brièvement" pour le lycée, alors la seule chose que je voudrais vous rappeler est que le processeur (à de rares exceptions près) n'exécute pas de programmes écrits dans n'importe quel langage de programmation (dont l'un, vous le savez peut-être même), mais du "code machine". Autrement dit, les commandes correspondantes sont des séquences d'octets situées dans la mémoire de l'ordinateur. Parfois, une commande peut être d'un octet, parfois plusieurs octets. Au même endroit, dans la mémoire principale (RAM, RAM), il y a aussi des données. Ils peuvent être dans une zone séparée, ou ils peuvent être "mélangés" avec le code. La différence entre le code et les données est que les données sont quelque chose sur lequel le processeur effectue une sorte d'opération. Et le code, ce sont les commandes qui lui disent quelle opération il doit effectuer. Pour simplifier, nous pouvons imaginer un programme et ses données comme une séquence d'octets d'une longueur finie, situés en continu (ne compliquons pas) dans un tableau mémoire commun. Par exemple, nous avons une matrice mémoire d'une longueur de 1'000'000 octets, et notre programme (avec les données) est composé d'octets avec des nombres de 1000 à 20'000. Les autres octets sont d'autres programmes ou leurs données, ou simplement de la mémoire libre qui n'est occupée par rien d'utile.

Ainsi, le "code machine" correspond aux instructions du processeur, situées en mémoire. Les données s'y trouvent. Pour exécuter une instruction, le processeur doit la lire en mémoire. Afin d'effectuer une opération sur des données, le processeur doit les lire à partir de la mémoire et, éventuellement, après avoir effectué une certaine action sur celles-ci, les réécrire dans la mémoire sous une forme mise à jour (modifiée). Les commandes et les données sont identifiées par leur adresse, qui est essentiellement le nombre ordinal d'un emplacement mémoire.

Principes généraux d'interaction entre le processeur et la RAM

Cela surprendra peut-être quelqu'un qu'une section assez importante de la FAQ du processeur x86 soit consacrée à l'explication des caractéristiques du fonctionnement de la mémoire dans les systèmes modernes basés sur ce type de processeur. Cependant, les faits sont têtus : les processeurs x86 eux-mêmes contiennent désormais tellement de blocs chargés d'optimiser leur travail avec la RAM qu'il serait complètement ridicule d'ignorer ce lien étroit. On peut même dire ceci : puisque les solutions liées à l'optimisation du travail de la mémoire sont devenues partie intégrante des processeurs eux-mêmes, alors la mémoire elle-même peut être considérée comme une sorte « d'appendice », dont le fonctionnement a un impact direct sur la vitesse de le processeur. Sans comprendre les particularités de l'interaction du processeur avec la mémoire, il est impossible de comprendre en raison de quoi tel ou tel processeur (tel ou tel système) exécute des programmes plus lents ou plus rapides.

Contrôleur de mémoire

Ainsi, plus haut, nous avons déjà dit que les commandes et les données entrent dans le processeur à partir de mémoire vive. En fait, tout est un peu plus compliqué. Dans la plupart des systèmes x86 modernes (c'est-à-dire des ordinateurs basés sur des processeurs x86), le processeur, en tant que périphérique, ne peut pas du tout accéder à la mémoire, car il n'inclut pas les nœuds correspondants. Par conséquent, il fait référence à un dispositif spécialisé "intermédiaire" appelé contrôleur de mémoire, et cela, à son tour, à des puces RAM situées sur des modules de mémoire. Vous devez avoir vu les modules - ce sont de si longues "lamelles" textolites étroites (en fait, de petites cartes) avec un certain nombre de microcircuits dessus, insérés dans des connecteurs spéciaux sur la carte mère. Le rôle du contrôleur de RAM est donc simple : il sert en quelque sorte de « pont »* entre la mémoire et les appareils qui l'utilisent (d'ailleurs, cela inclut non seulement le processeur, mais nous y reviendrons plus tard). En règle générale, le contrôleur de mémoire fait partie du chipset - un ensemble de puces qui est la base carte système. La vitesse d'échange de données entre le processeur et la mémoire dépend en grande partie de la vitesse du contrôleur, c'est l'un des composants les plus importants qui affectent les performances globales de l'ordinateur.

* - à propos, le contrôleur de mémoire est physiquement situé dans la puce du chipset, traditionnellement appelé le "pont nord".

bus processeur

Tout processeur est nécessairement équipé d'un bus processeur, qui dans l'environnement CPU x86 est communément appelé FSB (Front Side Bus). Ce bus sert de canal de communication entre le processeur et tous les autres périphériques de l'ordinateur : mémoire, carte vidéo, disque dur, etc. Cependant, comme nous le savons déjà dans la section précédente, il existe un contrôleur de mémoire entre la mémoire réelle et le processeur. En conséquence: le processeur via le FSB communique avec le contrôleur de mémoire, et cela, à son tour, via un bus spécial (appelons-le, sans plus tarder, le "bus mémoire") - avec les modules RAM de la carte. Cependant, nous le répétons : puisque le CPU x86 classique n'a qu'un seul bus "externe", il sert non seulement à travailler avec de la mémoire, mais aussi à communiquer avec tous les autres appareils.

Différences entre l'architecture CPU x86 traditionnelle et K8/AMD64

L'approche d'AMD est révolutionnaire dans la mesure où ses processeurs à l'architecture AMD64 (et à la microarchitecture, que l'on appelle classiquement "K8") sont équipés de nombreux bus "externes". Dans ce cas, un ou plusieurs bus HyperTransport sont utilisés pour communiquer avec tous les périphériques à l'exception de la mémoire, et un groupe séparé d'un ou deux bus (dans le cas d'un contrôleur à double canal) est utilisé exclusivement pour le processeur avec mémoire. L'avantage d'intégrer le contrôleur de mémoire directement dans le processeur est évident : le "chemin du cœur à la mémoire" devient sensiblement "plus court", ce qui permet de travailler plus rapidement avec la RAM. Cependant, cette approche présente également des inconvénients. Ainsi, par exemple, si des appareils antérieurs de type disque dur ou les cartes vidéo pourraient fonctionner avec de la mémoire via un contrôleur dédié et indépendant - dans le cas de l'architecture AMD64, elles sont obligées de fonctionner avec de la RAM via un contrôleur situé sur le processeur. Étant donné que le CPU dans cette architecture est le seul appareil qui a un accès direct à la mémoire. De facto, dans la confrontation « contrôleur externe vs. intégré », la parité s'est développée : d'une part, ce moment AMD est le seul fabricant de processeurs desktop x86 avec un contrôleur mémoire intégré, en revanche, la société semble plutôt satisfaite de cette solution et ne va pas l'abandonner. Sur le troisième, Intel ne va pas non plus abandonner le contrôleur externe, et est plutôt satisfait du "schéma classique" qui a fait ses preuves au fil des années.

RAM

Largeur du bus mémoire, contrôleurs de mémoire à canal N

À ce jour, toute la mémoire utilisée dans les systèmes de bureau x86 modernes dispose d'un bus large de 64 bits. Cela signifie qu'en un cycle d'horloge, un multiple de 8 octets d'informations peut être transmis simultanément sur ce bus (8 octets pour les bus SDR, 16 octets pour les bus DDR). Seule la mémoire RDRAM se distingue, qui était utilisée dans les systèmes basés sur les processeurs Intel Pentium 4 à l'aube de l'architecture NetBurst, mais maintenant cette direction est reconnue comme une impasse pour les PC x86 (d'ailleurs, la même société Intel, qui à une fois activement promu ce type de mémoire). Une certaine confusion n'est apportée que par les contrôleurs à double canal qui fournissent un fonctionnement simultané avec deux bus 64 bits séparés, en raison desquels certains fabricants revendiquent une sorte de «128 bits». Ceci, bien sûr, est un pur blasphème. L'arithmétique au niveau de la 1ère année, hélas, ne fonctionne pas dans ce cas : 2x64 n'est pas du tout égal à 128. Pourquoi ? Oui, ne serait-ce que parce que même les processeurs x86 les plus modernes (voir ci-dessous la section FAQ "Extensions 64 bits de l'architecture x86 classique (IA32)") ne peuvent pas fonctionner avec un bus 128 bits et un adressage 128 bits. Grosso modo : deux routes parallèles indépendantes de 2 mètres de large chacune peuvent permettre le passage simultané de deux voitures de 2 mètres de large - mais en aucun cas une de 4 mètres de large. De la même manière, un contrôleur de mémoire à canal N peut augmenter la vitesse de travail avec des données N fois (et même plus théoriquement que pratiquement) - mais il n'est en aucun cas capable d'augmenter la profondeur de bits de ces données. La largeur du bus mémoire dans tous les contrôleurs modernes utilisés dans les systèmes x86 est de 64 bits, que ce contrôleur soit situé dans le chipset ou dans le processeur lui-même. Certains contrôleurs sont équipés de deux canaux 64 bits indépendants, mais cela n'affecte en rien la largeur du bus mémoire - uniquement la vitesse de lecture et d'écriture des informations.

Vitesse de lecture et d'écriture

La vitesse de lecture et d'écriture d'informations dans la mémoire est théoriquement limitée uniquement par la bande passante de la mémoire elle-même. Ainsi, par exemple, un contrôleur mémoire double canal DDR400 est théoriquement capable de fournir une vitesse de lecture et d'écriture des informations de 8 octets (largeur de bus) * 2 (nombre de canaux) * 2 (protocole DDR qui assure le transfert de 2 paquets de données par cycle) * 200 "000" 000 (la fréquence réelle du bus mémoire est de 200 MHz, soit 200" 000" 000 cycles par seconde). Les valeurs obtenues à la suite de tests pratiques sont généralement légèrement inférieures aux valeurs théoriques: la conception «non idéale» du contrôleur de mémoire affecte, ainsi que les superpositions (latences) causées par le fonctionnement du sous-système de mise en cache du processeur lui-même (voir la section sur le cache du processeur ci-dessous). Cependant, le "truc" principal n'est même pas dans les superpositions associées au fonctionnement du contrôleur et du sous-système de mise en cache, mais dans le fait que la vitesse de lecture ou d'écriture "linéaire" n'est pas du tout la seule caractéristique, affectant la vitesse réelle du processeur avec RAM. Afin de comprendre quels composants composent la vitesse réelle du processeur avec mémoire, nous devons prendre en compte, en plus de la vitesse linéaire de lecture ou d'écriture, une caractéristique telle que la latence.

Latence

La latence n'est pas une caractéristique moins importante du point de vue des performances du sous-système mémoire que la vitesse de "pompage des données", mais elle est complètement différente, en fait. Un taux d'échange de données élevé c'est bien quand leur taille est relativement importante, mais si on a besoin « d'un peu d'adresses différentes », alors c'est la latence qui prime. Ce que c'est? Dans le cas général, le temps qu'il faut pour commencer à lire des informations à partir d'une adresse spécifique. Et en effet : à partir du moment où le processeur envoie une commande au contrôleur mémoire pour lire (écrire), et jusqu'au moment où cette opération est effectuée, un certain temps s'écoule. De plus, il n'est pas du tout égal au temps de transfert des données. Ayant reçu une commande de lecture ou d'écriture du processeur, le contrôleur de mémoire lui "indique" avec quelle adresse il veut travailler. L'accès à n'importe quelle adresse arbitraire ne peut pas être instantané, cela prend un certain temps. Il y a un délai : l'adresse est spécifiée, mais la mémoire n'est pas encore prête à y accéder. En général, ce délai est appelé latence. Il est différent pour différents types de mémoire. Ainsi, par exemple, la mémoire DDR2 a en moyenne des retards beaucoup plus élevés que la DDR (au même taux de transfert de données). En conséquence, si les données du programme sont localisées "de manière chaotique" et en "petits morceaux", la vitesse de leur lecture devient beaucoup moins importante que la vitesse d'accès au "début du morceau", car les retards lors du passage à l'adresse suivante affecte beaucoup plus les performances du système que la vitesse de lecture ou d'écriture.

La « concurrence » entre la vitesse de lecture (écriture) et la latence est l'un des principaux maux de tête des développeurs de systèmes modernes : malheureusement, une augmentation de la vitesse de lecture (écriture) entraîne presque toujours une augmentation de la latence. Ainsi, par exemple, la mémoire SDR (PC66, PC100, PC133) a une meilleure (inférieure) latence en moyenne que la DDR. À son tour, la latence DDR2 est encore plus élevée (c'est-à-dire pire) que la DDR.

Il faut comprendre que la latence "générale" du sous-système de mémoire dépend non seulement de lui-même, mais également du contrôleur de mémoire et de son emplacement - tous ces facteurs affectent également le délai. C'est pourquoi AMD, en train de développer l'architecture AMD64, a décidé de résoudre le problème de latence élevée "d'un seul coup" en intégrant le contrôleur directement dans le processeur - afin de "raccourcir la distance" entre le cœur du processeur et Modules de RAM autant que possible. L'idée a réussi, mais à un prix élevé : désormais, un système basé sur une certaine architecture CPU AMD64 ne peut fonctionner qu'avec la mémoire pour laquelle son contrôleur est conçu. C'est probablement pourquoi Intel n'a pas encore décidé de franchir une étape aussi drastique, préférant agir par des méthodes traditionnelles : amélioration du contrôleur de mémoire dans le chipset et du mécanisme Prefetch dans le processeur (voir ci-dessous à ce sujet).

En conclusion, on note que les notions de "vitesse de lecture/écriture" et de "latence", dans le cas général, sont applicables à tout type de mémoire - y compris non seulement les DRAM classiques (SDR, Rambus, DDR, DDR2), mais aussi cache (voir ci-dessous).

Processeur : informations générales

La notion d'architecture

Architecture en tant que compatibilité de code

Vous avez sûrement souvent rencontré le terme "x86", ou "processeur compatible Intel" (ou "compatible IBM PC" - mais c'est déjà en relation avec un ordinateur). Parfois, le terme "compatible Pentium" est également rencontré (pourquoi exactement Pentium - vous comprendrez un peu plus tard). Que se cache-t-il vraiment derrière tous ces noms ? Pour le moment, du point de vue de l'auteur, la formulation simple suivante semble la plus correcte : un processeur x86 moderne est un processeur capable d'exécuter correctement le code machine de l'architecture IA32 (l'architecture des processeurs Intel 32 bits). En première approximation, il s'agit du code exécuté par le processeur i80386 (populairement connu sous le nom de "386th"), mais le jeu d'instructions principal IA32 a finalement été formé avec la sortie du processeur Intel Pentium Pro. Que signifie "ensemble de base" et qu'y a-t-il d'autre ? Répondons d'abord à la première partie de la question. "De base" dans ce cas signifie qu'avec ce jeu d'instructions seul, tout programme pouvant être écrit pour un processeur x86 (ou IA32, si vous préférez) peut être écrit.

De plus, l'architecture IA32 possède des extensions "officielles" (jeux d'instructions supplémentaires) du développeur de l'architecture elle-même, par Intel: MMX, SSE, SSE2 et SSE3. Il existe également des jeux d'instructions étendus "non officiels" (non Intel): EMMX, 3DNow! et 3DNow étendu ! Ils ont été développés par AMD. Cependant, "officiel" et "non officiel" dans ce cas est un concept relatif - de facto, tout se résume au fait que certaines extensions du jeu d'instructions sont reconnues par Intel, en tant que développeur du jeu d'origine, et certaines ne le sont pas , tandis que les développeurs Logiciel utiliser ce qui leur convient le mieux. Il existe une règle empirique simple concernant les jeux d'instructions étendus : avant de les utiliser, le programme doit vérifier si le processeur les prend en charge. Parfois, des écarts par rapport à cette règle se produisent (et peuvent entraîner un fonctionnement incorrect des programmes), mais objectivement, il s'agit d'un problème de logiciel mal écrit, pas d'un processeur.

A quoi servent les jeux de commandes supplémentaires ? Tout d'abord - pour augmenter les performances lors de l'exécution de certaines opérations. Une seule commande d'un ensemble supplémentaire exécute généralement une action qui nécessiterait un petit programme composé de commandes de l'ensemble principal. Encore une fois, en règle générale, une instruction est exécutée par le processeur plus rapidement que la séquence qui la remplace. Cependant, dans 99% des cas, rien de ce qui ne pouvait pas être fait avec les commandes de base ne peut être fait avec les commandes du jeu supplémentaire. Ainsi, la vérification susmentionnée par le programme de la prise en charge de jeux d'instructions supplémentaires par le processeur doit remplir une fonction très simple: si, par exemple, le processeur prend en charge SSE, nous calculerons rapidement à l'aide des commandes du jeu SSE. Sinon, nous calculerons plus lentement, en utilisant les commandes de l'ensemble principal. Un programme bien écrit devrait faire exactement cela. Cependant, pratiquement personne ne vérifie désormais la prise en charge de MMX dans un processeur, car tous les processeurs sortis au cours des 5 dernières années prennent en charge cet ensemble avec garantie. Pour référence, voici un tableau qui résume les informations sur la prise en charge de divers jeux d'instructions étendus par divers processeurs de bureau (conçus pour les ordinateurs de bureau).

CPU

Intel Pentium II

Intel Celeron jusqu'à 533 MHz

IntelPentium III

Intel Celeron 533-1400 MHz

Intel Celeron à partir de 1700 MHz

Intel Pentium 4 édition extrême

Intel Pentium eXtreme Edition

AMD Duron jusqu'à 900 MHz

AMD Duron à partir de 1000 MHz

AMD Athlon 64 / Athlon FX

AMD Athlon 64X2

* selon modification

À l'heure actuelle, tous les logiciels de bureau populaires (systèmes d'exploitation Windows et Linux, suites bureautiques, jeux informatiques, etc.) sont développés spécifiquement pour les processeurs x86. Il fonctionne (à l'exception des programmes "mal élevés") sur n'importe quel processeur x86, peu importe qui l'a créé. Par conséquent, au lieu des termes "compatible Intel" ou "compatible Pentium" orientés vers le développeur de l'architecture d'origine, ils ont commencé à utiliser le nom neutre : "processeur compatible x86", "processeur x86". Dans ce cas, "l'architecture" fait référence à la compatibilité avec un ensemble spécifique d'instructions, c'est-à-dire que nous pouvons dire "l'architecture du processeur du point de vue du programmeur". Il existe une autre interprétation du même terme.

L'architecture comme caractéristique d'une famille de processeurs

"Travailleurs du fer" - les personnes qui travaillent principalement non pas avec des logiciels, mais avec du matériel, comprennent quelque chose de différent par "architecture" (cependant, ce qu'ils appellent "architecture" s'appelle plus correctement "microarchitecture", mais de facto le préfixe " micro" est souvent omis). Pour eux, "l'architecture CPU" est un certain ensemble de propriétés inhérentes à toute une famille de processeurs, généralement produites sur de nombreuses années (en d'autres termes, la "conception interne", "l'organisation" de ces processeurs). Ainsi, par exemple, tout expert en CPU x86 vous dira qu'un processeur avec des ALU fonctionnant à une fréquence double, un bus QDR, un cache Trace et éventuellement un support pour la technologie Hyper-Threading est un "processeur d'architecture NetBurst" (n'ayez pas peur de termes inconnus - ils seront tous expliqués un peu plus tard). Et les processeurs Intel Pentium Pro, Pentium II et Pentium III sont "architecture P6". Ainsi, le concept d '"architecture" par rapport aux processeurs est quelque peu ambigu: il peut signifier à la fois la compatibilité avec un certain ensemble d'instructions et un ensemble de solutions matérielles inhérentes à un certain groupe assez large de processeurs. Bien sûr, un tel dualisme de l'un des concepts fondamentaux n'est pas très pratique, mais c'est arrivé comme ça, et il est peu probable que quelque chose change dans un avenir proche...

Extensions 64 bits de l'architecture x86 classique (IA32)

Il n'y a pas si longtemps, les deux principaux fabricants de CPU x86 annonçaient deux technologies quasi identiques* (cependant, AMD préfère appeler cela une architecture), grâce auxquelles les CPU classiques x86 (IA32) ont reçu le statut de 64 bits. Dans le cas de la DMLA cette technologie a reçu le nom "AMD64" (architecture AMD 64 bits), dans le cas d'Intel - "EM64T" (technologie de mémoire étendue 64 bits). De plus, des anciens respectables qui connaissent l'histoire du problème utilisent parfois le nom "x86-64" - comme désignation générale pour toutes les extensions 64 bits de l'architecture x86, non liées aux marques déposées d'aucun fabricant. De facto, l'utilisation de l'un des trois noms ci-dessus dépend plus des préférences personnelles de l'utilisateur que des différences réelles - car les différences entre AMD64 et EM64T tiennent sur la pointe d'une aiguille très fine. De plus, AMD lui-même n'a introduit le nom "propriétaire" "AMD64" que peu de temps avant l'annonce de ses propres processeurs basés sur cette architecture, et avant cela, il était assez calme d'utiliser le "x86-64" plus neutre dans ses propres documents. Cependant, d'une manière ou d'une autre, tout se résume à une chose : certains registres internes du processeur sont devenus 64 bits au lieu de 32 bits, les instructions de code x86 32 bits ont reçu leurs homologues 64 bits, en plus, la quantité de la mémoire adressable (y compris non seulement physique, mais et virtuelle) a augmenté plusieurs fois (en raison du fait que l'adresse a acquis un format 64 bits au lieu de 32 bits). Le nombre de spéculations marketing sur le thème du « 64 bits » a dépassé toutes les limites raisonnables, il convient donc d'examiner de très près les mérites de cette innovation. Alors, qu'est-ce qui a réellement changé et qu'est-ce qui n'a pas changé ?

* - Les arguments selon lesquels Intel, disent-ils, "ont impudemment copié EM64T à partir d'AMD64" ne résistent pas à la critique. Et pas du tout parce que ce n'est pas le cas - mais parce que ce n'est pas du tout "impudemment". Il existe un « accord de licences croisées ». Si un tel accord existe, cela signifie que tous les développements d'une entreprise dans un certain domaine deviennent automatiquement disponibles pour une autre, de même que les développements d'une autre deviennent automatiquement disponibles pour la première. Intel a profité des licences croisées pour développer l'EM64T, basé sur l'AMD64 (ce que personne n'a jamais nié). AMD a profité du même accord pour introduire dans ses processeurs la prise en charge des jeux d'instructions supplémentaires SSE2 et SSE3 développés par Intel. Et il n'y a rien de honteux là-dedans : une fois que nous avons accepté de « partager » les développements, alors nous devons partager.

Qu'est-ce qui n'a pas changé ? Tout d'abord - la vitesse des processeurs. Ce serait un non-sens flagrant de considérer que le même processeur, lors du passage du mode 32 bits habituel au mode 64 bits (et tous les processeurs x86 actuels prennent en charge le mode 32 bits sans faute), fonctionnera 2 fois plus vite. Bien sûr, dans certains cas, il peut y avoir une certaine accélération de l'utilisation de l'arithmétique entière 64 bits - mais le nombre de ces cas est très limité et ils ne concernent pas la plupart des logiciels utilisateur modernes. Au fait : pourquoi avons-nous utilisé le terme « arithmétique entière 64 bits » ? Mais parce que les blocs d'opérations en virgule flottante (voir ci-dessous) dans tous les processeurs x86 ne sont plus en 32 bits depuis longtemps. Et même pas en 64 bits. Le FPU x87 classique (voir ci-dessous), qui a finalement fait partie du processeur à l'époque du bon vieux Intel Pentium 32 bits, était déjà 80 bits. Les opérandes des commandes SSE et SSE2/3 sont du tout en 128 bits ! À cet égard, l'architecture x86 est assez paradoxale: malgré le fait que formellement les processeurs de cette architecture sont restés 32 bits pendant assez longtemps, la profondeur de bits de ces blocs où une «grande profondeur de bits» était vraiment nécessaire a été augmentée de manière complètement indépendante des autres. Par exemple, les processeurs AMD Athlon XP et Intel Pentium 4 "Northwood" combinaient des blocs qui fonctionnaient avec des opérandes 32 bits, 80 bits et 128 bits. Seul le jeu d'instructions principal (hérité du premier processeur de l'architecture IA32 - Intel 386) et l'adressage mémoire (maximum 4 gigaoctets, sauf "perversions") sont restés en 32 bits Type Intel APE).

Ainsi, le fait que les processeurs AMD et Intel soient devenus "formellement 64 bits" ne nous a apporté que trois améliorations en pratique : l'apparition de commandes permettant de travailler avec des entiers 64 bits, une augmentation du nombre et/ou de la profondeur des registres, et une augmentation de la quantité maximale de mémoire adressable. A noter : personne ne nie les réels bénéfices de ces innovations (surtout la troisième !) Tout comme personne ne nie les mérites d'AMD dans la promotion de l'idée de "modernisation" (due à l'introduction du 64 bits) des processeurs x86. Nous voulons juste mettre en garde contre des attentes excessives : n'espérez pas qu'un ordinateur acheté "dans la gamme de prix VAZ" devienne une "Mercedes fringante" après l'installation d'un logiciel 64 bits. Il n'y a pas de miracles au monde...

Cœur du processeur

Différences entre les cœurs d'une même microarchitecture

Un « cœur de processeur » (généralement appelé simplement « cœur » en abrégé) est une implémentation spécifique d'une [micro]architecture (c'est-à-dire une « architecture au sens matériel du terme ») qui est la norme pour toute une série de processeurs. Par exemple, NetBurst est la microarchitecture qui sous-tend de nombreux processeurs Intel actuels : Celeron, Pentium 4, Xeon. La microarchitecture fixe les principes généraux : un long pipeline, l'utilisation d'un certain type de cache de code de premier niveau (Trace cache), et d'autres fonctionnalités « globales ». Le noyau est une mise en œuvre plus concrète. Par exemple, les processeurs de la microarchitecture NetBurst avec un bus de 400 MHz, un cache de second niveau de 256 kilo-octets et aucun support Hyper-Threading - c'est une description plus ou moins complète du cœur Willamette. Mais le noyau Northwood a un cache de second niveau de 512 kilo-octets, bien qu'il soit également basé sur NetBurst. Le noyau AMD Thunderbird est basé sur la microarchitecture K7, mais ne prend pas en charge le jeu d'instructions SSE, alors que le noyau Palomino le fait déjà.

Ainsi, on peut dire que le « cœur » est une réalisation particulière d'une certaine microarchitecture « en silicium », qui présente (contrairement à la microarchitecture elle-même) un certain ensemble de caractéristiques strictement déterminées. La microarchitecture est amorphe, elle décrit les principes généraux de construction d'un processeur. Le noyau - plus précisément, c'est une microarchitecture, "envahie" par toutes sortes de paramètres et de caractéristiques. Les cas où les processeurs ont changé de microarchitecture, en gardant le nom, sont extrêmement rares. Et, vice versa, presque tous les noms de processeurs ont "changé" le cœur au moins plusieurs fois au cours de son existence. Par exemple, le nom commun de la série de processeurs AMD est "Athlon XP" - il s'agit d'une microarchitecture (K7), mais jusqu'à quatre cœurs (Palomino, Thoroughbred, Barton, Thorton). Différents noyaux construits sur la même microarchitecture peuvent avoir, entre autres, des performances différentes.

Révisions

Une révision fait partie des modifications du noyau, qui diffère très légèrement de la précédente, c'est pourquoi elle ne mérite pas le titre de « nouveau noyau ». En règle générale, les fabricants de processeurs ne font pas un grand événement avec les versions de la prochaine révision, cela se produit «en état de marche». Donc, même si vous achetez le même processeur, avec un nom et des caractéristiques complètement similaires, mais avec un intervalle d'environ six mois, c'est tout à fait possible, en fait, ce sera déjà un peu différent. La publication d'une nouvelle révision est généralement associée à quelques améliorations mineures. Par exemple, nous avons réussi à réduire légèrement la consommation d'énergie, ou à réduire la tension d'alimentation, ou à optimiser autre chose, ou quelques erreurs mineures ont été éliminées. En termes de performances, nous ne nous souvenons pas d'un seul exemple où une révision du noyau différait d'une autre de manière si significative qu'il serait logique d'en parler. Bien qu'une telle option soit purement théoriquement possible - par exemple, l'une des unités de traitement chargées d'exécuter plusieurs commandes a subi une optimisation. En résumé, on peut dire qu'il ne vaut le plus souvent pas la peine de "s'embêter" avec les révisions du processeur : dans de très rares cas, un changement de révision apporte des changements drastiques au processeur. Il suffit de savoir qu'il existe une telle chose - uniquement pour le développement général.

Fréquence centrale

En règle générale, c'est ce paramètre que l'on appelle familièrement la "fréquence du processeur". Bien que dans le cas général la définition de "fréquence du cœur" soit encore plus correcte, puisqu'il n'est pas du tout nécessaire que tous les composants du CPU fonctionnent à la même fréquence que le cœur (l'exemple le plus courant du contraire était l'ancien " slot » x86 CPU - Intel Pentium II et Pentium III pour le Slot 1, AMD Athlon pour le Slot A - leur cache L2 fonctionnait à 1/2, et parfois même à 1/3 de la fréquence cœur). Une autre idée fausse courante est la croyance que la fréquence du noyau détermine sans ambiguïté les performances. En fait, c'est deux fois faux : premièrement, chaque cœur de processeur spécifique (en fonction de sa conception, du nombre d'unités d'exécution qu'il contient divers types, etc. etc.) peut exécuter un nombre différent d'instructions par cycle, tandis que la fréquence n'est que le nombre de ces cycles par seconde. Ainsi (la comparaison ci-dessous est, bien sûr, très simplifiée et donc très arbitraire) un processeur dont le cœur exécute 3 instructions par horloge peut avoir un tiers de fréquence plus faible qu'un processeur exécutant 2 instructions par horloge - et en même temps avoir complètement la même vitesse.

Deuxièmement, même au sein d'un même cœur, une augmentation de la fréquence n'entraîne pas toujours une augmentation proportionnelle des performances. C'est là que les connaissances que vous pourriez glaner dans la section "Principes généraux d'interaction entre le processeur et la RAM" vous seront très utiles. Le fait est que la vitesse d'exécution des commandes par le cœur du processeur n'est en aucun cas le seul indicateur qui affecte la vitesse d'exécution du programme. La vitesse à laquelle les commandes et les données arrivent sur le CPU est tout aussi importante. Imaginez, purement théoriquement, un tel système: vitesse du processeur - 10 "000 commandes par seconde, vitesse de la mémoire - 1000 octets par seconde. Question: même si nous supposons qu'une commande ne prend pas plus d'un octet et que nous n'avons aucune donnée , à quelle vitesse le programme sera-t-il exécuté dans un tel système ? fréquence du cœur sans accélérer le sous-système mémoire en même temps, puisque dans ce cas, à partir d'un certain stade, une augmentation de la fréquence du processeur n'affectera plus l'augmentation dans les performances du système dans son ensemble.

Caractéristiques de la formation des noms de processeur

Auparavant, quand le ciel était plus bleu, la bière avait meilleur goût et les filles étaient plus jolies, les transformateurs s'appelaient simplement : le nom du fabricant + le nom gamme de modèles+ fréquence. Par exemple : "AMD K6-2 450 MHz". À l'heure actuelle, les deux grands fabricants se sont déjà écartés de cette tradition et, au lieu de fréquence, ils utilisent des chiffres incompréhensibles qui indiquent qui sait quoi. Une brève explication de la signification réelle de ces chiffres fait l'objet des deux sections suivantes.

Évaluations d'AMD

La raison pour laquelle AMD a « supprimé » la fréquence du nom de ses processeurs et l'a remplacée par un nombre abstrait est bien connue : après l'apparition du processeur Intel Pentium 4, qui fonctionne à des fréquences très élevées, les processeurs AMD à côté ont commencé à "avoir l'air mal dans la fenêtre" - l'acheteur ne croyait pas qu'un processeur avec une fréquence de 1500 MHz, par exemple, puisse dépasser un processeur avec une fréquence de 2000 MHz. Par conséquent, la fréquence dans le nom a été remplacée par une note. L'interprétation formelle ("de jure", pour ainsi dire) de cette note dans la bouche d'AMD à différents moments sonnait un peu différemment, mais elle n'a jamais sonné sous la forme sous laquelle elle était perçue par les utilisateurs : un processeur AMD avec un certain devrait être au moins pas plus lent qu'un processeur Intel Pentium 4 avec une fréquence correspondant à cette cote. Pendant ce temps, ce n'était un secret pour personne que c'était précisément cette interprétation qui était le but ultime de l'introduction de la notation. En général, tout le monde a parfaitement tout compris, mais AMD a prétendu avec diligence que cela n'avait rien à voir avec cela :). Elle ne devrait pas être blâmée pour cela : dans la lutte compétitive, des règles complètement différentes s'appliquent que dans les joutes. De plus, les résultats de tests indépendants ont montré qu'en général, AMD attribue des notes assez justes à ses processeurs. En fait, tant que c'est le cas, cela n'a guère de sens de protester contre l'utilisation de la notation. Certes, une question reste ouverte: pourquoi (nous nous intéressons, bien sûr, à l'état de fait, et non aux explications du service marketing) la note des processeurs AMD sera-t-elle liée un peu plus tard, alors qu'au lieu du Pentium 4 , Intel commence à produire un autre processeur ?

Numéro de processeur d'Intel

Ce que vous devez retenir tout de suite : Le numéro de processeur (ci-après dénommé PN) pour les processeurs Intel n'est pas une note. Pas une note de performance, et pas une note pour quoi que ce soit d'autre. En fait, c'est juste un "item", un élément d'une ligne dans la liste d'inventaire, dont le seul travail est de s'assurer que la ligne d'un processeur est différente de la ligne d'un autre. Au sein de la série (le premier chiffre de PN), les deux autres chiffres, en principe, peuvent dire quelque chose, mais étant donné la présence de tableaux qui montrent la correspondance complète entre PN et les paramètres réels, nous ne voyons pas l'intérêt de mémoriser lesquels sont matchs intermédiaires. La motivation qui a guidé Intel lors de l'introduction de PN (encore une fois, au lieu de spécifier la fréquence du processeur) est plus complexe que celle d'AMD. La nécessité d'introduire PN (comme l'explique Intel lui-même) est principalement due au fait que les deux principaux concurrents ont des approches différentes de la question de l'unicité du nom du CPU. Par exemple, le nom d'AMD "Athlon 64 3200+" peut signifier quatre processeurs à la fois avec des spécifications techniques(mais la même "note"). Intel est d'avis que le nom du processeur doit être unique, à propos duquel la société devait auparavant "esquiver" en ajoutant différentes lettres à la valeur de fréquence dans le nom, ce qui a semé la confusion. En théorie, PN était censé éliminer cette confusion. Difficile de dire si l'objectif a été atteint : tout de même, la nomenclature des processeurs Intel restait assez compliquée. En revanche, c'est inévitable, car la gamme de produits est trop large. Cependant, indépendamment de tout le reste, un effet de facto a définitivement été atteint: désormais, seuls les spécialistes qui comprennent le problème peuvent dire rapidement et avec précision «de mémoire» par le nom du processeur de quoi il s'agit et quelles seront ses performances par rapport aux autres processeurs . À quel point est-ce bon ? C'est dur à dire. Nous préférons ne pas commenter.

Mesurer la vitesse "en mégahertz" - comment est-ce possible ?

C'est impossible, car la vitesse ne se mesure pas en mégahertz, tout comme la distance ne se mesure pas en kilogrammes. Pourtant, messieurs les marketeurs ont compris depuis longtemps que dans un duel verbal entre un physicien et un psychologue, ce dernier gagne toujours - et peu importe qui a raison. C'est pourquoi nous avons lu des articles sur le "FSB 1066 MHz ultra-rapide", essayant péniblement de comprendre comment la vitesse peut être mesurée à l'aide de la fréquence. En fait, depuis qu'une telle tendance perverse a pris racine, il vous suffit de comprendre clairement ce que cela signifie. Et cela signifie ceci : si nous « fixons » la largeur du bus à N bits, alors sa bande passante dépendra vraiment de la fréquence à laquelle ce bus fonctionne et de la quantité de données qu'il peut transférer par horloge. Sur un bus processeur classique à vitesse "unique" (par exemple, le processeur Intel Pentium III disposait d'un tel bus), 64 bits, soit 8 octets, sont transmis par cycle. En conséquence, si fréquence de fonctionnement bus est de 100 MHz (100 "000" 000 cycles par seconde) - alors le taux de transfert de données sera égal à 8 octets * 100 "000" 000 hertz ~= 763 mégaoctets par seconde (et si vous comptez en "mégaoctets décimaux", dans lequel il est d'usage de compter les flux de données, alors encore plus beau - 800 mégaoctets par seconde). En conséquence, si un bus DDR fonctionne au même 100 mégahertz, capable de transmettre deux fois la quantité de données en un cycle d'horloge, la vitesse doublera exactement. Dès lors, selon la logique paradoxale des marketeurs, ce bus devrait s'appeler « 200 MHz ». Et s'il s'agit également d'un bus QDR (Quad Data Rate), alors il s'avère être du tout "400 MHz", puisqu'il transmet quatre paquets de données en un cycle. Bien que la fréquence réelle des trois pneus décrits ci-dessus soit la même - 100 mégahertz. C'est ainsi que « mégahertz » est devenu synonyme de vitesse.

Ainsi, un bus QDR (à "quadruple" débit), fonctionnant à une fréquence réelle de 266 MHz, s'avère comme par magie être "1066 MHz" pour nous. Le nombre "1066" dans ce cas représente le fait que sa bande passante est exactement 4 fois supérieure à celle d'un bus "mono-vitesse" fonctionnant à la même fréquence. Vous n'êtes pas encore confus?.. Habituez-vous! Ce n'est pas une théorie de la relativité pour vous, tout est beaucoup plus compliqué et négligé ici ... Cependant, le plus important ici est d'apprendre par cœur un principe simple: si nous sommes déjà engagés dans une perversion telle que comparer la vitesse de deux bus l'un à l'autre "en mégahertz", alors ils doivent avoir la même largeur. Sinon, il s'avère comme dans un forum où une personne a sérieusement soutenu que la bande passante de l'AGP2X ("133 MHz", mais bus 32 bits) est supérieure à la bande passante FSB du Pentium III 800 (fréquence réelle 100 MHz, largeur 64 bits).

Quelques mots sur certaines fonctionnalités intéressantes des protocoles DDR et QDR

Comme mentionné ci-dessus, en mode DDR, une double quantité d'informations est transmise sur le bus en un cycle d'horloge, et en mode QDR, elle est quadruplée. Certes, dans les documents axés davantage sur la glorification des réalisations des fabricants que sur la couverture objective des réalités, pour une raison quelconque, ils oublient toujours d'indiquer un petit "mais": les modes double et quadruple vitesse ne sont activés que lors du transfert de données par paquets. Autrement dit, si nous avons demandé quelques mégaoctets de mémoire de l'adresse X à l'adresse Y, alors oui, ces deux mégaoctets seront transférés à une vitesse double / quadruple. Mais la demande de données elle-même est envoyée sur le bus à une vitesse "unique" - toujours ! En conséquence, si nous avons beaucoup de requêtes et que la taille des données envoyées n'est pas très importante, alors la quantité de données qui "voyage" sur le bus à une seule vitesse (et une requête est aussi une donnée) sera presque égale à la quantité de celles qui sont transmises à une vitesse double ou quadruple. Il semble que personne ne nous ait ouvertement menti, il semble que DDR et QDR fonctionnent vraiment, mais ... comme on dit dans une vieille blague: "soit il a volé le manteau de fourrure de quelqu'un, soit quelqu'un a volé son manteau de fourrure, mais qu'est-ce que quelque chose est mal avec un manteau de fourrure ... ";)

Processeur "gros bloc"

Cache

Description générale et principe de fonctionnement

Tous les processeurs modernes ont un cache (en anglais - cache). Un cache est une sorte de type spécial de mémoire (la principale caractéristique qui distingue radicalement un cache de la RAM est sa vitesse), qui est une sorte de "tampon" entre le contrôleur de mémoire et le processeur. Ce tampon sert à augmenter la vitesse de travail avec la RAM. Comment? Essayons maintenant d'expliquer. Dans le même temps, nous avons décidé d'abandonner les comparaisons qui sentent bon la maternelle, que l'on retrouve souvent dans la littérature de vulgarisation sur les sujets des processeurs (piscines reliées par des tuyaux de diamètres différents, etc., etc.). Pourtant, une personne qui a lu l'article jusqu'à présent et qui ne s'est pas endormie est probablement capable de supporter et de "digérer" une explication purement technique, sans piscines, chats et pissenlits.

Alors, imaginons que nous ayons beaucoup de mémoire relativement lente (soit 10 000 000 octets de RAM) et relativement peu de mémoire très rapide (soit un cache de seulement 1 024 octets). Comment pouvons-nous utiliser ce malheureux kilo-octet pour augmenter la vitesse de travail avec toute la mémoire en général ? Et ici, il convient de rappeler que les données au cours du programme, en règle générale, ne sont pas jetées inconsidérément d'un endroit à l'autre - elles changent. Nous lisons la valeur d'une variable dans la mémoire, y ajoutons un nombre et l'écrivons au même endroit. Le tableau a été lu, trié par ordre croissant - encore une fois, écrit dans la mémoire. Autrement dit, à un moment donné, le programme ne fonctionne pas avec toute la mémoire, mais, en règle générale, avec un fragment relativement petit de celle-ci. Quelle solution est demandée ? C'est vrai: chargez ce fragment dans la mémoire "rapide", traitez-le là-bas, puis réécrivez-le dans la mémoire "lente" (ou supprimez-le simplement du cache si les données n'ont pas changé). Dans le cas général, c'est exactement ainsi que fonctionne le cache du processeur : toute information lue à partir de la mémoire pénètre non seulement dans le processeur, mais également dans le cache. Et si la même information (la même adresse en mémoire) est à nouveau nécessaire, le processeur vérifie d'abord : est-elle dans le cache ? Si c'est le cas, les informations sont extraites de là et l'accès à la mémoire ne se produit pas du tout. De même pour l'écriture : les informations, si leur volume tient dans le cache, y sont écrites, et seulement alors, lorsque le processeur a terminé l'opération d'écriture et commencé à exécuter d'autres commandes, les données écrites dans le cache, parallèlement au travail du cœur du processeur, est « lentement déchargé » dans la RAM .

Bien entendu, la quantité de données lues et écrites pendant toute la durée d'exécution du programme est bien supérieure à la quantité de cache. Par conséquent, certains d'entre eux doivent être supprimés de temps en temps afin que de nouveaux, plus pertinents, puissent tenir dans le cache. Le mécanisme connu le plus simple pour garantir ce processus consiste à suivre l'heure du dernier accès aux données dans le cache. Ainsi, si nous devons mettre de nouvelles données dans le cache, et qu'il est déjà "plein", le contrôleur qui gère le cache regarde : quel fragment de cache n'a pas été consulté depuis le plus longtemps ? C'est ce fragment qui est le premier candidat à un "départ", et de nouvelles données sont écrites à sa place, avec lesquelles vous devez travailler maintenant. C'est ainsi que fonctionne, en termes généraux, le mécanisme de mise en cache dans les processeurs. Bien sûr, l'explication ci-dessus est très primitive, en fait, elle est encore plus compliquée, mais nous espérons que vous avez pu vous faire une idée générale de la raison pour laquelle le processeur a besoin d'un cache et de son fonctionnement.

Et pour comprendre à quel point le cache est important, donnons un exemple simple : la vitesse d'échange de données du processeur Pentium 4 avec ses caches est plus de 10 fois (!) supérieure à la vitesse de son travail avec la mémoire. En fait, les processeurs modernes ne peuvent fonctionner avec le cache qu'à leur plein potentiel: dès qu'ils sont confrontés à la nécessité de lire des données en mémoire, tous leurs mégahertz tant vantés commencent simplement à "réchauffer l'air". Encore un exemple simple : l'exécution de l'instruction la plus simple par le processeur se fait en un cycle d'horloge, c'est-à-dire qu'en une seconde il peut exécuter autant d'instructions simples que sa fréquence (en fait, même plus, mais nous laisserons ça pour plus tard...). Mais le temps d'attente des données de la mémoire peut être supérieur à 200 cycles dans le pire des cas ! Que fait le processeur pendant qu'il attend les bonnes données ? Et il ne fait rien. Rester debout et attendre...

Mise en cache à plusieurs niveaux

La conception spécifique des cœurs de processeur modernes a conduit au fait que le système de mise en cache de la grande majorité des processeurs doit être multi-niveaux. Le cache de premier niveau (le plus proche du cœur) est traditionnellement divisé en deux moitiés (généralement égales) : le cache d'instructions (L1I) et le cache de données (L1D). Cette division est fournie par la soi-disant "architecture Harvard" du processeur, qui est actuellement le développement théorique le plus populaire pour la construction de processeurs modernes. Dans L1I, respectivement, seules les commandes sont accumulées (le décodeur fonctionne avec lui, voir ci-dessous) et dans L1D - seules les données (elles tombent ensuite, en règle générale, dans les registres internes du processeur). "Au-dessus de L1" est le cache de second niveau - L2. Il est, en règle générale, plus volumineux et déjà «mixte» - les commandes et les données s'y trouvent. L3 (cache de troisième niveau), en règle générale, répète complètement la structure de L2 et se trouve rarement dans les processeurs x86 modernes. Le plus souvent, L3 est le fruit d'un compromis : en utilisant un bus plus lent et plus étroit, on peut le rendre très gros, mais en même temps, la vitesse L3 est toujours plus rapide que la vitesse mémoire (bien que moins rapide que la L2 cache). ). Néanmoins, l'algorithme pour travailler avec un cache à plusieurs niveaux en général ne diffère pas de l'algorithme pour travailler avec un cache à un seul niveau, juste des itérations supplémentaires sont ajoutées: d'abord, les informations sont recherchées dans L1, si elles n'y sont pas, dans L2, puis dans L3, et seulement alors, s'il n'y en a pas, il n'a pas été trouvé à un niveau de cache - la mémoire principale (RAM) est en cours d'accès.

Décodeur

En fait, les unités d'exécution de tous les processeurs de bureau x86 modernes... ne fonctionnent pas du tout avec le code de la norme x86. Chaque processeur a son propre système de commande "interne", qui n'a rien à voir avec ces commandes (donc "code") qui viennent de l'extérieur. En général, les commandes exécutées par le noyau sont beaucoup plus simples, "primitives" que les commandes du standard x86. C'est précisément pour que le processeur "ressemble extérieurement" à un CPU x86 qu'il existe un tel bloc en tant que décodeur : il est chargé de convertir le code x86 "externe" en commandes "internes" exécutées par le noyau (en l'occurrence cas, assez souvent une instruction de code x86 est convertie en "interne" un peu plus simple). Le décodeur est une partie très importante d'un processeur moderne : sa vitesse détermine la constance du flux de commandes reçues par les unités d'exécution. Après tout, ils sont incapables de travailler avec le code x86, donc qu'ils fassent quelque chose ou qu'ils soient inactifs dépend en grande partie de la vitesse du décodeur. Une manière plutôt inhabituelle d'accélérer le processus de décodage des commandes a été implémentée par Intel dans les processeurs d'architecture NetBurst - voir ci-dessous à propos du cache Trace.

Dispositifs d'exécution (fonctionnels)

Après avoir traversé tous les niveaux de cache et le décodeur, les commandes arrivent enfin aux blocs pour lesquels tout ce gâchis a été arrangé : les périphériques d'exécution. En fait, ce sont les dispositifs d'exécution qui sont le seul élément nécessaire du processeur. Vous pouvez vous passer du cache - la vitesse diminuera, mais les programmes fonctionneront. Vous pouvez vous passer d'un décodeur - les dispositifs d'exécution deviendront plus compliqués, mais le processeur fonctionnera. Au final, les premiers processeurs x86 (i8086, i80186, 286, 386, 486, Am5x86) se sont en quelque sorte débrouillés sans décodeur. Il est impossible de se passer de périphériques d'exécution, car ils exécutent le code du programme. En toute première approximation, elles sont traditionnellement divisées en deux grands groupes : les unités arithmétiques logiques (ALU) et les unités à virgule flottante (FPU).

Unités logiques arithmétiques

Les ALU sont traditionnellement chargées de deux types d'opérations : les opérations arithmétiques (addition, soustraction, multiplication, division) sur des entiers, opérations logiques avec des entiers à nouveau ("et" logique, "ou" logique, "ou exclusif", etc.). Ce qui, en fait, découle de leur nom. Il existe généralement plusieurs ALU dans les processeurs modernes. Pour quoi - vous comprendrez plus tard, après avoir lu la section "Superscalarité et exécution dans le désordre des commandes". Il est clair que l'ALU ne peut exécuter que les commandes qui lui sont destinées. La distribution des commandes provenant du décodeur aux différents dispositifs d'exécution est gérée par un bloc spécial, mais cela, comme on dit, est déjà «des choses trop complexes», et cela n'a guère de sens de les expliquer dans un matériel consacré uniquement à une connaissance superficielle des principes de base du fonctionnement x86 moderne.

Unité à virgule flottante*

Le FPU est engagé dans l'exécution d'instructions qui fonctionnent avec des nombres à virgule flottante, en plus, traditionnellement, ils y "accrochent tous les chiens" sous la forme de toutes sortes de jeux d'instructions supplémentaires (MMX, 3DNow !, SSE, SSE2, SSE3 ...) - qu'ils fonctionnent ou non, ce sont des nombres à virgule flottante ou des entiers. Comme dans le cas d'une ALU, il peut y avoir plusieurs blocs individuels dans une FPU, et ils peuvent fonctionner en parallèle.

* - selon les traditions de l'école mathématique russe, nous appelons le FPU une "unité à virgule flottante", bien que son nom (unité à virgule flottante) se traduise littéralement par "... virgule flottante" - selon la norme américaine pour écrire de telles Nombres.

Registres du processeur

Les registres sont, en fait, les mêmes cellules de mémoire, mais "territorialement", ils sont situés directement dans le cœur du processeur. Bien sûr, la vitesse de travail avec des registres est plusieurs fois supérieure à la vitesse de travail avec des cellules de mémoire situées dans la RAM principale (ici, en général, par ordre de grandeur ...), et avec des caches de n'importe quel niveau. Par conséquent, la plupart des instructions d'architecture x86 prévoient l'implémentation d'actions sur le contenu des registres, et non sur le contenu de la mémoire. Cependant, le nombre total de registres de processeur est généralement très faible - il ne peut même pas être comparé au volume des caches de premier niveau. Par conséquent, le code de programme de facto (pas dans un langage de haut niveau, à savoir binaire, "machine") contient souvent la séquence d'opérations suivante : charger des informations de la RAM dans l'un des registres du processeur, charger d'autres informations (également de la RAM) dans un autre registre, produire une action sur le contenu de ces registres, placer le résultat dans le troisième - puis décharger à nouveau le résultat du registre dans la mémoire principale.

Processeur en détail

Caractéristiques des caches

Fréquence du cache et son bus

Dans tous les processeurs x86 modernes, tous les niveaux de cache fonctionnent à la même fréquence que le cœur du processeur, mais cela n'a pas toujours été le cas (ce problème a déjà été soulevé ci-dessus). Cependant, la vitesse de travail avec le cache dépend non seulement de la fréquence, mais également de la largeur du bus par lequel il est connecté au cœur du processeur. Comme vous vous en souvenez (espérons-le) de ce que vous avez lu précédemment, le taux de transfert de données est essentiellement le produit de la fréquence du bus (nombre d'horloges par seconde) et du nombre d'octets transférés sur le bus en un cycle d'horloge. Le nombre d'octets transmis par horloge peut être augmenté en introduisant les protocoles DDR et QDR (Double Data Rate et Quad Data Rate) - ou simplement en augmentant la largeur du bus. Dans le cas d'un cache, la deuxième option est plus populaire - notamment en raison des "caractéristiques épicées" de DDR/QDR décrites ci-dessus. Bien entendu, la largeur minimale raisonnable du bus de cache est la largeur du bus externe du processeur lui-même, c'est-à-dire à ce jour - 64 bits. C'est exactement ce que fait AMD dans un esprit de minimalisme sain : dans ses processeurs, la largeur de bus L1<—>L2 est égal à 64 bits, mais en même temps il est bidirectionnel, c'est-à-dire qu'il est capable de transmettre et de recevoir simultanément des informations. Intel a une nouvelle fois agi dans l'esprit du « gigantisme sain » : dans ses processeurs, à commencer par le Pentium III « Coppermine », le bus L1<—>L2 fait... 256 bits de large ! Selon le principe "vous ne pouvez pas gâcher la bouillie avec de l'huile", comme on dit. Certes, ce bus est unidirectionnel, c'est-à-dire qu'à un moment donné il ne fonctionne soit qu'en émission, soit qu'en réception. Le débat sur la meilleure approche (bus bidirectionnel, mais plus étroit, ou large unidirectionnel) est toujours en cours ... cependant, ainsi que de nombreux autres différends concernant les solutions techniques utilisées par les deux principaux concurrents sur le marché des processeurs x86.

Cache exclusif et non exclusif

Les concepts de cache exclusif et non exclusif sont très simples : dans le cas d'un cache non exclusif, les informations à tous les niveaux de cache peuvent être dupliquées. Ainsi, L2 peut contenir des données qui sont déjà dans L1I et L1D, et L3 (si elle existe) peut contenir une copie complète de tout le contenu de L2 (et, par conséquent, L1I et L1D). Un cache exclusif, contrairement à un cache non exclusif, permet une distinction claire : si une information est contenue à un certain niveau du cache, alors elle est absente à tous les autres. L'avantage du cache exclusif est évident : la taille totale des informations mises en cache dans ce cas est égale au volume total des caches de tous les niveaux - contrairement au cache non exclusif, où la taille des informations mises en cache (dans le pire cas) est égal au volume du plus grand niveau de cache. Le moins du cache exclusif est moins évident, mais il existe : un mécanisme spécial est nécessaire pour surveiller « l'exclusivité » réelle (par exemple, lorsque des informations sont supprimées du cache L1, le processus de copie vers L2 est automatiquement lancé avant cette).

Le cache non exclusif est traditionnellement utilisé par Intel, l'exclusif (depuis l'apparition des processeurs Athlon basés sur le cœur Thunderbird) est utilisé par AMD. De manière générale, on assiste ici à une confrontation classique entre volume et vitesse : du fait de l'exclusivité, avec les mêmes volumes de L1/L2, AMD dispose d'une taille totale d'informations en cache plus importante - mais de ce fait, il fonctionne aussi plus lentement (retards causée par la présence d'un mécanisme d'exclusivité). Il faut sans doute noter que ces derniers temps Intel a compensé les lacunes d'un cache non exclusif simplement, bêtement, mais lourdement : en augmentant son volume. Pour les processeurs haut de gamme de cette société, un cache L2 de 2 Mo est devenu presque la norme - et AMD, avec ses 128 Ko L1C + L1D et un maximum de 1 Mo L2, ne peut pas encore "dépasser" ces 2 Mo même en raison de exclusivité.

De plus, il est logique d'augmenter la quantité totale d'informations mises en cache en introduisant une architecture de cache exclusive uniquement si le gain en volume est suffisamment important. Pour AMD, c'est pertinent. ses processeurs actuels ont une taille totale L1D + L1I de 128 Ko. Les processeurs Intel, dont la taille L1D est au maximum de 32 Ko, et L1I a parfois une structure complètement différente (voir à propos du cache Trace), l'introduction d'une architecture exclusive apporterait beaucoup moins d'avantages.

Et il existe également une idée fausse très répandue selon laquelle l'architecture de cache des processeurs Intel est «inclusive». Pas vraiment. Ce n'est PAS exclusif. L'architecture inclusive prévoit que le niveau "inférieur" du cache ne peut pas contenir quoi que ce soit qui ne soit pas dans le niveau "supérieur". L'architecture non exclusive permet uniquement la duplication des données à différents niveaux.

Cache de traces

Le concept du cache Trace est de stocker dans le cache d'instructions du premier niveau (L1I) non pas les commandes qui sont lues depuis la mémoire, mais des séquences déjà décodées (voir décodeur). Ainsi, si une certaine instruction x86 est ré-exécutée et qu'elle est toujours en L1I, le décodeur du processeur n'a pas besoin de la re-traduire en une séquence d'instructions "code interne", puisque L1I contient cette séquence sous une forme déjà décodée. Le concept de cache Trace s'intègre très bien dans le concept global Architectures Intel NetBurst, axé sur la création de processeurs avec une fréquence de cœur très élevée. Cependant, l'utilité du cache Trace pour les processeurs à fréquence [relativement] inférieure est encore discutable, car la complexité de l'organisation du cache Trace devient comparable à la tâche de conception d'un décodeur rapide conventionnel. Par conséquent, tout en rendant hommage à l'originalité de l'idée, nous dirions tout de même que Trace cache ne peut être considéré comme une solution universelle "pour toutes les occasions".

Exécution superscalaire et dans le désordre

La principale caractéristique de tous les processeurs modernes est qu'ils sont capables de lancer pour exécution non seulement l'instruction qui (selon le code du programme) doit être exécutée à un instant donné, mais également les autres qui la suivent. Voici un exemple simple (canonique). Supposons que nous devions exécuter la séquence de commandes suivante :

1) A = B + C
2) Z = X + Y
3) K = A + Z

Il est facile de voir que les commandes (1) et (2) sont totalement indépendantes l'une de l'autre - elles ne se croisent ni dans les données initiales (variables B et C dans le premier cas, X et Y dans le second), ni à l'emplacement du résultat (variable A dans le premier cas et Z dans le second). Par conséquent, si pour le moment nous avons plus d'un bloc d'exécution libre, ces commandes peuvent être réparties entre eux et exécutées simultanément et non séquentiellement *. Ainsi, si nous prenons le temps d'exécution de chaque instruction égal à N cycles de processeur, alors dans le cas classique l'exécution de la séquence entière prendrait N * 3 cycles, et dans le cas d'une exécution parallèle, seulement N * 2 cycles (puisque la commande (3) ne peut être exécutée, sans attendre le résultat de l'exécution des deux précédentes).

* - bien sûr, le degré de parallélisme n'est pas infini : les commandes ne peuvent être exécutées en parallèle que si à un instant donné, il existe un nombre approprié de blocs (FU) libres de travail, et uniquement ceux qui "comprennent" les commandes Dans la question. L'exemple le plus simple : un bloc lié à l'ALU est physiquement incapable d'exécuter une instruction destinée au FPU. L'inverse est également vrai.

En fait, c'est encore plus difficile. Donc si on a la séquence suivante :

1) A = B + C
2) K = A + M
3) Z = X + Y

La file d'attente d'exécution des commandes du processeur sera alors modifiée ! Puisque les commandes (1) et (3) sont indépendantes l'une de l'autre (ni en termes de données source, ni en termes d'emplacement du résultat), elles peuvent être exécutées en parallèle - et seront exécutées en parallèle. Mais la commande (2) sera exécutée après eux (la troisième) - car pour que le résultat des calculs soit correct, il faut que la commande (1) ait été exécutée avant cela. C'est pourquoi le mécanisme évoqué dans cette section est appelé « exécution dans le désordre des commandes » (Out-of-Order Execution, ou « OoO » en abrégé) : dans les cas où l'ordre d'exécution ne peut en aucun cas affecter le résultat , les commandes sont envoyées pour exécution dans le mauvais ordre, la séquence dans laquelle elles se trouvent dans le code du programme, mais dans celle qui vous permet d'obtenir des performances maximales.

Vous devriez maintenant comprendre pourquoi les processeurs modernes ont besoin d'autant d'unités d'exécution similaires : ils offrent la possibilité d'exécuter plusieurs instructions en parallèle, ce qui, dans le cas de l'approche "classique" de la conception des processeurs, devrait être exécuté en l'ordre dans lequel ils sont contenus dans le code source, un par un.

Les processeurs équipés d'un mécanisme d'exécution parallèle de plusieurs commandes consécutives sont dits "superscalaires". Cependant, tous les processeurs superscalaires ne prennent pas en charge l'exécution dans le désordre. Ainsi, dans le premier exemple, la "superscalarité simple" (exécution simultanée de deux commandes consécutives) nous suffit, mais dans le deuxième exemple, nous ne pouvons pas nous passer de réorganiser les commandes par endroits si nous voulons obtenir le maximum de performances. Tous les processeurs x86 modernes ont les deux qualités : ils sont superscalaires et ils prennent en charge l'exécution dans le désordre des instructions. Dans le même temps, il y avait aussi des "superscalaires simples" dans l'histoire de x86 qui ne supportaient pas OoO. Par exemple, le superscalaire x86 de bureau classique sans OoO était l'Intel Pentium.

En toute honnêteté, il convient de noter que ni Intel, ni AMD, ni aucun autre fabricant de processeurs x86 (y compris le défunt) n'a le moindre mérite dans le développement de concepts superscalaires et OoO. Le premier ordinateur superscalaire prenant en charge OoO a été développé par Seymour Cray dans les années 1960. A titre de comparaison : Intel a sorti son premier processeur superscalaire (Pentium) en 1993, le premier superscalaire avec OoO (Pentium Pro) en 1995 ; Le premier superscalaire d'AMD avec OoO (K5) est sorti en 1996. Les commentaires, comme on dit, sont inutiles ...

Décodage préliminaire (avancé)
et mise en cache

Prédiction de branche

Dans tout programme plus ou moins complexe, il existe des commandes de saut conditionnel : "Si une certaine condition est vraie, aller à l'exécution d'une section de code, sinon, d'une autre." Du point de vue de la vitesse d'exécution du code programme processeur moderne, qui prend en charge l'exécution dans le désordre, toute instruction de saut conditionnel est vraiment le fléau de Dieu. Après tout, jusqu'à ce que l'on sache quelle section du code après la transition conditionnelle sera «pertinente», il est impossible de commencer à le décoder et à l'exécuter (voir exécution dans le désordre). Afin de concilier d'une manière ou d'une autre le concept d'exécution dans le désordre avec les instructions de branchement conditionnel, un bloc spécial est prévu : le bloc de prédiction de branchement. Comme son nom l'indique, il est en fait engagé dans des "prophéties": il essaie de prédire sur quelle section du code l'instruction de saut conditionnel pointera, avant même qu'elle ne soit exécutée. Conformément aux instructions du "prophète intra-nucléaire régulier", le processeur effectue des actions bien réelles: la section de code "prédite" est chargée dans le cache (si elle n'y est pas), et même le décodage et l'exécution de ses commandes commencent . De plus, parmi les commandes exécutées, il peut aussi y avoir des instructions de saut conditionnel, et leurs résultats sont également prédits, ce qui génère toute une chaîne de prédictions qui n'ont pas encore été vérifiées ! Bien sûr, si le prédicteur de branche est erroné, tout le travail effectué conformément à ses prédictions est simplement annulé.

En fait, les algorithmes utilisés par le bloc de prédiction de branchement ne sont pas du tout des chefs-d'œuvre. intelligence artificielle. Ils sont pour la plupart simples... et stupides. Car le plus souvent, une instruction de branchement conditionnel se produit par cycles : un certain compteur prend la valeur X, et après chaque passage du cycle, la valeur du compteur diminue de un. Ainsi, tant que la valeur du compteur est supérieure à zéro, le passage au début du cycle s'effectue, et après qu'il devient égal à zéro, l'exécution se poursuit. Le bloc de prédiction de branchement analyse simplement le résultat de l'exécution d'une instruction de branchement conditionnel et considère que si N fois de suite le résultat était un saut vers une certaine adresse, alors dans N + 1 cas le saut sera effectué vers la même adresse. Cependant, malgré tout le primitivisme, ce régime fonctionne très bien : par exemple, si le compteur prend la valeur 100, et que le prédicteur de branche "seuil" (N) est égal à deux sauts d'affilée vers la même adresse, il est facile de voir que 97 sauts sur 98 seront prédit correctement !

Bien sûr, malgré l'efficacité plutôt élevée algorithmes simples, les mécanismes de prédiction de branche dans les processeurs modernes sont constamment améliorés et se compliquent - mais nous parlons déjà ici de la lutte pour les unités de pourcentage: par exemple, pour augmenter l'efficacité de l'unité de prédiction de branche de 95% à 97, ou même de 97% à 99...

Prélecture des données

Le bloc de prélecture de données (Prefetch) est très similaire dans son principe au bloc de prédiction de branche - à la seule différence que dans ce cas, nous ne parlons pas de code, mais de données. Principe général l'action est la même : si le schéma d'analyse d'accès aux données intégré dans la RAM décide qu'une zone de mémoire qui n'a pas encore été chargée dans le cache sera bientôt accessible, il donne une commande pour charger cette zone de mémoire dans le cache avant même il est nécessaire au programme exécutable. Un bloc de prélecture fonctionnant "intelligemment" (efficacement) peut réduire considérablement le temps d'accès aux données requises et, par conséquent, augmenter la vitesse d'exécution du programme. Soit dit en passant: un Prefetch compétent compense très bien la latence élevée du sous-système de mémoire, chargeant les données nécessaires dans le cache, et nivelant ainsi les retards lors de leur accès s'ils n'étaient pas dans le cache, mais dans la RAM principale.

Cependant, bien sûr, en cas d'erreur dans le bloc de prélecture des données, les conséquences négatives sont inévitables : en chargeant de facto des données "inutiles" dans le cache, Prefetch en chasse les autres (peut-être juste les bonnes). De plus, du fait de "l'anticipation" de l'opération de lecture, une charge supplémentaire est créée sur le contrôleur mémoire (de facto, en cas d'erreur, c'est totalement inutile).

Les algorithmes de prélecture, comme les algorithmes du bloc de prédiction de branche, ne brillent pas non plus d'intelligence : en règle générale, ce bloc cherche à savoir si les informations sont lues à partir de la mémoire avec un certain "pas" (par adresses), et sur cette base analyse, il essaie de prédire à partir de quelle adresse les données seront lues au cours de l'exécution ultérieure du programme. Cependant, comme dans le cas du bloc de prédiction de branchement, la simplicité de l'algorithme ne signifie pas du tout une faible efficacité : en moyenne, le bloc de prélecture des données "hit" plus souvent qu'il ne fait d'erreurs (et ce, comme dans le cas précédent , est principalement dû au fait que " la lecture "massive" des données de la mémoire se produit généralement lors de l'exécution de divers cycles).

Conclusion

Je suis ce lapin qui ne peut pas commencer à mâcher de l'herbe avant
ne comprendra pas en détail comment se déroule le processus de photosynthèse !
(exposé d'une position personnelle par une des connaissances proches de l'auteur)

Il est tout à fait possible que les sentiments que vous avez ressentis après la lecture de cet article puissent être décrits comme suit : "Au lieu d'expliquer sur les doigts quel processeur est le meilleur, ils ont pris et chargé mon cerveau avec un tas d'informations spécifiques que je dois encore comprendre et comprendre, et pas de fin en vue !" Une réaction tout à fait normale : croyez-moi, on vous comprend bien. Disons encore plus (et laissons tomber la couronne de nos têtes!): Si vous pensez que nous pouvons nous-mêmes répondre à cette simple question ("quel processeur est le meilleur?"), Alors vous vous trompez beaucoup. Ne peux pas. Pour certaines tâches, l'une est meilleure, pour d'autres - l'autre, et puis il y a des prix différents, la disponibilité, la sympathie d'un utilisateur particulier pour certaines marques ... La tâche n'a pas de solution univoque. Si c'était le cas, quelqu'un l'aurait sûrement trouvé et serait devenu le chroniqueur le plus célèbre de l'histoire des laboratoires de test indépendants.

Je voudrais souligner à nouveau: même si vous comprenez et comprenez parfaitement toutes les informations présentées dans ce document, vous ne pouvez toujours pas prédire lequel des deux processeurs sera le plus rapide dans vos tâches, en ne regardant que leurs caractéristiques. Premièrement, parce que loin d'être toutes les caractéristiques des processeurs sont prises en compte ici. Deuxièmement, parce qu'il existe également de tels paramètres CPU qui ne peuvent être représentés sous forme numérique qu'avec une très grande "étendue". Alors pour qui (et pourquoi) tout cela est-il écrit ? Fondamentalement - pour ces mêmes "lapins" qui veulent certainement savoir ce qui se passe à l'intérieur des appareils qu'ils utilisent quotidiennement. Pourquoi? Peut-être qu'ils se sentent mieux quand ils savent ce qui se passe autour d'eux ? :)

Stanislav Garmatiouk ( [courriel protégé])

Article architecture x86 La section OS et processeur matériel peut être utile pour les développeurs Delphi et FreePascal.

Il y a 65536 paragraphes dans 1 Mio, ce qui leur permet d'être numérotés avec des nombres de 16 bits. Les segments de mémoire ont une taille de 65 536 octets et commencent toujours sur une limite de paragraphe. L'adresse d'un emplacement mémoire se compose de deux parties : le numéro de paragraphe à partir duquel le segment commence et le décalage dans le segment, et s'écrit généralement sous la forme SSSS:OOOO, où S et O sont des chiffres hexadécimaux. SSSS est appelé le composant de segment de l'adresse, tandis que OOOO est appelé le décalage. L'adresse de cellule donnée au bus est la composante de segment multipliée par 16 plus le décalage. Le composant de segment est placé dans un registre spécial appelé segment, et le décalage est placé dans le registre IP (registre d'instruction). Les microprocesseurs 8086/8088, 80186/80188 et 80286 avaient quatre registres de segment, c'est-à-dire qu'ils pouvaient fonctionner simultanément avec quatre segments de mémoire dans un but précis. En 80386, deux autres ont été ajoutés qui n'avaient pas de but particulier.

  • Registres de segment et leur objectif :
    • CS - Segment de code. Utilisé pour récupérer les commandes du programme ;
    • DS - Segment de données. Utilisé par défaut pour l'accès aux données ;
    • ES - Segment supplémentaire. C'est le destinataire des données dans les commandes de traitement de chaîne ;
    • SS - Segment de pile. Utilisé pour héberger pile de logiciels ;
    • FS - Registre de segment supplémentaire. N'a pas de but particulier. Apparu dans le processeur 80386;
    • GS - Semblable au précédent, mais dans les nouveaux processeurs à architecture 64 bits, il a un statut spécial : il peut être utilisé pour une commutation rapide de contexte.

Bien que les registres de segment aient missions spéciales, l'architecture permet, lors de l'accès aux données, de remplacer un segment par un autre. Les segments de destination de code, de pile et de ligne utilisent toujours les registres CS, SS et ES et ne peuvent pas être modifiés.

La quantité totale de mémoire adressée en mode réel est de 1048576 octets (0000:0000-F000:FFFF(00000-FFFFF)-adresse logique (adresse physique) en notation hexadécimale). L'approche par segment vous permet de diviser la totalité de la mémoire en 16 segments, en commençant par des adresses qui sont des multiples de 64 Ko. Ces 16 segments sont appelés pages mémoire. En règle générale, la pagination est utilisée pour le fonctionnement coopératif de périphériques dont les interfaces sont mappées sur un espace d'adressage mémoire ; alors chacun de ces appareils utilise une page de mémoire, et l'adresse de cellule dans l'espace d'adressage de l'appareil correspondra au décalage dans le segment de mémoire de l'ordinateur. Ainsi, dans les ordinateurs IBM PC, les pages 11 à 15 sont utilisées comme "mémoire vidéo" (l'espace d'adressage de l'adaptateur vidéo), et la seizième page (située aux adresses FFFF : 0000 - FFFF : FFFF) est appelée la "zone de mémoire élevée". », qui par la suite MS-DOS utilisé pour héberger son noyau et ses tampons d'E / S, laissant plus de mémoire "normale" pour les programmes d'application. Tellement vrai à la disposition de l'utilisateur la mémoire est de 640 Ko (10 premières pages).

De plus, en mode réel, il n'y a pas de protection de la mémoire et de différenciation des droits d'accès, il est donc presque hors d'usage. Il s'agit du mode par défaut pour tous les modèles de processeurs de la famille x86.

Mode protégé(mode protégé)

Un mode plus avancé qui est apparu pour la première fois dans le processeur 80286 et a été amélioré à plusieurs reprises depuis. Il dispose d'un grand nombre de sous-modes, qui peuvent être utilisés pour suivre l'évolution de la famille de processeurs. Ce mode prend en charge la protection de la mémoire, les contextes de tâches et les outils d'organisation de la mémoire virtuelle. Semblable au mode réel, un modèle de mémoire segmentée est également utilisé ici, mais déjà organisé selon un principe différent : il n'y a pas de division en paragraphes, et l'emplacement des segments est décrit par des structures spéciales (tables de descripteurs) situées dans la RAM. En plus de l'adresse de base du segment, les descripteurs contiennent la taille du segment (plus précisément, le décalage maximal disponible) et divers attributs de segment qui sont utilisés pour protéger la mémoire et déterminer les droits d'accès au segment pour divers modules de programme. Il existe deux types de tables de descripteurs : globales et locales. Le tableau global décrit les segments du système d'exploitation et les structures de données partagées. Une table locale peut être définie pour chaque tâche spécifique (processus). Les segments de mémoire sont également sélectionnés par les mêmes registres de segment ; cependant, au lieu du numéro de paragraphe, le registre de segment contient une structure spéciale (sélecteur) contenant l'index du descripteur dans la table. Le descripteur lui-même est chargé depuis la mémoire dans un registre interne inaccessible par programme (cache), lié à chaque registre de segment et automatiquement chargé au moment de sa modification.

Chaque module de programme s'exécutant en mode protégé est défini par son segment de code, décrit par le registre CS, qui détermine ses privilèges d'accès aux données et aux autres modules. Il existe 4 niveaux de privilèges (0, 1, 2 et 3) appelés anneaux de protection. L'anneau 0 est le plus privilégié. Il est destiné aux modules du noyau du système d'exploitation. L'anneau 3 est le moins privilégié et est réservé aux programmes utilisateur. Les anneaux 1 et 2 ne sont utilisés que par certains systèmes d'exploitation. Les segments de données ont également des attributs d'autorisation qui n'autorisent l'accès qu'au code disposant de privilèges identiques ou supérieurs. Le système en anneau vous permet de répartir de manière flexible l'accès au code et aux données.

Le processeur 80386, apparu en 1985, contrairement à ses prédécesseurs, est devenu 32 bits. Il a introduit la possibilité d'adresser jusqu'à 4 Gio de mémoire, ce qui a permis de créer des segments de mémoire de la taille de l'espace d'adressage entier. Par conséquent, les nouveaux systèmes d'exploitation utilisaient un modèle d'organisation de la mémoire dégénéré, lorsque tous les segments commençaient à l'adresse zéro. Ce modèle s'appelle appartement(modèle de mémoire plate), et l'adresse est spécifiée par un seul entier 32 bits (bien qu'il s'agisse en fait d'un décalage à l'intérieur d'un segment dégénéré), et les segments eux-mêmes sont utilisés exclusivement pour organiser la protection le long des anneaux de privilèges.

Mode virtuel 8086(mode 8086 virtuel, V86)

C'est un sous-mode de protégé, mais utilise un modèle d'adresse similaire au mode réel. Utilisé pour exécuter d'anciens programmes 8086 dans un environnement moderne systèmes d'exploitation. Contrairement au mode réel, où tous les programmes ont accès à toute la mémoire (anneau 0), en mode V86, le programme s'exécute dans l'anneau 3 (le moins privilégié) et les exceptions et interruptions sont gérées par des routines normales en mode protégé.

modes mixtes

3DNow !

Un ensemble d'instructions pour le traitement de flux de nombres réels simple précision. Pris en charge par les processeurs AMD depuis K6-2. Non pris en charge par les processeurs Intel.

3DNow ! utiliser les registres MMX comme opérandes (deux nombres simple précision sont placés dans un registre), par conséquent, contrairement à SSE, lors du changement de tâche, il n'est pas nécessaire d'enregistrer le contexte 3DNow! séparément.

mode 64 bits

Au début des années 2000, il est devenu clair que l'espace d'adressage 32 bits de l'architecture x86 limitait les performances des applications qui fonctionnent avec de grandes quantités de données. L'espace d'adressage 32 bits permet au processeur d'adresser directement seulement 4 Go de données. Cela peut ne pas être suffisant pour certaines applications telles que le traitement vidéo ou la maintenance de bases de données.

Pour résoudre ce problème, Intel a développé une nouvelle architecture IA-64- la base de la famille de processeurs Itanium. Pour assurer la rétrocompatibilité avec les anciennes applications utilisant du code 32 bits, IA-64 a introduit un mode d'émulation. Cependant, dans la pratique, ce mode de fonctionnement s'est avéré extrêmement lent. AMD a proposé une solution alternative au problème d'augmentation de la capacité du processeur. Au lieu d'inventer complètement nouveau système commandes, il a été proposé d'introduire une extension 64 bits à l'architecture x86 32 bits déjà existante. L'architecture d'origine s'appelait x86-64, il a ensuite été renommé AMD64. Initialement, le nouveau jeu d'instructions était pris en charge par les familles de processeurs optéron , Athlon 64 et Tourion 64 Société AMD. Le succès des processeurs utilisant la technologie AMD64, ainsi qu'un intérêt lent pour l'architecture IA-64, ont incité Intel à licencier le jeu d'instructions AMD64. Dans le même temps, un certain nombre d'instructions spécifiques ont été ajoutées qui n'étaient pas présentes dans l'ensemble AMD64 d'origine. Une nouvelle version l'architecture se nomme EM64T.

Dans la littérature et les noms de version des produits de leur entreprise Microsoft et soleil utiliser la convention de dénomination fusionnée AMD64/EM64T lorsqu'il s'agit de versions 64 bits de leurs systèmes d'exploitation les fenêtres et Solaris respectivement. Dans le même temps, les éditeurs de logiciels pour les systèmes d'exploitation GNU/Linux , BSD utilisez les libellés "x86-64" ou "amd64", Mac OS X utilise l'étiquette "x86_64" pour souligner que le logiciel utilise des instructions 64 bits.

Virtualisation

Processeurs

Processeurs Intel

Le processeur i8086 16 bits a été créé en juin 1978. Il a d'abord travaillé aux fréquences de 4,77 MHz, puis à 8 et 10 MHz. Il a été fabriqué à l'aide de la technologie 3 microns et comportait 29 000 transistors.

Un peu plus tard, en 1979, le i8088 est développé, qui fonctionne aux mêmes fréquences que le i8086, mais utilise un bus de données 8 bits (le bus interne du processeur reste 16 bits) pour assurer une plus grande compatibilité avec les périphériques disponibles à l'époque. . . En raison de son prix inférieur, il était largement utilisé dans les premiers systèmes IBM PC à la place du 8086.

/

De plus, un bloc MMX a été ajouté au cœur du Pentium II.

Céléron

Le premier représentant de cette famille était basé sur l'architecture PentiumII, était une cartouche avec une carte de circuit imprimé sur laquelle le noyau, le cache L2 et l'étiquette de cache étaient montés. Monté dans un nid emplacement 2.

Les Xeon modernes sont basés sur l'architecture Noyau 2 /Core i7.

Processeurs AMD

Am8086 / Am8088 / Am186 / Am286 / Am386 / Am486

Fondamentalement nouveau processeur AMD (avril 1997), basé sur un cœur acheté auprès de NexGen. Ce processeur avait une construction de cinquième génération, mais appartenait à la sixième génération et se positionnait comme un concurrent PentiumII. Comprend un bloc MMX et un bloc légèrement repensé UPC. Cependant, ces blocs fonctionnaient toujours 15 à 20 % plus lentement que les processeurs Intel de fréquence similaire. Le processeur avait 64 Ko de cache L1.

Dans l'ensemble, les performances de type Pentium II, la compatibilité avec les cartes mères plus anciennes et un lancement plus précoce (AMD a introduit le K6 un mois plus tôt qu'Intel n'a introduit le P-II) et un prix plus bas l'ont rendu très populaire, mais les problèmes de production d'AMD ont considérablement gâché la réputation de ce processeur.

K6-2

Poursuite du développement du noyau K6. Ces processeurs ont ajouté la prise en charge d'un jeu d'instructions spécialisé 3DNow !. Les performances réelles, cependant, se sont avérées nettement inférieures à celles des Pentium II cadencés de manière similaire (cela était dû au fait que l'augmentation des performances avec l'augmentation de la fréquence était plus élevée pour le P-II en raison du cache interne) et seul le Celeron pourrait rivaliser avec le K6-2. Le processeur avait 64 Ko de cache L1.

K6-III

Plus réussi technologiquement que K6-2, une tentative de créer un analogue Pentium III. Cependant, ce ne fut pas un succès marketing. Il se distingue par la présence de 64 Ko de cache de premier niveau et de 256 Ko de cache de second niveau dans le cœur, ce qui lui a permis de surpasser l'Intel Celeron en termes de performances à fréquence d'horloge égale et de ne pas être significativement inférieur au premiers Pentium III.

K6-III+

Similaire au K6-III avec technologie d'économie d'énergie PowerNow ! et une fréquence plus élevée et un jeu d'instructions étendu. À cause de fréquence accrue il a été installé seulement Super 7, ancienne plate-forme Prise 7 n'était pas pris en charge. Initialement destiné à ordinateurs portables, mais a également été installé sur les systèmes de bureau.

Un analogue de K6-III + avec un cache du deuxième niveau réduit à 128 KB.

Athènes

Un processeur très réussi, grâce auquel AMD a pu retrouver sa position presque perdue sur le marché des microprocesseurs. Cache de premier niveau - 128 Ko. Initialement, le processeur était produit dans une cartouche avec un cache de second niveau (512 Ko) sur la carte et installé dans un socket Emplacement A(qui est mécaniquement mais non électriquement compatible avec emplacement 1 d'Intel). Puis je suis passé au connecteur. Prise A et avait 256 Ko de cache L2 dans le noyau. En termes de vitesse - un analogue approximatif du Pentium III.

Duron

Une version simplifiée d'Athlon diffère de son parent par la taille du cache de second niveau (seulement 64 Ko, mais intégré à la puce et fonctionnant à la fréquence du cœur).

Celeron concurrent des générations Pentium III / Pentium 4. Les performances sont nettement supérieures à celles des Celerons similaires et, dans de nombreuses tâches, elles correspondent au Pentium III.

Athlon XP

Développement continu de l'architecture Athlon. En termes de vitesse - analogique Pentium 4. Par rapport à l'Athlon standard, un support d'instructions a été ajouté ESS.

Sempron

Une version moins chère (en raison du cache L2 réduit) des processeurs Athlon XP et Athlon 64.

Les premiers modèles Sempron ont été rebaptisés puces Athlon XP sur un noyau De race et Thorton, qui avait 256 Ko de cache au deuxième niveau et fonctionnait sur un bus 166 (333 DDR). Plus tard, des versions allégées d'Athlon 64/Athlon II ont été produites (et sont en cours de production) sous la marque Sempron, positionnées comme des concurrents d'Intel Celeron. Tous les Sempron ont un cache de niveau 2 tronqué ; les modèles plus jeunes de Socket 754 avaient bloqué Cool&quiet et x86-64; Les modèles Socket 939 avaient un mode mémoire à double canal bloqué.

optéron

Le premier processeur à prendre en charge l'architecture x86-64.

Athlon 64

Premier processeur non serveur à prendre en charge l'architecture x86-64.

Athlon 64X2

Continuation de l'architecture Athlon 64, a 2 cœurs.

AthlonFX

Avait la réputation de "processeur de jouets le plus rapide". Il s'agit en fait d'un processeur de serveur Opteron 1xx sur des sockets de bureau sans prise en charge de la mémoire enregistrée. Produit en petites quantités. Il coûte beaucoup plus cher que ses homologues "de masse".

Phénomène

Poursuite du développement de l'architecture Athlon 64, il est disponible en versions avec deux (Athlon 64 X2 Kuma), trois ( Phenom X3 Toliman) et quatre ( Phenom X4 Agena).

Phenom II

Processeurs VIA

VIA Cyrix III / VIA C3

Le premier processeur sorti sous la marque PASSANT PAR. Publié avec différents noyaux de différentes équipes de développement. Connecteur Prise 370.

La première version est basée sur le noyau Joshua, qui a été acquis par VIA avec l'équipe de développement Cyrix.

Deuxième version - avec le noyau Samuel, développé sur la base de l'IDT jamais sorti treuil-3. Se distingue par l'absence cache de deuxième niveau et, par conséquent, un niveau de performance extrêmement bas.

La troisième version est avec le noyau Samuel-2, une version améliorée du noyau précédent, équipé d'un cache de second niveau. Le processeur a été produit à l'aide d'une technologie plus fine et avait une consommation d'énergie réduite. Après la sortie de ce core, la marque VIA Cyrix III a finalement cédé sa place au VIA C3.

La quatrième version est avec le noyau Ezra. Il y avait aussi une variante Ezra-T adaptée pour fonctionner avec un bus conçu pour les processeurs Intel avec un cœur Tualatin. Poursuite du développement dans le sens des économies d'énergie.

PAR C7

Poursuite du développement de VIA C3. Noyau d'Esther (C5J), emballage - nano BGA 2 (21×21 mm), soudé directement sur frais. Ajout de la prise en charge matérielle de Secure Hash SHA-1 et SHA-256 et cryptage RSA, Support NX-bit, prise en charge MMX , ESS , ESS2 et ESS3. Réduction supplémentaire de la consommation d'énergie à des fréquences de fonctionnement jusqu'à 2 GHz. Propre bus système(VIA V4 800 MHz) pour communiquer avec le chipset. Il est également disponible en versions mobile (VIA C7-M) et de bureau (VIA C7-D).

VIA Eden ESP

Solution intégrée comprenant un processeur VIA C3 avec un cœur Nehemiah C5P et le pont Nord avec graphiques UMA intégrés. Sa consommation électrique est extrêmement faible (jusqu'à 7 W à 1 GHz). Disponible avec des fréquences de 300 MHz (VIA Eden ESP 3000) à 1 GHz (VIA Eden ESP 10000). Compatible ponts sud- VT8235M, VT8237R+ (avec prise en charge SATA), VT8251 (2×1 PCI-E) et VIA 686B.

VIA CoreFusion

Poursuite du développement des idées VIA Eden ESP. Disponible en deux versions - Marque VIA et VIA Luc, qui diffèrent par le cœur vidéo intégré, le type de mémoire pris en charge et les fréquences de fonctionnement. Pour VIA Mark est Graphiques S3 ProSavage4 / DTS PC133 / 533/800 MHz, et pour VIA Luke - VIA UniChrome Pro / DDR PC3200 / 533/800/1000 MHz. Southbridges compatibles : VT8235M, VT8237R+ (compatible SATA), VT8251 (2×1 PCI-E) et VIA 686B.

VIA Nano

Processeurs NCA

Il a sorti une série de processeurs, dont certains (le cœur V20/V30) étaient des logiciels compatibles avec les deux . La commutation entre les modes de fonctionnement a été effectuée à l'aide de trois instructions supplémentaires. Dans le matériel, ils ressemblaient à une version fortement accélérée de ou .

Les processeurs basés sur le cœur V33 n'avaient pas de mode d'émulation 8080, mais supportaient, à l'aide de deux instructions supplémentaires, un mode d'adressage étendu.

Processeurs NexGen

Nx586

En mars 1994, le processeur NexGen Nx586 a été introduit. Il se positionnait comme un concurrent du Pentium, mais ne disposait initialement pas de coprocesseur intégré. L'utilisation d'un bus propriétaire impliquait la nécessité d'utiliser des chipsets propriétaires, NxVL (VESA Local Bus) et NxPCI 820C500 (PCI), et un socket de processeur incompatible. Les chipsets ont été développés conjointement avec VLSI et Fujitsu. Le Nx586 était un processeur superscalaire et pouvait exécuter deux instructions par horloge. Le cache L1 était séparé (16 Ko pour les instructions + 16 Ko pour les données). Le contrôleur de cache L2 était intégré au processeur, tandis que le cache lui-même était situé sur la carte mère. Tout comme le Pentium Pro, le Nx586 était un processeur RISC à l'intérieur. Le manque de prise en charge des instructions CPUID dans les premières modifications de ce processeur a conduit au fait qu'il a été défini par programme comme un processeur 386 rapide. Cela était également lié au fait que Windows 95 refusait d'être installé sur des ordinateurs dotés de tels processeurs. Pour résoudre ce problème, un utilitaire spécial (IDON.COM) a été utilisé, qui représentait le Nx586 pour Windows comme un processeur de classe 586. Nx586 a été produit dans les installations d'IBM.

Un coprocesseur Nx587 FPU a également été développé, qui a été monté en usine sur le dessus de la puce du processeur. Ces "assemblages" étaient étiquetés Nx586Pf. Lors de la désignation des performances du Nx586, la cote P a été utilisée - de PR75 (70 MHz) à PR120 (111 MHz).

La prochaine génération de processeurs NexGen, qui n'est jamais sortie, mais a servi de base à l'AMD K6.

Processeurs SiS

SiS550

La famille de SoC SiS550 est basée sur autorisé core Rise mP6 et est disponible avec des fréquences de 166 à 266 MHz. Dans le même temps, les solutions les plus rapides ne consomment que 1,8 watts. Le noyau a trois pipelines entiers à 8 étages. Cache L1 séparé, 8+8 Ko. Le coprocesseur intégré est pipeliné. Le SiS550, en plus de l'ensemble standard de ports, comprend un cœur vidéo AGP 4x UMA 128 bits, un canal audio 5.1, la prise en charge de 2 DIMM (jusqu'à 1 Go de RAM), la prise en charge d'un modem logiciel et d'un IDE UDMA100 manette.

Le SiS551 ajoute également un contrôleur Smart Card et Memory Stick intégré, tandis que le SiS552 ajoute un décodeur MPEG2, une accélération de lecture DVD et VCD.

De plus, le clone SiS551 est produit par Jan Yin Chan Electronics Co., LTD (DM&P) sous le nom de marque Vortex86(la puce est marquée comme M6127D) et Xcore Corporation Ltd. sous la marque Xcore86.

Processeurs Transmeta

Crusoé

À proprement parler, Crusoe n'est pas un processeur x86. Pour exécuter du code x86, utilisez traducteur de logiciel vers 128 bits interne

2022 wisemotors.com. Comment ça fonctionne. Fer. Exploitation minière. Crypto-monnaie.