Поддержка более нового расширения Intel SIMD ISA подразумевает поддержку предыдущих SIMD.
AVX2 определенно подразумевает AVX1.
Я думаю, что AVX1 подразумевает все SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2 функциональные биты также должны быть установлены в CPUID.
Обратите внимание, что popcnt
имеет свой собственный функциональный бит, поэтому теоретически вы можете использовать ЦП с AVX2и SSE4.2, но не popcnt
.
Теоретически вы могли бы создать ЦП (или виртуальную машину) с AVX, но не принимающие кодирование инструкций SSE4.2 без VEX.как pcmpistri
, но я думаю, что вы нарушаете гарантии Intel относительно того, что подразумевает функция AVX.Не уверен, если это формально записано в руководстве, но большинство программ предполагает, что.
Но AVX1 действительно подразумевает поддержку кодирования VEX all SSE4.2и более ранние инструкции SIMD, например, vpcmpistri
или vminss
gcc -mavx2
определенно подразумевают AVX1 и предыдущие расширения, но будут генерировать только код, который использует VEXкодирование.Однако он определит макрос __SSE4_2__
и т. Д., Поэтому gcc рассматривает AVX2 как подразумевающий более ранние расширения SSE и popcnt, но не AES или PCLMUL.Это отдельные функции даже для GCC.
(Обратите внимание, что MSVC не имеет столько макросов обнаружения ISA SIMD; он имеет один для AVX, но не для всех более ранних расширений SSE *.)
Обратите внимание, что AVX512 отчасти нарушает традиции.AVX512F подразумевает поддержку AVX2 и всего, что было до него, но, кроме этого, AVX512DQ, например, не «до» или «после» AVX512ER.Вы можете (теоретически) иметь либо оба, либо ни одного.(На практике Skylake-X / Cannonlake / etc. Имеет только небольшое совпадение с Xeon Phi (Knight's Landing / Knight's Mill), за пределами AVX512F. https://en.wikipedia.org/wiki/AVX-512#CPUs_with_AVX-512