Зачем GCC включать оптимизацию в O2/O3, когда он явно говорит, что это замедлит работу программы?

Цитируется по https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html:

-falign-этикетки

-falign-метки = п

Выровняйте все цели ветвления с границей степени двух, пропуская до n байтов, как -falign-functions. Эта опция может легко сделать код медленнее, потому что она должна вставлять фиктивные операции для достижения цели перехода в обычном потоке кода.

-fno-align-tags и -falign-label =1 эквивалентны и означают, что метки не выровнены.

Если -falign-loops или -falign-jumps применимы и больше этого значения, тогда вместо них используются их значения.

Если n не указано или равно нулю, используйте машинно-зависимое значение по умолчанию, которое, скорее всего, будет равно 1, что означает отсутствие выравнивания.

Включено на уровнях -O2, -O3.

Если больше думать об этом флаге, он теряет еще больше смысла... есть последствия провоцирования промахов кэша кода, и что вообще означает включение, когда параметр принимает числовое значение (1..)?

1 ответ

Это не говорит об этом. Это говорит о том, что может легко сделать код медленнее. Это означает, что в определенных ситуациях это может замедлить выполнение кода. В других ситуациях это может сделать код быстрее.

Выравнивание приводит к медленному выполнению кода:

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

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

В случае одного ifТрудно сказать, какой эффект сильнее. Это зависит от условий.

Однако для цикла, как правило, код становится быстрее. Зачем? Потому что медленные факторы случаются только один раз, но каждый цикл цикла будет выполняться быстрее.

(Кажется, мой GCC выравнивает метки на 8)

Другие вопросы по тегам