Компилятор VC ++ менее умен, чем вы думаете. Вот как работают эти настройки.
Когда вы создаете 32-битный код и включаете SSE1 или SSE2, он включает автоматическую векторизацию в соответствующие наборы инструкций.
Когда вы создаете 64-битный код, как SSE1, так и SSE2 являются частью набора инструкций, все процессоры AMD64 в мире должны поддерживать оба из них. Вот почему вы получаете предупреждение с / arch: SSE2.
Когда вы настраиваете AVX, компилятор выполняет две функции: включает автоматическую векторизацию в AVX1, а также переключает кодировку инструкций (для всех из них, как SSE, AVX, вручную, так и автоматически векторизованные) с прежней версии на VEX. VEX - хорошая штука, позволяет объединять невыровненные операции чтения RAM с другими инструкциями. Он также решает проблемы с зависимостями, которые могут повлиять на производительность: в кодировке VEX vaddps xmm0, xmm0, xmm1
обнуляются более высокие 16 байтов ymm0
, в то время как в устаревшей кодировке addps xmm0, xmm0, xmm1
данные сохраняются.
Когда вы настраиваете AVX2, он выполняет несколько незначительных оптимизаций, особенно такие вещи, как _mm_set1_epi32
, могут компилироваться в vpbroadcastd
. Также переключает кодировку на VEX, как для AVX1.
Обратите внимание, что я выделил автоматический жирным шрифтом. Компилятор Microsoft не выполняет диспетчеризацию во время выполнения или проверки cpuid, а автоматический векторизатор не использует SSE3 или 4.1. Если вы пишете векторизованный код вручную, компилятор не будет делать откатов, а выдаст все необходимые инструкции. Если параметр AVX / AVX2 присутствует, он влияет только на их кодировку.
Если вы хотите написать вручную векторизованный код, который использует SSE3, SSSE3, SSE 4.1, FMA3, AES, SHA и т. Д., Вам не нужно ничего включать. Вам просто нужно включить соответствующие заголовки и, в идеале, убедиться, что они есть в процессоре во время выполнения. Что касается последней части, я обычно звоню __cpuid
< / a> при запуске и проверке этих битов, это должно показать понятное сообщение об ошибке о неподдерживаемом процессоре, вместо жесткого отказа позже.
person
Soonts
schedule
25.09.2020
-O3 -msse4.1
или-O3 -march=penryn
- person Peter Cordes   schedule 24.09.2020