Ya no tienes que indagar más por todo internet porque llegaste al sitio exacto, contamos con la solución que deseas y sin problemas.
Solución:
La compatibilidad con una extensión Intel SIMD ISA más reciente implica la compatibilidad con las SIMD anteriores.
AVX2 definitivamente implica AVX1.
Creo que AVX1 implica que todos los bits de función SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2 también deben configurarse en CPUID. Si no está formalmente garantizado, muchos las cosas hacen esta suposición y una CPU que la violó probablemente no sería comercialmente viable para uso general.
Tenga en cuenta que popcnt
tiene su propio bit de característica, por lo que en teoría podría tener una CPU con AVX2 y SSE4.2, pero no popcnt
pero muchas cosas tratan SSE4.2 como implicando popcnt
. Por lo tanto, es más como si pudiera anunciar soporte para popcnt sin SSE4.2.
En teoría, podría hacer una CPU (o máquina virtual) con AVX pero que no aceptara la codificación SSE heredada no VEX de instrucciones SSE4.2 como pcmpistri
, pero creo que estaría violando las garantías de Intel sobre lo que implica el bit de función AVX. No estoy seguro de si eso está escrito formalmente en un manual, pero la mayoría del software lo asumirá.
Pero AVX1 lo hace implica soporte para la codificación VEX de todos SSE4.2 e instrucciones SIMD anteriores, por ejemplo vpcmpistri
o vminss
gcc -mavx2
definitivamente implica AVX1 y extensiones anteriores, pero solo emitirá código que use la codificación VEX. Definirá la __SSE4_2__
macro y así sucesivamente, por lo que gcc trata a AVX2 como si implicara extensiones SSE y popcnt anteriores, pero no FMA, AES-NI o PCLMUL. Esas son características separadas incluso para GCC.
(En la práctica, debe utilizar gcc -march=native
o gcc -march=znver1
o lo que sea para habilitar todas las funciones que tiene su CPU, y establecer opciones de ajuste para ello. No solo -mavx2 -mfma
eso deja la configuración de ajuste en valores predeterminados incorrectos, como dividir cada carga/almacenamiento de 256 bits posiblemente desalineada en mitades de 128 bits).
(Tenga en cuenta que MSVC no tiene tantas macros de detección SIMD ISA; tiene una para AVX pero no para todas las extensiones SSE* anteriores. El modelo de MSVC está diseñado asumiendo que los programas realizarán la detección de CPU en tiempo de ejecución en lugar de compilarse para la máquina local. Aunque MSVC ahora tiene opciones AVX y AVX2 para usarlas como líneas de base).
Tenga en cuenta que AVX512 rompe las tradiciones. AVX512F implica soporte para AVX2 y todo lo anterior, pero más allá de eso, AVX512DQ no viene “antes” o “después” de AVX512ER, por ejemplo. Puede (en teoría) tener cualquiera, ambos o ninguno. (En la práctica, Skylake-X/Cannonlake/etc. tiene solo un poco de superposición con Xeon Phi (Knight’s Landing/Knight’s Mill), más allá de AVX512F. https://en.wikipedia.org/wiki/AVX-512#CPUs_with_AVX- 512
Si configuramos la opción del compilador -mavx2
que GCC no da un error cuando usamos intrínsecos AVX o SSE. Entonces, GCC supone que la existencia de la bandera AVX2 es suficiente para ejecutar el código AVX y SSE. Por supuesto, no garantiza que alguien no cree CPU con AVX2 y sin SSE.
Aquí puedes ver las reseñas y valoraciones de los usuarios
Ten en cuenta dar difusión a este escrito si te fue de ayuda.