Je prévois d'implémenter la détection à l'exécution des extensions SIMD à l'exécution. Est-ce que si je découvre que le processeur prend en charge AVX2, il est également garanti qu’il prend en charge SSE4.2 et AVX?
La prise en charge d'une extension Intel SIMD ISA plus récente implique la prise en charge des versions précédentes de SIMD.
AVX2 implique définitivement AVX1.
Je pense qu'AVX1 implique que tous les bits de fonctionnalité SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2 doivent également être définis dans le CPUID.
Notez que popcnt
a son propre bit de fonctionnalité, vous pouvez donc théoriquement avoir un processeur avec AVX2 et SSE4.2, mais pas popcnt
.
En théorie, vous pouvez créer un processeur (ou une machine virtuelle) avec AVX mais qui n'accepte pas l'encodage non-VEX des instructions SSE4.2 comme pcmpistri
, mais je pense que vous violeriez les garanties d'Intel concernant les implications du bit de fonctionnalité AVX. . Je ne sais pas si cela est formellement écrit dans un manuel, mais la plupart des logiciels le supposent.
Mais AVX1 fait implique le support du codage VEX de tout _ SSE4.2 et des instructions SIMD antérieures, par exemple. vpcmpistri
ou vminss
gcc -mavx2
implique définitivement AVX1 et les extensions précédentes, mais n'émettra que du code utilisant l'encodage VEX. Cependant, il définira la macro __SSE4_2__
et ainsi de suite. Gcc considère donc AVX2 comme impliquant les extensions SSE antérieures et le popcnt, mais pas AES ni PCLMUL. Ce sont des fonctionnalités distinctes, même pour GCC.
(Notez que MSVC n'a pas autant de macros de détection SIMD ISA; il en a une pour AVX mais pas pour toutes les extensions SSE * antérieures.)
Notez que AVX512 brise en quelque sorte les traditions. AVX512F implique la prise en charge d'AVX2 et de tout ce qui précède, mais au-delà, AVX512DQ ne vient pas "avant" ou "après" AVX512ER, par exemple. Vous pouvez (en théorie) avoir l'un, l'autre ou les deux. (En pratique, Skylake-X/Cannonlake/etc. Ne chevauche qu'un peu le Xeon Phi (Knight's Landing/Le moulin de Knight), au-delà de AVX512F. Https://en.wikipedia.org/wiki/AVX-512# CPUs_with_AVX-512
Si nous définissons l'option -mavx2
du compilateur, GCC ne génère pas d'erreur lorsque nous utilisons AVX ou SSE intrinsics. Donc, GCC suppose qu’il existe suffisamment d’indicateur AVX2 pour exécuter AVX et le code SSE. Bien sûr, cela ne garantit pas que quelqu'un ne créera pas de processeur avec AVX2 et sans SSE.
En principe, un processeur pourrait simplement prendre en charge AVX2 sans aucune instruction SSE4 (ce qui n’est pas une idée aussi stupide qu’elle en a l'air!). En pratique cependant, s'il prend en charge AVX2, il prend également en charge SSE4.