Je suis confus sur le nombre de flops par cycle et par cœur pouvant être effectués avec Sandy-Bridge et Haswell. Si je comprends bien avec SSE ce devrait être 4 flops par cycle par cœur pour SSE et 8 flops par cycle par cœur pour AVX/AVX2.
Cela semble être vérifié ici, Comment puis-je atteindre le maximum théorique de 4 FLOP par cycle? , et ici, Spécification CPU Sandy-Bridge .
Cependant, le lien ci-dessous semble indiquer que Sandy-bridge peut faire 16 flops par cycle par cœur et Haswell 32 flops par cycle par cœur http://www.extremetech.com/computing/136219-intels-haswell-is -une-menace-sans-précédent-pour-nvidia-AMD .
Quelqu'un peut m'expliquer cela?
Edit: je comprends maintenant pourquoi j'étais confus. Je pensais que le terme FLOP ne faisait référence qu'à un seul point flottant (SP). Je vois maintenant que le test à Comment puis-je atteindre le maximum théorique de 4 FLOP par cycle? sont en fait à double virgule flottante (DP) afin qu'ils atteignent 4 FLOP DP/cycle pour SSE et 8 FLOP DP/cycle pour AVX Il serait intéressant de refaire ces tests sur SP.
Voici le nombre théorique maximal de FLOP ( par cœur ) pour un certain nombre de microarchitectures de processeur récentes et une explication sur la façon de les atteindre.
En général, pour calculer cela, recherchez le débit des instructions FMA, par ex. sur https://agner.org/optimize/ ou tout autre résultat de référence, et multipliez(FMAs per clock) * (vector elements / instruction) * 2 (FLOPs / FMA)
.
Notez que la réalisation de cela dans du code réel nécessite un réglage très soigné (comme le déroulement de la boucle), et des échecs de cache proches de zéro, et aucun goulot d'étranglement sur quoi que ce soit sinon. Les processeurs modernes ont un débit FMA si élevé qu'il n'y a pas beaucoup de place pour d'autres instructions pour stocker les résultats ou pour les alimenter en entrée. par exemple. 2 charges SIMD par horloge sont également la limite pour la plupart des CPU x86, donc un produit scalaire goulot d'étranglement sur 2 charges par 1 FMA. Cependant, une multiplication de matrice dense soigneusement réglée peut se rapprocher de ces chiffres.
Si votre charge de travail comprend tout ADD/SUB ou MUL qui ne peut pas être contracté en FMA, les nombres maximaux théoriques ne sont pas un objectif approprié pour votre charge de travail. Haswell/Broadwell ont 2 SIMD par horloge SIM FP multiplier (sur les unités FMA), mais seulement 1 par horloge SIMD FP ajouter (sur un vecteur séparé) FP add unit with less latency). Skylake a supprimé le SIMD séparé FP additionneur, exécutant add/mul/fma de la même manière avec une latence 4c, 2 par- débit d'horloge, pour n'importe quelle largeur de vecteur.
Notez que les versions Celeron/Pentium des microarchitectures récentes ne prennent pas en charge les instructions AVX ou FMA, uniquement SSE4.2.
Intel Core 2 et Nehalem (SSE/SSE2):
Intel Sandy Bridge/Ivy Bridge (AVX1):
Intel Haswell/Broadwell/Skylake/Kaby Lake/Coffee/... (AVX + FMA3):
Intel Skylake-X/Skylake-EP/Cascade Lake/etc ( AVX512F ) avec 1 unités FMA : certains Xeon Bronze/Silver
Intel Skylake-X/Skylake-EP/Cascade Lake/etc ( AVX512F ) avec 2 unités FMA : puces de bureau haut de gamme Xeon Gold/Platinum et i7/i9 (HEDT).
Avenir: Intel Cooper Lake (successeur de Cascade Lake) devrait introduire Brain Float , un format float16 pour les charges de travail des réseaux neuronaux, avec prise en charge du calcul SIMD réel, contrairement à l'extension F16C actuelle qui ne prend en charge que le chargement/stockage avec conversion en float32. Cela devrait doubler le débit FLOP/cycle par rapport à la simple précision sur le même matériel.
Les puces Intel actuelles n'ont que le calcul réel directement sur float16 standard dans l'iGPU.
AMD K10:
Bulldozer AMD/Piledriver/Steamroller/Excavator, par module (deux cœurs):
AMD Ryzen
Intel Atom (Bonnell/45nm, Saltwell/32nm, Silvermont/22nm):
AMD Bobcat:
AMD Jaguar:
ARM Cortex-A9:
ARM Cortex-A15:
Qualcomm Krait:
IBM PowerPC A2 (Blue Gene/Q), par cœur:
IBM PowerPC A2 (Blue Gene/Q), par thread:
Intel Xeon Phi (Knights Corner), par cœur:
Intel Xeon Phi (Knights Corner), par fil:
Intel Xeon Phi (Knights Landing), par cœur:
La raison pour laquelle il existe des données par thread et par coeur pour IBM Blue Gene/Q et Intel Xeon Phi (Knights Corner) est que ces cœurs ont un taux d'émission d'instructions plus élevé lorsqu'ils exécutent plus d'un thread par cœur.
Le débit pour Haswell est plus faible pour l'addition que pour la multiplication et le FMA. Il existe deux unités de multiplication/FMA, mais une seule f.p. ajouter une unité. Si votre code contient principalement des ajouts, vous devez remplacer les ajouts par des instructions FMA par un multiplicateur de 1,0 pour obtenir le débit maximal.
La latence des instructions FMA sur Haswell est de 5 et le débit est de 2 par horloge. Cela signifie que vous devez conserver 10 opérations parallèles pour obtenir le débit maximal. Si, par exemple, vous souhaitez ajouter une très longue liste de f.p. chiffres, vous devez le diviser en dix parties et utiliser dix registres d'accumulateurs.
C'est effectivement possible, mais qui ferait une optimisation aussi bizarre pour un processeur spécifique?