Автоматическая векторизация противвекторизованный код вручную

StackOverflow https://stackoverflow.com/questions/409560

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top