Принудительная автоматическая векторизация с помощью GCC

Вот мой очень простой вопрос. Я знаю, что с ICC можно использовать #pragma SIMD для принудительной векторизации циклов, которые компилятор предпочитает не векторизовать. Есть ли что-то подобное в GCC? Или есть ли планы добавить эту функцию в будущем выпуске?

Довольно похоже, как насчет принудительной векторизации с помощью Graphite?

Спасибо за рассмотрение моих запросов Фабио


person user2047635    schedule 06.02.2013    source источник


Ответы (1)


Пока gcc разрешено использовать инструкции SSE/SSE2/etc, компилятор обычно будет создавать векторные инструкции, когда поймет, что это «стоит». Как и большинство вещей в компиляторах, это требует от программиста некоторой удачи/планирования/осторожности, чтобы компилятор не подумал: «Может быть, это небезопасно» или «Это слишком сложно, я не могу понять, что происходит». Но довольно часто это удается, если вы используете достаточно современную версию gcc (все версии 4.x должны это делать).

Вы можете заставить компилятор использовать инструкции SSE или SSE2, добавив -msse или -msse2 (и т. д. для более поздних расширений SSE). -msse2 по умолчанию в x86-64.

Однако я не знаю, каким образом вы можете ЗАСТАВИТЬ это. Компилятор либо сделает это, потому что он счастлив, что это хорошее решение, либо нет.

Извините, не могу ответить о графите.

person Mats Petersson    schedule 06.02.2013
comment
Да, я знаю, что вы имеете в виду. Я просто хочу принудительно векторизовать некоторые циклы, потому что, если я сделаю это с ICC, я получу некоторое улучшение производительности. Итак, мне любопытно посмотреть на реакцию GCC. Но мне нужно узнать, возможно ли это и как заставить векторизацию. Спасибо, в любом случае. - person user2047635; 06.02.2013
comment
@user2047635 user2047635 Если вы думаете, что можете добиться большего успеха, чем компилятор, вы можете просто вручную векторизовать его самостоятельно с помощью встроенных функций. - person Mysticial; 06.02.2013
comment
Или, еще лучше, напишите его полностью на ассемблере — тогда у вас будет 100% контроль над тем, какие инструкции в каком порядке идут, какие регистры где используются и т.д. и т.п. - person Mats Petersson; 06.02.2013
comment
Вы оба правы. Но все не так просто. Я исследую класс программ, обладающих определенной особенностью, то есть вложением циклов с очень небольшим количеством срабатываний. Таким образом, использование встроенных функций означает создание компилятора/транслятора/генератора кода (назовите его, как вам больше нравится) для их генерации, и это было бы сложнее, чем то, что мне пришлось бы создавать для выполнения преобразований, которые я сейчас делаю (до сих пор вручную, в экспериментальных целях) к петлям. - person user2047635; 06.02.2013
comment
Вы действительно смотрели на то, что производит компилятор gcc? - person Mats Petersson; 06.02.2013
comment
да, это в основном полное развертывание циклов и использование скалярных инструкций (например, vmulsd... обратите внимание на v перед инструкцией, означающей, что я скомпилировал с -mavx) - person user2047635; 06.02.2013
comment
Ах, еще более забавно, если я посмотрю на отчет векторизатора, окажется, что компилятор полностью пропустил (векторизацию) самого внутреннего цикла. Он выводит, что отказался от векторизации некоторых циклов, но ничего не выводит для самых внутренних. Я думал, что это связано с пропуском циклов с очень коротким количеством поездок... но это не объясняет, почему сообщается что-то для внешних циклов, которые имеют точно такое же количество поездок. - person user2047635; 06.02.2013
comment
Код AVX может быть не таким зрелым, как вариант SSE, поэтому вместо этого вы можете попробовать его с -msse2. - person Mats Petersson; 06.02.2013