Флаги оптимизации GCC для Intel Atom

Я разрабатываю критическое для производительности приложение для процессора Intel Atom.

Каковы лучшие флаги оптимизации gcc для этого процессора?


person user7305    schedule 21.09.2008    source источник
comment
А как насчет компилятора Intel C (icc)? По крайней мере, на прилагаемых к нему бенчмарках доминирование над gcc вполне заметно...   -  person peter karasev    schedule 27.09.2010


Ответы (9)


Существует классная структура под названием Acovea (Анализ параметров компилятора с помощью эволюционного алгоритма), Скотт Робер Лэдд, один из хакеров GCC. Это структура генетического/эволюционного алгоритма, которая пытается оптимизировать флаги оптимизации GCC для определенного фрагмента кода посредством естественного отбора.

Это работает примерно так: вы пишете небольшой фрагмент кода теста (он на самом деле должен быть небольшим, потому что он будет перекомпилирован и выполнен несколько тысяч раз), который представляет характеристики производительности более крупного программу, которую вы хотите оптимизировать. Затем Acovea случайным образом создает несколько десятков различных командных строк GCC, компилирует и запускает тест с каждой из них. Затем лучшим из этих командных строк разрешается «спариваться» и «выводить» новых «детей», которые (надеюсь) наследуют лучшие «гены» от своих «родителей». Этот процесс повторяется для пары десятков «поколений», пока не появится стабильный набор флагов командной строки.

person Jörg W Mittag    schedule 21.09.2008


У меня есть скрипт, который автоматически выбирает соответствующие флаги для комбинации вашего процессора и компилятора. Я только что обновил его для поддержки Intel Atom:

http://www.pixelbeat.org/scripts/gcccpuopt

Обновление: ранее я указал -march=prescott для Atom, но при более подробном рассмотрении видно, что Atom совместим с merom ISA, поэтому -march=core2 более подходит. Однако обратите внимание, что атомы — это упорядоченные ядра, последним из которых является исходный пентиум. Поэтому, наверное, лучше -mtune=pentium. К сожалению, у меня нет атома для тестирования. Я был бы очень признателен, если бы кто-нибудь мог сравнить разницу между:

-march=core2 -mfpmath=sse -O3
-march=core2 -mtune=pentium -mfpmath=sse -O3

Обновление: вот пара хороших статей о низкоуровневой оптимизации для Atom:

person pixelbeat    schedule 19.12.2008
comment
Я не думаю, что установка как -march=core2, так и -mtune=pentium вообще работает: я получаю arg.c:1: error: CPU you selected does not support x86-64 instruction set - person moo; 14.02.2010
comment
Интересно. Ваш атом поддерживает 64 бит? Если вы попробуете приведенный выше скрипт, он, вероятно, скажет вам также добавить -m32 - person pixelbeat; 15.02.2010
comment
да, мой атом поддерживает 64-бит. - person moo; 17.02.2010
comment
Что ж, более интересным ответом было бы, если -m32 подавляет сообщение об ошибке и выводит ли gcccpuopt -m32 для вашего процессора. - person pixelbeat; 17.02.2010
comment
выполнение gcc44 -march=core2 -mtune=pentium -m32 -o lol lol.c для минимального файла c завершается с ошибкой о невозможности найти -lgcc. и gcccpuopt говорит мне, что -m32 -march=core2 -mtune=pentium -mfpmath=sse — оптимальная конфигурация. - person moo; 18.02.2010
comment
Я НИКОГДА не видел, чтобы mfpmath=sse создавал более быстрый код на основе профилирования. По-видимому, это связано с ограничениями заголовков в glibc. - person Alex Barker; 10.08.2012

Что ж, в вики Gentoo говорится о prescott:

http://en.gentoo-wiki.com/wiki/Safe_Cflags/Intel#Atom_N270

CHOST="i686-pc-linux-gnu"

