Я разрабатываю приложение, критичное к производительности, для процессора Intel Atom.
Каковы лучшие флаги оптимизации gcc для этого процессора?


Есть классный фреймворк под названием 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, вероятно, будет очень плохо для производительности.
Согласны, вы действительно нет хотите использовать -march = pentium для чего-либо, кроме настоящего Pentium.
Как и для Pentium 4:
-march=prescott -O2 -pipe -fomit-frame-pointer
Только первый аргумент имеет значение.
Что ж, вики 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"
... и CFLAGS = "- O2 -march = atom -mssse3 -mfpmath = sse -fomit-frame-pointer -pipe" для GCC 4.5
У меня есть сценарий, который автоматически выбирает соответствующие флаги для вашей комбинации процессора и компилятора. Я только что обновил его для поддержки 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
Интересно. Ваш атом поддерживает 64-битную версию? Если вы попробуете приведенный выше сценарий, он, вероятно, предложит вам также добавить -m32
да, мой атом поддерживает 64-битные.
Что ж, более интересный ответ был бы, если -m32 подавляет сообщение об ошибке и выводит ли gcccpuopt -m32 для вашего процессора
выполнение gcc44 -march=core2 -mtune=pentium -m32 -o lol lol.c для минимального файла c завершается с ошибкой о невозможности найти -lgcc. и gcccpuopt говорит мне, что -m32 -march=core2 -mtune=pentium -mfpmath=sse - оптимальная конфигурация.
У меня НИКОГДА видел, что mfpmath = sse создает более быстрый код на основе профилирования. Видимо это связано с ограничениями заголовков в glibc.
вот некое перекрестное опыление блогов ... на что я действительно надеялся, так это на тест, скомпилированный с помощью 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 для компиляции есть несколько рекомендуемых флагов:
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
«Не переходите на ядро 2» ... отсутствует обоснование.
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)
А как насчет компилятора Intel C (icc)? По крайней мере, в тестах, которые идут с ним, доминирование над gcc довольно заметно ...