Как узнать, векторизован ли мой код компилятором?

9

Как видно из ответа Джеда Брауна « Затраты на поиск по сравнению с вычислениями» , использование векторизованных и не векторизованных операций с плавающей запятой приводит к гораздо более быстрому коду. Многие современные компиляторы утверждают, что они могут выполнять автоматическую векторизацию. Как мне определить, какие части моего кода успешно векторизованы?

Мэтью Эмметт
источник

Ответы:

10

С компилятором Intel любого современного года изготовления вина -O3 -vec-report3. Третий уровень оптимизации гарантирует, что он пытается векторизовать, а векторный отчет скажет вам, что он делает.

Страница GNU по векторизации говорит, что она включена по умолчанию на уровне оптимизации 3, но я не могу найти эквивалент vec-report.

Билл Барт
источник
Спасибо за быстрый ответ. Я не знал о -vec-report3. У вас есть предпочтения компилятора, когда дело доходит до такого типа вещей (автоматическая векторизация)?
Мэтью Эммет
Компиляторы Intel действительно хороши, но только для чипов Intel. Вам просто нужно добавить все правильные прагмы (#pragma ivdep - самый простой) GCC 4.7 стал намного лучше, но просматривая некоторый код с коллегой, он по-прежнему имеет ошибки (как, например, отсутствие векторизации в прагмах openmp).
aterrel
1
Я бы посоветовал дважды проверить, как компилятор Intel справляется с векторизацией на чипах AMD. Я не уверен на 100%, что проблемы старого все еще существуют.
Билл Барт
2
@BillBarth Да, все еще проблема. См. Уведомление об оптимизации (во многих местах, например, software.intel.com/sites/products/collateral/hpc/compilers/… ). AMD выиграла судебную тяжбу, требуя от Intel раскрытия своей антиконкурентности, а не для того, чтобы они перестали быть. en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Criticism Agner Fog от обходных путей: agner.org/optimize/blog/read.php?i=49
Джед Браун,
@JedBrown, конечно, SSE все еще странный, но что за история с AVX? Эти ссылки указывают на то, что все должно быть в порядке (поскольку обе компании используют AVX), но я не проверял его на бульдозерной машине.
Билл Барт
8

В коллекции компиляторов GNU у вас есть опция -ftree-vectorizer-verbose=nгде nэто число от 0 до 6, которое будет печатать информацию, похожую на icc/ ifort.

Pedro
источник
5

При использовании компиляторов GNU при добавлении -Wa,-ahl=asm.sбудет сгенерирован код сборки asm.s.

С компиляторами Intel добавление -fcode-asm -Faasm.sбудет генерировать сгенерированный код в asm.s.

Затем вы можете проверить код сборки и найти операции с плавающей точкой вектора.

Мэтью Эмметт
источник
Я полностью согласен с тем, что проверка выходных данных сборки - единственный надежный способ определить, действительно ли код векторизован. Нет ничего, что требовало бы от компиляторов быть честными в своих заявлениях о векторизации кода.
Джефф