Si tu prends un processeur Intel moderne haut de gamme (e.g Intel Skylake / Platinium Gold ), tu as généralement deux FPU par coeur avec des tailles de registre allant de jusqu'a 512bits par FPU (AVX-512, chez Intel, AMD c'est différent ).
Donc ton processeur peut au maximum exécuter deux instructions AVX-512 par coeur à un moment donné.
Les processeurs Intel étant super-scalaire depuis les années 90, ils peuvent tous exécuter bien plus (a shit-more) que deux instructions par cycle par thread.... Donc un seul et unique thread est largement suffisant pour saturer les deux unité SIMD de ton coeur ( si ton code est vectorisé correctement ) et obtenir la performance de crête de ton processeur avec nombre de coeur == nombre de thread ( sans hyperthreading ).
Si tu "forces" l'hyperthreading, quand tu as déja atteint ce peak, la seule chose que tu vas gagner est une petite pénalité au runtime lié au coût du scheduling associé à l'hyperthreading.
Tu peux reproduire ça assez facilement chez toi en utilisant un petit bench floating-point intensif (e.g mt-dgemm) and un backend BLAS proprement optimisé du genre OpenBLAS, BLIS ou l'Intel MKL.
[^] # Re: HT et performances...
Posté par Firwen (site web personnel) . En réponse au journal Rumeurs sur l'hyper-threading - TLBleed. Évalué à 3.
Si tu prends un processeur Intel moderne haut de gamme (e.g Intel Skylake / Platinium Gold ), tu as généralement deux FPU par coeur avec des tailles de registre allant de jusqu'a 512bits par FPU (AVX-512, chez Intel, AMD c'est différent ).
https://en.wikichip.org/wiki/intel/microarchitectures/skylake_(client)#Front-end
Donc ton processeur peut au maximum exécuter deux instructions AVX-512 par coeur à un moment donné.
Les processeurs Intel étant super-scalaire depuis les années 90, ils peuvent tous exécuter bien plus (a shit-more) que deux instructions par cycle par thread.... Donc un seul et unique thread est largement suffisant pour saturer les deux unité SIMD de ton coeur ( si ton code est vectorisé correctement ) et obtenir la performance de crête de ton processeur avec nombre de coeur == nombre de thread ( sans hyperthreading ).
Si tu "forces" l'hyperthreading, quand tu as déja atteint ce peak, la seule chose que tu vas gagner est une petite pénalité au runtime lié au coût du scheduling associé à l'hyperthreading.
Tu peux reproduire ça assez facilement chez toi en utilisant un petit bench floating-point intensif (e.g mt-dgemm) and un backend BLAS proprement optimisé du genre OpenBLAS, BLIS ou l'Intel MKL.