web-dev-qa-db-fra.com

FLOPS par cycle pour pont de sable et haswell SSE2 / AVX / AVX2

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.

49
user2088790

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.

Intel

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):

  • 4 FLOP DP/cycle: addition SSE2 à 2 larges + multiplication SSE2 à 2 larges
  • 8 SP FLOPs/cycle: 4-wide SSE addition + 4-wide SSE multiplication

Intel Sandy Bridge/Ivy Bridge (AVX1):

  • 8 FLOP DP/cycle: addition AVX 4 larges + multiplication AVX 4 larges
  • 16 SP FLOPs/cycle: addition AVX 8-large + multiplication AVX 8-large

Intel Haswell/Broadwell/Skylake/Kaby Lake/Coffee/... (AVX + FMA3):

  • 16 DP FLOP/cycle: deux instructions FMA (fusion-multiplication-additionnée) à 4 larges
  • 32 SP FLOPs/cycle: deux instructions FMA (multiplication-ajout fusionnée) de 8 largeurs)
  • (L'utilisation d'instructions vectorielles 256 bits peut réduire la vitesse d'horloge turbo maximale sur certains processeurs.)

Intel Skylake-X/Skylake-EP/Cascade Lake/etc ( AVX512F ) avec 1 unités FMA : certains Xeon Bronze/Silver

  • 16 DP FLOP/cycle: une instruction FMA (fusion-multiplication-additionnée) à 8 larges
  • 32 SP FLOPs/cycle: une instruction FMA (fusion multipliée-ajoutée) à 16 larges)
  • Même débit de calcul qu'avec des instructions 256 bits plus étroites, mais des accélérations peuvent toujours être possibles avec AVX512 pour des chargements/magasins plus larges, quelques opérations vectorielles qui ne s'exécutent pas sur les unités FMA comme les opérations au niveau du bit et des shuffles plus larges.
  • (Avoir des instructions vectorielles 512 bits en vol arrête le vecteur ALU sur le port 1. De plus réduit également la vitesse d'horloge turbo maximale , donc les "cycles" ne sont pas ' t une constante dans vos calculs de performances.)

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).

  • 32 FLOP DP/cycle: deux instructions FMA (fusion-multiplication-additionnée) à 8 larges
  • 64 SP FLOPs/cycle: deux instructions FMA (fusion multipliée-ajoutée) 16-wide
  • (Le fait d'avoir des instructions vectorielles 512 bits en vol arrête l'ALU vectoriel sur le port 1. Réduit également la vitesse d'horloge turbo maximale.)

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

AMD K10:

  • 4 FLOP DP/cycle: addition SSE2 à 2 larges + multiplication SSE2 à 2 larges
  • 8 SP FLOPs/cycle: 4-wide SSE addition + 4-wide SSE multiplication

Bulldozer AMD/Piledriver/Steamroller/Excavator, par module (deux cœurs):

  • 8 DP FLOPs/cycle: FMA 4 larges
  • 16 SP FLOPs/cycle: FMA à 8 étendues

AMD Ryzen

  • 8 DP FLOPs/cycle: FMA 4 larges
  • 16 SP FLOPs/cycle: FMA à 8 étendues

x86 faible puissance

Intel Atom (Bonnell/45nm, Saltwell/32nm, Silvermont/22nm):

  • 1.5 FLOP DP/cycle: addition scalaire SSE2 + multiplication scalaire SSE2 tous les deux cycles
  • 6 SP FLOPs/cycle: 4 larges SSE addition + 4 larges SSE multiplication tous les deux cycles)

AMD Bobcat:

  • 1.5 FLOP DP/cycle: addition scalaire SSE2 + multiplication scalaire SSE2 tous les deux cycles
  • 4 SP FLOPs/cycle: 4-wide SSE addition tous les deux cycles + 4-wide SSE multiplication tous les deux cycles)

AMD Jaguar:

  • 3 FLOP DP/cycle: ajout d'AVX à 4 larges tous les deux cycles + multiplication d'AVX à 4 larges en quatre cycles
  • 8 SP FLOPs/cycle: addition AVX à 8 échelons tous les deux cycles + multiplication AVX à 8 échelons tous les deux cycles


ARM

ARM Cortex-A9:

  • 1.5 DP FLOP/cycle: addition scalaire + multiplication scalaire tous les deux cycles
  • 4 SP FLOPs/cycle: addition de NEON à 4 larges tous les deux cycles + multiplication de NEON à 4 larges tous les deux cycles

ARM Cortex-A15:

  • 2 FLOP DP/cycle: FMA scalaire ou multiplication-addition scalaire
  • 8 SP FLOPs/cycle: 4-wide NEONv2 FMA ou 4-wide NEON multiply-add

Qualcomm Krait:

  • 2 FLOP DP/cycle: FMA scalaire ou multiplication-addition scalaire
  • 8 SP FLOPs/cycle: 4-wide NEONv2 FMA ou 4-wide NEON multiply-add

IBM POWER

IBM PowerPC A2 (Blue Gene/Q), par cœur:

  • 8 DP FLOP/cycle: QPX FMA 4-largeur à chaque cycle
  • Les éléments SP sont étendus à DP et traités sur les mêmes unités

IBM PowerPC A2 (Blue Gene/Q), par thread:

  • 4 FLOP DP/cycle: QPX FMA à 4 larges tous les deux cycles
  • Les éléments SP sont étendus à DP et traités sur les mêmes unités

Intel MIC/Xeon Phi

Intel Xeon Phi (Knights Corner), par cœur:

  • 16 FLOP DP/cycle: FMA à 8 largeurs à chaque cycle
  • 32 SP FLOPs/cycle: FMA 16 larges à chaque cycle

Intel Xeon Phi (Knights Corner), par fil:

  • 8 DP FLOP/cycle: FMA à 8 largeurs tous les deux cycles
  • 16 SP FLOPs/cycle: FMA 16 larges tous les deux cycles

Intel Xeon Phi (Knights Landing), par cœur:

  • 32 FLOP DP/cycle: deux FMA à 8 largeurs à chaque cycle
  • 64 SP FLOPs/cycle: deux FMA 16 de large à chaque cycle

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.

105
Marat Dukhan

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?

19
A Fog