Я разрабатываю критическое для производительности приложение для процессора Intel Atom.
Каковы лучшие флаги оптимизации gcc для этого процессора?
Я разрабатываю критическое для производительности приложение для процессора Intel Atom.
Каковы лучшие флаги оптимизации gcc для этого процессора?
Существует классная структура под названием Acovea (Анализ параметров компилятора с помощью эволюционного алгоритма), Скотт Робер Лэдд, один из хакеров GCC. Это структура генетического/эволюционного алгоритма, которая пытается оптимизировать флаги оптимизации GCC для определенного фрагмента кода посредством естественного отбора.
Это работает примерно так: вы пишете небольшой фрагмент кода теста (он на самом деле должен быть небольшим, потому что он будет перекомпилирован и выполнен несколько тысяч раз), который представляет характеристики производительности более крупного программу, которую вы хотите оптимизировать. Затем Acovea случайным образом создает несколько десятков различных командных строк GCC, компилирует и запускает тест с каждой из них. Затем лучшим из этих командных строк разрешается «спариваться» и «выводить» новых «детей», которые (надеюсь) наследуют лучшие «гены» от своих «родителей». Этот процесс повторяется для пары десятков «поколений», пока не появится стабильный набор флагов командной строки.
GCC 4.5 будет содержать параметры -march=atom и -mtune=atom.
Источник: http://gcc.gnu.org/gcc-4.5/changes.html а>
У меня есть скрипт, который автоматически выбирает соответствующие флаги для комбинации вашего процессора и компилятора. Я только что обновил его для поддержки 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:
-march=core2
, так и -mtune=pentium
вообще работает: я получаю arg.c:1: error: CPU you selected does not support x86-64 instruction set
- person moo; 14.02.2010
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
Что ж, в вики 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}"
От Intel, Начало работы с MID
При использовании GCC для компиляции рекомендуется использовать несколько флагов:
Как и для Pentium 4:
-march=prescott -O2 -pipe -fomit-frame-pointer
Я не знаю, есть ли у GCC какие-либо специфичные для Atom флаги оптимизации, но предполагается, что ядро Atom очень похоже на исходный Pentium, с очень значительным добавлением наборов инструкций MMX/SSE/SSE2/SSE3/SSSE3. Конечно, это имеет существенное значение только в том случае, если ваш код использует операции с плавающей запятой или DSP-процессор.
Возможно, вы могли бы попробовать:
gcc -O2 -march=pentium -mmmx -msse -msse2 -msse3 -mssse3 -mfpmath=sse
вот несколько перекрестных опылений блогов... на что я действительно надеялся, так это на бенчмарк 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».
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