указать уровень simd функции, которую может использовать компилятор - PullRequest
1 голос
/ 06 мая 2019

Я написал код и скомпилировал его, используя gcc с опцией нативной архитектуры.

Обычно я могу взять этот код и запустить его на старом компьютере, на котором нет AVX2 (только AVX), и он работает нормально. Однако, похоже, что компилятор на самом деле испускает инструкции AVX2 (наконец-то!), А не мне самому нужно включать встроенные функции SIMD.

Я бы хотел изменить программу так, чтобы поддерживались оба пути (AVX2 и не-AVX2). Другими словами, я хотел бы что-то следующий псевдокод.

if (AVX2){
   callAVX2Version();
}else if (AVX){
   callAVXVersion();
}else{
   callSSEVersion();
}

void callAVX2Version(){
#pragma gcc -mavx2
}

void callAVXVersion(){
#pragma gcc -mavx
}

Я знаю, как выполнить часть определения времени выполнения, мой вопрос: возможно ли выполнить часть выбора SIMD для конкретной функции.

1 Ответ

1 голос
/ 07 мая 2019

Вот мое решение. Я могу скомпилировать с поддержкой 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 сделал это для меня ...)

...