Если вы строите с /arch:AVX
или /arch:AVX2
, влияние primary состоит в том, что весь код SSE, сгенерированный компилятором, будет использовать кодировку VEX , что позволяет более эффективнопланирование реестров.Если вы выполняете такой код в системе без поддержки AVX или AVX2, он на самом деле ошибается с недопустимой инструкцией.
Другими словами, использование _mm_set1_epi32
является инструкцией SSE2, но потому, что вы создали с/arch:AVX2
он отправил эти инструкции, используя префикс VEX.Переключатель /arch
влияет на явные внутренние свойства, сгенерированную компилятором математику с плавающей запятой, автовекторизатор и т. Д.
Если вы хотите поддерживать обе «стандартные» платформы SSE / SSE2, AVX и AVX2 с оптимизированными путями кода, используяавтоматическое генерирование, поддерживаемое переключателем /arch
, вам нужны три различных двоичных файла (EXE или DLL).
См. этот пост , а также этот
Обратите внимание, что основное различие между /arch:AVX
и /arch:AVX2
заключается в том, что компилятор иногда выдает инструкции FMA3, когда планировщик считает, что это будет быстрее, чем умножение, а затем сложение.