Почему на моей системе работает скомпилированное программное обеспечение VS C / C ++ AVX512, а на моем процессоре нет AVX512? - PullRequest
0 голосов
/ 06 ноября 2019

Недавно я видел, что Visual Studio 2019 Preview добавил опцию для компиляции с AVX512. ОК, я попробовал, и это сработало. Но почему он работает, когда мой процессор не имеет такой возможности?

Я использую следующий скрипт C / C ++ для определения возможностей процессора: https://docs.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?view=vs-2019

Все флаги AVX512 (AVX512F, AVX512CD, AVX512PF и AVX512ER) недоступны в моей системе при запуске этого сценария.

Предварительный просмотр Visual Studio 2019 имеет следующие параметры [AVX, AVX2, AVX512, SSE и SSE2]. Скомпилированное программное обеспечение AVX, AVX2, SSE и SSE2 работает на моем ПК, и этот скрипт, приведенный выше, говорит, что мой ПК поддерживает все эти четыре (AVX, AVX2, SSE и SSE2).

Как вы можете понять сейчас, толькоПроблема, кажется, в возможности AVX512. Он работает на моем ПК, но каждый скрипт, который я запускаю, говорит, что у меня нет AVX512.

Спасибо!

1 Ответ

2 голосов
/ 06 ноября 2019

Предположительно, компилятор решил не использовать какие-либо инструкции AVX512 при автоматической векторизации. Или только в функциях, которые не вызываются в ваших тестовых примерах.

Включение AVX512 означаеткомпилятор может выбрать для использования инструкций AVX512, но это точно не так. Если это не так, то у него нет никаких инструкций, которые будут давать сбой на процессорах без AVX512.


Я не знаю, каковы параметры настройки по умолчанию для MSVC, но использование 512-битных векторов неЭто не всегда выгодно, особенно для программ, которые проводят большую часть своего времени в скалярном коде. (Запуск 512-битного UOP уменьшает максимальное турбо в течение следующих нескольких миллисекунд на текущих процессорах Skylake-X, которые do поддерживают AVX512.)

Для 256-битных векторов иногда полезно использоватьинструкция AVX512VL (кодирование EVEX), например, объединение нескольких логических операций с vpternlogd или один из новых тасов, например vpermt2d. Или EVEX-кодирование инструкции, доступной в AVX2 или более ранней версии, просто для использования большего количества регистров (ymm16..31) или для маскированных операций.

Или, возможно, ни один из ваших циклов не был автоматически векторизован, или, возможно, вы этого не сделалииспользуйте достаточно высокий уровень оптимизации, чтобы даже попытаться автоматически векторизовать.

...