Вот мое решение. Я могу скомпилировать с поддержкой AVX2 и по-прежнему работать на моем процессоре Ivy Bridge (только AVX).
Функции:
__attribute__((target("arch=haswell")))
void fir_avx2_std(STD_DEF){
STD_FIR;
}
__attribute__((target("arch=sandybridge")))
void fir_avx_std(STD_DEF){
STD_FIR;
}
//Use default - no arch specified
void fir_sse_std(STD_DEF){
STD_FIR;
}
Звонок:
if (s.HW_AVX2 && s.OS_AVX){
fir_avx2_std(STD_Call);
}else if(s.HW_AVX && s.OS_AVX){
fir_avx_std(STD_Call);
}else{
fir_sse_std(STD_Call);
}
s
- это структура, которая заполняется на основе некоторого кода, который я нашел в Интернете (https://github.com/Mysticial/FeatureDetector)
STD_FIR
- это макрос с реальным кодом, который оптимизируется по-разному для каждой архитектуры.
Я собираю с: -std=c11 -ffast-math -O3
У меня изначально тоже было -march=haswell
, но это вызывало проблемы.
Заметьте, я не совсем уверен, что это лучшая разбивка по цели ...
Кроме того, я попытался заставить target_clones
работать, но я получал ошибку о необходимости ifunc
(я думал, что gcc сделал это для меня ...)