6

При использовании современного C++ компиляторов (включая MSVC, GCC, ICC), как я могу сказать, если оно:Мой компилятор C++ оптимизирует мой код?

  1. распараллеливание кода
  2. векторизованную петли (или использовать другие специальные инструкции процессора)
  3. раскатали петли
  4. обнаружен хвостовой рекурсии
  5. выполняется РВО (оптимизация возвращаемого значения)
  6. или оптимизирован каким-либо иным образом

без погружения в код ассемблера, который производит компилятор?

+0

Вот хорошая статья об определенном наборе оптимизаций, которые могут вам пригодиться: http://www.liranuna.com/sse-intrinsics-optimizations-in-popular-compilers/ – LiraNuna

ответ

18

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

Но, честно говоря, если вы не уверены, что уровни оптимизации вашего компилятора делают работу, вы, вероятно, не будет доверять DOCO :-)

я смотрел бы на ассемблере себя , это единственный способ убедиться в этом.

+0

Строго говоря, это не единственный но это, вероятно, самый простой или лучший. Вы можете указать gcc сделать многословные дампы между проходами с параметрами -fdump ... и -d (в основном для отладки), а для векторизации существуют подробные сообщения оптимизации, которые выходят, почему и где цикл был векторизован, это для конечных пользователей тоже. – hirschhornsalz

+0

Строго говоря, эти свалки могли лгать. ;) Гарантируется правильность только сборки. :) – jalf

+0

@ jalf: нет, может быть заговор между MS и/или GNU, с Intel и/или AMD, что означает, что идентификаторы CPU пятна стегано скрыты в коде из компилятора и переключаются в специальный режим, так что эти видимые векторные коды операций деэкспериментированы и вообще не используют схему SIMD. * Если * вы хотите быть глупым ;-) –

3

Компилятор Intel имеет достойный механизм отчетности. Посмотрите -vec-report и -par-report в справочной документации или на странице руководства.

g ++ также имеет векторные отчеты, посмотрите на странице man для «vector», я бы не подумал, что g ++ имеет параллельное автоматическое создание кода.

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

+0

GCC имеет автоматическую паралификацию, используя ' -ftree-vectorize'. Подробнее об этом читайте здесь - http://gcc.gnu.org/projects/tree-ssa/vectorization.html – LiraNuna

+0

Распараллеливание обычно означает openMP в контексте компилятора, векторизация обычно подразумевает инструкции SIMD. g ++ не имеет прежнего. – Anycorn

+1

@unknown: g ++ _has_ OpenMP. – int3

0

Для РВО или другого копирования Elision вещи, просто поставить некоторые (printf) в copy-ctor и dtor вашего класса. Вы должны увидеть меньшее количество объектов, которые будут скопированы, если оптимизация будет работать.

0

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

Чтобы использовать эту глубину, используйте команду -O3 при запуске кода.

Смежные вопросы