gcc — SSE не дает ускорения для обработки чисел в C ++

У меня тяжелая программа обработки чисел, которая выполняет обработку изображений. Это в основном извилины. Он написан на C ++ и скомпилирован с Mingw GCC 4.8.1. Я запускаю его на ноутбуке с Intel Core i7 4900MQ (с SSE до SSE4.2 и AVX2).

Когда я говорю GCC использовать оптимизацию SSE (с -march = native -mfpmath = sse -msse2), я не вижу никакого ускорения по сравнению с использованием стандартного x87 FPU.

Когда я использую double вместо плавания, замедление не происходит.

Насколько я понимаю, SSE должен дать мне 2-кратное ускорение при использовании поплавков вместо двойных. Я ошибаюсь?

1

Решение

Насколько я понимаю, SSE должен дать мне 2-кратное ускорение при использовании поплавков вместо двойных. Я ошибаюсь?

Да, вы.

Компилятор так же хорош, как и ваш код — запомните это. Если вы не разработали свой алгоритм с учетом векторизации, компилятор бессилен. Это не так просто: «включите переключатель и наслаждайтесь 100% повышением производительности».

Прежде всего, скомпилируйте свой код с -ftree-vectorizer-verbose=N чтобы увидеть, что действительно было векторизовано компилятором.

N это уровень многословия, сделать это 5 чтобы увидеть все доступные результаты (больше информации можно найти здесь).

Кроме того, вы можете прочитать о векторизаторе GCC.

И имейте в виду, что для критичных к производительности участков кода, использующих встроенные функции SSE / AVX (блестяще задокументировано здесь) напрямую может быть лучшим вариантом.

5

Другие решения

Там нет кода, нет описания процедур испытаний, но в целом это можно объяснить следующим образом:

  1. Дело не только в процессоре, но и в скорости памяти.
    Обработка изображений обычно имеет большой рабочий набор и превышает объем кеша вашего не-xeon процессора. В конце концов, процессорное истощение процессора означает, что общая пропускная способность может быть ограничена скоростью памяти.

  2. Возможно, вы используете алгоритм, который не подходит для векторизации.
    Не каждый алгоритм выигрывает от векторизации. Есть много условий, которые необходимо выполнить — зависимость от потока, расположение памяти и т. Д.

1

По вопросам рекламы [email protected]