- PVSM.RU - https://www.pvsm.ru -

«Зачем обновлять GCC компилятор?» или «Производительность GCC компилятора на Intel Atom от версии к версии»

«Зачем обновлять GCC компилятор?» или «Производительность GCC компилятора на Intel Atom от версии к версии»
Давайте попытаемся понять, что нового сделано в GCC компиляторе для процессоров архитектуры Intel Atom и как это влияет на производительность и размер кода известного бенчмарка EEMBC CoreMark [1].
Выше приведен график, отображающий производительность CoreMark, откомпилированного с пиковым и базовым набором опций разными версиями GCC относительно производительности базового набора опций для GCC версии 4.4.6 (выше – лучше).

При тестировании использовались следующие опции компилятора:
базовый набор опций (base): “-O2 -ffast-math -mfpmath=sse -m32 -march=atom”
базовый набор опций (base) + if convertion: “-O2 -ffast-math -mfpmath=sse -ftree-loop-if-convert -m32 -march=atom”
пиковый набор опций (peak): “-Ofast -funroll-loops -mfpmath=sse -m32 -march=atom”, для версий 4.4 и 4.5 “-Ofast” было заменено на “-O3 -ffast-math”
Подробнее про оптимальные опции для GCC на x86 было написано здесь [2]. Стоить отметить, что опция “-flto” пока не прибавляет производительности CoreMark.

Из графика видно, что базовый набор опций с “-ftree-loop-if-convert” достиг производительности пикового набора на CoreMark.

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

«Зачем обновлять GCC компилятор?» или «Производительность GCC компилятора на Intel Atom от версии к версии»

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

«Зачем обновлять GCC компилятор?» или «Производительность GCC компилятора на Intel Atom от версии к версии»

“-ffunction-sections -Wl,--gc-sections -fno-asynchronous-unwind-tables -Wl,--strip-all” были добавлены к базовому и пиковому набору опций для измерения в размера кода. Данные опции не влияют на производительность CoreMark.
Более подробно про опции для оптимального размера исполняемого кода было написано здесь [3].

Из графиков видно, что размер кода на пиковом наборе опций в 2 раза больше, чем на базовом и продолжает расти. Базовый набор опций, напротив, обеспечивает незначительное снижение размера кода.

Все измерения производились для 1 потока на 2-х ядерном Intel Atom CPU D525, 1.80GHz с 4Gb памяти, операционная система Fedora 17.

GCC продемонстрировал очень хороший прогресс от версии 4.4 к версии 4.8 (в основном от версии 4.6 к версии 4.7 и от «-ftree-loop-if-convert» на базовом наборе опций версии 4.8). Размер кода на базовом наборе опций остается без изменений, на пиковом наборе растет.

Ниже приведено краткое описание опций и изменений в GCC от версии к версии:

  • В версии GCC 4.5 впервые представлена опция "-march=atom" (подробнее [4]). GCC 4.4 упоминается в статье как последняя версия без поддержки Atom. CoreMark для этой версии было собрано с “-march=i686 -mtune=generic -mssse3”. До сих пор большое количество Unix систем используют gcc-4.4+. Однако стоит отметить, что некоторые специальные gcc-4.4 могут поддерживать “-march=atom”. Например, Android NDK gcc-4.4.
  • Версия GCC 4.6 отличается лучшими эвристиками для подстановки функций (inline) и возможностью улучшить производительность CoreMark за счет появившейся опции: "-ftree-loop-if-convert". По умолчанию эта опция включена, начиная с “-O3 (-Ofast)”. Добавленная к базовому набору опций, она ускоряет CoreMark на ~8%. Официальный список изменений [5] в GCC 4.6.
  • В версии GCC 4.7 при включенной “-march=atom” появились новые специфичные для Atom оптимизации, в частности, оптимизации, улучшающие работу инструкций LEA и IMUL. Первоначально на архитектуре Atom IMUL требовал переключения в особый режим, и потому было выгодно группировать IMUL (исправлено в новейшем Atom процессоре Silvermont [6]). LEA, результат которого шел на ALU, терял производительность. Поэтому некоторые LEA было выгодно заменять на последовательность из ADD и MOV (исправлено в новейшем Atom процессоре Silvermont [7]). Официальный список изменений [8].
  • В версии 4.8 улучшены оптимизации над командами логики. В результате уменьшилось давление на регистры в некоторых функциях CoreMark (это касается только базового набора опций с "-ftree-loop-if-convert”). Также в версии 4.8 появилась возможность уменьшить давление на регистры: “-fschedule-insns -fsched-pressure” (ранее опции были крайне нестабильны). На CoreMark это добавит около 1% к пиковому набору опций. Чаще всего “-fschedule-insns -fsched-pressure” улучшают производительность, когда включена опция: "-funroll-loops". Официальный список изменений [9].

Что, если в GCC версии 4.8 "-march=atom" включало бы лишь “-march=i686 -mtune=generic -mssse3”? Производительность на CoreMark упала бы на 5%. "-ftree-loop-if-convert” добавляет к производительности базового набора опций еще 13%.
Если для Вашего Atom приложения важен и размер кода, и производительность — переключайтесь на GCC версии 4.8 и пробуйте компилировать с опциями:
“-O2 -ffast-math -mfpmath=sse -ftree-loop-if-convet -fschedule-insns -fsched-pressure -m32 -march=atom”
Если же важна только производительность, то GCC 4.8 оптимален с опциями:
“-Ofast -flto -funroll-loops -mfpmath=sse -fschedule-insns -fsched-pressure -m32 -march=atom”

Автор: Evgeny1982

Источник [10]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/39945

Ссылки в тексте:

[1] EEMBC CoreMark: http://www.coremark.org

[2] здесь: http://habrahabr.ru/company/intel/blog/158939

[3] здесь: http://habrahabr.ru/company/intel/blog/167417

[4] подробнее: http://gcc.gnu.org/gcc-4.5/changes.html

[5] список изменений: http://gcc.gnu.org/gcc-4.6/changes.html

[6] Silvermont: http://newsroom.intel.com/community/intel_newsroom/blog/2013/05/06/intel-launches-low-power-high-performance-silvermont-microarchitecture

[7] Silvermont: http://newsroom.intel.com/community/intel_newsroom/blog/2013/05/06/intel-launches-low-power-high-performance-silvermont-microarchitecturehttp://

[8] список изменений: http://gcc.gnu.org/gcc-4.7/changes.html

[9] список изменений: http://gcc.gnu.org/gcc-4.8/changes.html

[10] Источник: http://habrahabr.ru/post/188386/