Авто-векторизация против векторизованного кода вручную - PullRequest
4 голосов
/ 03 января 2009

В каком-то смысле лучше векторизовать код вручную, используя явные прагмы, либо полагаться на авто-векторизацию или использовать ее? Для достижения оптимальной производительности с использованием автоматической векторизации необходимо отслеживать выходные данные компилятора, чтобы убедиться, что циклы векторизованы, или изменять их до тех пор, пока они не будут векторизованы.

При ручном кодировании можно быть уверенным, что выполняются нужные инструкции, но теперь код, вероятно, не переносим (ни для других архитектур, ни для других компиляторов).

Ответы [ 3 ]

13 голосов
/ 03 января 2009

Авто векторизация никогда не работала хорошо для меня. Мне кажется, что в настоящее время автоматическая векторизация работает только для очень тривиальных циклов.

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

Мобильность, кстати, не проблема. Часто вы начинаете с цикла C / C ++ и оптимизируете его с помощью встроенных функций. Просто сохраните старый цикл и используйте его как модульный тест / запасной вариант для реализации SIMD. Также всегда полезно иметь возможность удалить весь код SIMD из проекта с помощью определения времени компиляции. Таким образом, отладка приложения на намного проще. То же самое определение можно использовать для кросс-компиляции.

4 голосов
/ 03 января 2009

Я бы никогда не стал полагаться на автоматическую векторизацию из любого компилятора. С gcc я был бы вдвойне осторожен, потому что эффекты оптимизации gcc всегда варьируются от версии к версии. Почти все, кого я знаю, кто использует специальные оптимизации или расширения gcc, имеют дело с поломками при выпуске новой версии gcc.

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

Один или два раза, когда векторизация действительно имела значение, мы добавили что-то в набор тестов, чтобы вызвать objdump и убедиться, что векторные инструкции действительно используются. Было бы неплохо иметь возможность автоматически обнаруживать «плохой векторный код» (как описывает Нильс), но мы никогда не заходили так далеко.

1 голос
/ 17 января 2009

Я еще не видел автоматический векторизатор, который приносит больше пользы, чем вреда.

...