Компиляция библиотеки с SSE2 и AVX2 - PullRequest
0 голосов
/ 10 октября 2018

Используя VS2015 и компилируя библиотеку, которая содержит инструкции SSE2 и инструкции AVX2 (которые используются только в случае обнаружения в ЦП), если я компилирую библиотеку с /arch:AVX2, но вызываю только инструкции SSE2, я получаю «недопустимую инструкцию»(на _mm_set1_epi32 первая вызванная инструкция SSE2).Тем не менее, если я скомпилирую библиотеку с /arch:SSE2, она прекрасно работает при вызове инструкций SSE2.

Являются ли настройки арки взаимоисключающими?Если нет, то как это должно быть исправлено?Я пытался использовать как общую библиотеку, так и статическую библиотеку с одной и той же проблемой.

это библиотека: https://github.com/Auburns/FastNoiseSIMD, и существует проблема с ней https://github.com/Auburns/FastNoiseSIMD/issues/20,, хотя я неНе думаю, что это напрямую связано с тем, что AVX2 включен и вызывает инструкции SSE2.

1 Ответ

0 голосов
/ 10 октября 2018

Если вы строите с /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, когда планировщик считает, что это будет быстрее, чем умножение, а затем сложение.

...