У меня очень большая библиотека, и я хочу скомпилировать ее с поддержкой AVX2 (но мой процессор поддерживает полностью AVX). Эта библиотека также имеет внутреннюю проверку выполнения, независимо от того, поддерживает ли процессор AVX2 или нет. Что-то вроде этого:Компиляция с поддержкой и запуском AVX2
#if __AVX2__
if (support_avx2)
{
// vectorized code
}
#endif
// simple C++ code
мне удалось собрать библиотеку с поддержкой AVX2, но когда я запускаю тесты у меня в самом начале:
Illegal instruction: 4
Любые идеи? Цель состоит в том, чтобы собрать библиотеку со всеми доступными оптимизациями и функциями и проверить их во время выполнения.
p.s. Я работаю над OSX
Вы код не проверяет, если ваш процессор поддерживает AVX2. Он проверяет, были ли установлены параметры вашего компилятора для AVX2. Вам нужен диспетчер процессора. Вот несколько ссылок на [warn-gcc-from-automatic-use-avx-and-fma-instructions-when-compiled-w] (https://stackoverflow.com/questions/18868235/preventing-gcc-from- автоматически, используя-AVX-и-FMA-инструкции, когда скомпилированные-W/25911959 # 25911959). –
Фактически, support_avx2 является логическим флагом, который отражает соответствующий бит cpuid. – sandye51
Когда вы компилируете для AVX2, ваш компилятор предполагает, что он может использовать AVX2 всякий раз, когда захочет (например, для векторизации). Вы должны скомпилировать для самого низкого общего знаменателя (я думаю, AVX в вашем случае), который вы хотите поддержать диспетчера. Затем скомпилируйте отдельные объектные файлы для каждого AVX и AVX2, а затем попросите диспетчера перейти к соответствующей версии. –