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

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

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

А как насчет компилятора Intel C (icc)? По крайней мере, в тестах, которые идут с ним, доминирование над gcc довольно заметно ...

peter karasev 27.09.2010 04:49
Загадки Python - Генерация простых чисел!
Загадки Python - Генерация простых чисел!
Обычно существует несколько способов решения задач даже пограничной сложности. Как же определить оптимальное и эффективное решение?
28
1
42 976
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

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

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

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

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

Хотя Atom сравним с Pentium в том, что это упорядоченная архитектура, структура конвейера сильно отличается, и планирование инструкций для Pentium, вероятно, будет очень плохо для производительности.

user57368 07.02.2009 03:51

Согласны, вы действительно нет хотите использовать -march = pentium для чего-либо, кроме настоящего Pentium.

kquinn 07.02.2009 04:12

Как и для Pentium 4:

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

Только первый аргумент имеет значение.

0xC0000022L 25.08.2020 11:43

Что ж, вики 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}"

Больше нет: en.gentoo-wiki.com/wiki/Safe_Cflags/Intel#Atom_N270.2FN280 (обновленная ссылка) теперь рекомендует CFLAGS = "- O2 -march = core2 -mtune = generic -mssse3 -mfpmath = sse -fomit-frame-pointer -pipe"

Marcel Korpel 22.02.2010 19:42

... и CFLAGS = "- O2 -march = atom -mssse3 -mfpmath = sse -fomit-frame-pointer -pipe" для GCC 4.5

Marcel Korpel 05.04.2010 16:08

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

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

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

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

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

Я не думаю, что установка -march=core2 и -mtune=pentium вообще работает: я получаю arg.c:1: error: CPU you selected does not support x86-64 instruction set

moo 14.02.2010 15:49

Интересно. Ваш атом поддерживает 64-битную версию? Если вы попробуете приведенный выше сценарий, он, вероятно, предложит вам также добавить -m32

pixelbeat 15.02.2010 12:32

да, мой атом поддерживает 64-битные.

moo 17.02.2010 03:49

Что ж, более интересный ответ был бы, если -m32 подавляет сообщение об ошибке и выводит ли gcccpuopt -m32 для вашего процессора

pixelbeat 17.02.2010 15:34

выполнение gcc44 -march=core2 -mtune=pentium -m32 -o lol lol.c для минимального файла c завершается с ошибкой о невозможности найти -lgcc. и gcccpuopt говорит мне, что -m32 -march=core2 -mtune=pentium -mfpmath=sse - оптимальная конфигурация.

moo 18.02.2010 03:23

У меня НИКОГДА видел, что mfpmath = sse создает более быстрый код на основе профилирования. Видимо это связано с ограничениями заголовков в glibc.

Alex Barker 10.08.2012 22:01

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

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

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

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

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

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

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

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

  • -O2 или -O1: флаг O2 оптимизирует скорость, а флаг -O1 оптимизирует размер
  • -msse3
  • -march = core2
  • -mfpmath = sse

i686 самый близкий. Не выбирайте core2.

GCC 4.1 -O3 -march = i686 GCC 4.3 -O3 -march = native

GCC 4.1 -O4 -ffast-математика GCC 4.3 -O4 -ffast-математика

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

-O4 не является допустимым уровнем оптимизации gcc. Читайте мануалы, а не блоги: gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Optimize-Options.html

Alex Barker 10.08.2012 22:07

«Не переходите на ядро ​​2» ... отсутствует обоснование.

0xC0000022L 25.08.2020 11:47
Ответ принят как подходящий

GCC 4.5 будет содержать параметры -march = atom и -mtune = atom.

Источник: http://gcc.gnu.org/gcc-4.5/changes.html

При использовании GCC 4.5 вы также захотите использовать -fexcess-precision = fast (подробности см. В gcc.gnu.org/bugzilla/show_bug.cgi?id=42376)

Marcel Korpel 24.02.2010 06:06

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