CFLAGS="-march=prescott -O2 -pipe -fomit-frame-pointer"

CXXFLAGS="${CFLAGS}"

person user39591    schedule 21.11.2008
comment
Больше нет: en.gentoo-wiki.com/wiki/Safe_Cflags/ Intel#Atom_N270.2FN280 (обновленная ссылка) теперь рекомендует CFLAGS=-O2 -march=core2 -mtune=generic -mssse3 -mfpmath=sse -fomit-frame-pointer -pipe - person Marcel Korpel; 22.02.2010
comment
...и CFLAGS=-O2 -march=atom -mssse3 -mfpmath=sse -fomit-frame-pointer -pipe для GCC 4.5 - person Marcel Korpel; 05.04.2010

От Intel, Начало работы с MID

При использовании GCC для компиляции рекомендуется использовать несколько флагов:

  • -O2 или -O1: флаг O2 оптимизирует скорость, а флаг -O1 оптимизирует размер.
  • -msse3
  • -март = ядро2
  • -mfpmath=sse
person Marc    schedule 09.09.2009

Как и для Pentium 4:

-march=prescott -O2 -pipe -fomit-frame-pointer
person user38733    schedule 18.11.2008
comment
Только первый аргумент имеет значение. - person 0xC0000022L; 25.08.2020

Я не знаю, есть ли у GCC какие-либо специфичные для Atom флаги оптимизации, но предполагается, что ядро ​​Atom очень похоже на исходный Pentium, с очень значительным добавлением наборов инструкций MMX/SSE/SSE2/SSE3/SSSE3. Конечно, это имеет существенное значение только в том случае, если ваш код использует операции с плавающей запятой или DSP-процессор.

Возможно, вы могли бы попробовать:

gcc -O2 -march=pentium -mmmx -msse -msse2 -msse3 -mssse3 -mfpmath=sse

person Dan Lenski    schedule 22.09.2008
comment
В то время как Atom сравним с Pentium в том, что это упорядоченная архитектура, структура конвейера сильно отличается, и планирование инструкций для Pentium, вероятно, будет очень плохо с точки зрения производительности. - person user57368; 07.02.2009
comment
Согласитесь, вы не хотите использовать -march=pentium для чего-то другого, кроме настоящего Pentium. - person kquinn; 07.02.2009

вот несколько перекрестных опылений блогов... на что я действительно надеялся, так это на бенчмарк Firefox, скомпилированный для атома...

Адрес: http://ivoras.sharanet.org/blog/tree/2009-02-11.optimizing-for-atom.html

«Как оказалось, gcc отлично справляется с параметром -mtune=native, а mtune=generic более чем приемлем. Наибольший прирост (в этом бенчмарке) достигается за счет использования SSE для математики, но даже они уничтожаются настройкой на пентиум4.

«Разница между самой быстрой и самой медленной оптимизацией составляет 21%. Влияние использования марша вместо mtune незначительно (недостаточная разница, чтобы сказать, помогает это или нет).

"(Я включил k6 просто для справки - я знаю, что у Atom нет 3dnow)

«Позднее обновление: настройка для k8 (с SSE и O3) дает чуть более высокий лучший результат — 182».

person Community    schedule 26.05.2009

i686 ближе всего. Не берите core2.

GCC 4.1 -O3 -march=i686 GCC 4.3 -O3 -march=родной

GCC 4.1 -O4 -ffast-math GCC 4.3 -O4 -ffast-math

http://macles.blogspot.com/2008/09/intel-cc-compiler-gcc-and-intel-atom.html

person brij    schedule 01.10.2009
comment
-O4 не является допустимым уровнем оптимизации gcc. Читайте руководства, а не блоги: gcc.gnu.org/onlinedocs /gcc-4.1.2/gcc/Optimize-Options.html - person Alex Barker; 10.08.2012
comment
Не выбирайте ядро ​​2 ... отсутствует обоснование. - person 0xC0000022L; 25.08.2020