LINUX.ORG.RU

[гентушникам]подскажите оптимальные флаги для атома


0

1
$gcc --version
gcc (GCC) 4.4.3 20100316 (prerelease)
$cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 28
model name	: Intel(R) Atom(TM) CPU N270   @ 1.60GHz
stepping	: 2
cpu MHz		: 800.000
cache size	: 512 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fdiv_bug	: no
hlt_bug		: no
f00f_bug	: no
coma_bug	: no
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 xtpr pdcm movbe lahf_lm
bogomips	: 3193.18
clflush size	: 64
cache_alignment	: 64
address sizes	: 32 bits physical, 32 bits virtual
power management:

В вашей вики предлагается использовать:

CHOST="i686-pc-linux-gnu"
CFLAGS="-O2 -march=core2 -mtune=generic -mssse3 -mfpmath=sse -fomit-frame-pointer -pipe"
CXXFLAGS="${CFLAGS}"

Может еще что добавить? Или не стоит?

Для всей системы сойдет.
Для отдельных пакетов можно еще поиграться с
-ftree-vectorize -mstackrealign
-ftree-loop-distribution -floop-interchange -floop-strip-mine -floop-block
-ffast-math
по мере убывания вероятности удачной сборки

madcore ★★★★★ ()

судя по выхлопу

gcc -O2 -march=core2 -mtune=generic -mssse3 -mfpmath=sse -fomit-frame-pointer -Q --help=target | grep включено
  -m32                        		[включено]
  -m80387                     		[включено]
  -m96bit-long-double         		[включено]
  -malign-stringops           		[включено]
  -mfancy-math-387            		[включено]
  -mfp-ret-in-387             		[включено]
  -mfused-madd                		[включено]
  -mglibc                     		[включено]
  -mhard-float                		[включено]
  -mieee-fp                   		[включено]
  -mno-sse4                   		[включено]
  -mpush-args                 		[включено]
  -mred-zone                  		[включено]
  -msse                       		[включено]
  -msse2                      		[включено]
  -msse3                      		[включено]
  -mssse3                     		[включено]
  -mstackrealign              		[включено]
  -mtls-direct-seg-refs       		[включено]
ещё нужен -mmmx (ну не верю я докам %))

megabaks ★★★★ ()

-O2 march=native

обеспечит 90% прироста, а дальше как на gentoo wiki, если оставшиеся проценты нужны=) хотя те флаги, что перечислены входят в -O2 march=native (имхо)

qnikst ★★★★★ ()
Ответ на: комментарий от megabaks
$ g++ -O2 -march=core2 -mtune=generic -fomit-frame-pointer -pipe -mfpmath=sse -mssse3 -mmmx tutorial_3.cpp -lglut -lGLU -o a
$ g++ -O2 -march=core2 -mtune=generic -fomit-frame-pointer -pipe -mfpmath=sse tutorial_3.cpp -lglut -lGLU -o b
$ diff -s a b
Files a and b are identical

Тот же результат при сборке Zhu3D.

rival ★★ ()

GCC 4.4-4.5 (4.4 требует патча для поддержки atom)

64bit:

-m64 -O2 -mssse3 -march=atom -mtune=atom -msahf -mcx16 -mmovbe --param l1-cache-size=24 --param l2-cache-size=512

32bit:

-m32 -O2 -mssse3 -mmmx -march=atom -mtune=atom --param l1-cache-size=24 --param l2-cache-size=512

--param иногда глючат в CFLAGS, например при сборке Glibc, размеры кеша лучше перепроварить, хотя GCC 4.4 определяет их сам, если использовать -march=native

-mfpmath=sse (=both) на ваше усмотрение

Sylvia ★★★★★ ()
Ответ на: комментарий от megabaks

-msse* только разрешает инструкции, не более и не менее

для того чтобы GCC реально что-то сгенерировал нужно или использовать

-mfpmath=sse для математики

или

-ftree-vectorize (-O3)

вот такой вариант

-O3 -fno-tree-vectorize -msse4 -mfpmath=387 будет генерировать код без sse инструкций, однако разрешит использовать gcc builtins для SSE4

Sylvia ★★★★★ ()
Ответ на: комментарий от megabaks

Прочитай мой первый пост:

Тот же результат при ...

Что означает, что туториал отдельно от Zhu3d, - это два разных никак несвязанных между собой теста.

Блин, то ли я по-русски писать не умею, то ли ты читать разучился.

rival ★★ ()
Ответ на: комментарий от Sylvia

так а что именно курить? в мане гцц (вроде) есть строки про бесполезность -mfpmath=* без -mss*, обратного не нашёл или плохо искал - сообщи вектор уже :)

megabaks ★★★★ ()
Ответ на: комментарий от megabaks

значит я «тот же результат» распарсил как a==b из приведённого кода %)

Как бы так оно и есть, бинарники не отличались (a==b) в обоих случаях - как при сборке туториала, так и при сборке этого Zhu3d.

Еще я наткнулся на такую забавную штуку, Acovea:

ACOVEA (Analysis of Compiler Options via Evolutionary Algorithm) implements a genetic algorithm to find the «best» options for compiling programs with the GNU Compiler Collection (GCC) C and C++ compilers. «Best», in this context, is defined as those options that produce the fastest executable program from a given source code. Acovea is a C++ framework that can be extended to test other programming languages and non-GCC compilers.

Надо будет как-нибудь попробовать на досуге.

rival ★★ ()
Ответ на: комментарий от Sylvia

вот кусок мана гцц

To have SSE/SSE2 instructions generated automatically from floating-point code (as opposed to 387 instructions), see -mfpmath=sse

это всё что нашёл интересного но ни про sse3 ни про более новые нет ничего!

и это строка не говорит про бесполезность переключалок без -mfpmath=sse

как в описании -mfpmath= так и в кучке 3D* sse* etc ничего этого нет....

megabaks ★★★★ ()
Ответ на: комментарий от megabaks

для математики нужны регистры, или sse (только float) или sse2 (double 128 бит), больше разницы для -mfpmath=sse нет.
Для AVX (-mavx) наверное что то будет , там 256 бит SSE регистры

если сильно мучает вопрос - посмотрите исходники, я 100% достоверной информации не дам, но считаю что сами по себе флажки -msse* не включают генерацию sse инструкций в коде, а лишь разрешают ее
Отчасти это доказывается сравнением бинарников с -msse* и без
и как минимум верно для GCC 4.3.x и ранее.

Sylvia ★★★★★ ()
Ответ на: комментарий от Sylvia

>..............
These switches enable or disable the use of instructions in the MMX,SSE,SSE2,SSE3,SSSE3, SSE4.1, AVX, AES, PCLMUL, SSE4A, SSE5, ABM or 3DNow!
ну я уж хз (
и да у меня 4.4.3

megabaks ★★★★ ()
Ответ на: комментарий от Sylvia

>Отчасти это доказывается сравнением бинарников с -msse* и без
дык там и mmx был....
тока каким краем SSE/SSE2 к SSSE3?
и если -mfpmath=sse НЕ генерит реально код с ssse3 (в данном случае) то КАК оно тогда вообще включается?
не понимать!!! (

megabaks ★★★★ ()
Ответ на: комментарий от megabaks

(вроде как) для -mfpmath=sse имеет значение только тип регистров
sse (float, 80 bit)
или
sse2 (double, полные 128 бит)

более сложные вещи -mfpmath не задействует.

Sylvia ★★★★★ ()
Ответ на: комментарий от Sylvia

вообще лучше все сравнивать на эксперименте или просматривать код GCC,
к сожалению все аспекты GCC документировать невозможно, разработчиков там достаточно немного и времени на написание документации у них мало.

Sylvia ★★★★★ ()
Ответ на: комментарий от Sylvia

флажки -msse* не включают генерацию sse инструкций в коде, а лишь разрешают ее

$ g++ evobench.c -O2 -march=pentium -mtune=generic -mfpmath=sse -mmmx -mssse3 -lrt -o a
$ g++ evobench.c -O2 -march=pentium -mtune=generic -mfpmath=sse -lrt -o b
evobench.c:1: warning: SSE instruction set disabled, using 387 arithmetics
$ diff -s a b
Files a and b differ
$ g++ evobench.c -O2 -march=core2 -mtune=generic -mfpmath=sse -mmmx -mssse3 -lrt -o a
$ g++ evobench.c -O2 -march=core2 -mtune=generic -mfpmath=sse -lrt -o b
$ diff -s a b
Files a and b are identical
$ g++ evobench.c -O2 -march=pentium -mtune=generic -mfpmath=387 -mmmx -mssse3 -lrt -o a
$ g++ evobench.c -O2 -march=pentium -mtune=generic -mfpmath=387 -lrt -o b
$ diff -s a b
Files a and b differ
$ g++ evobench.c -O2 -march=core2 -mtune=generic -mfpmath=387 -mmmx -mssse3 -lrt -o a
$ g++ evobench.c -O2 -march=core2 -mtune=generic -mfpmath=387 -lrt -o b
$ diff -s a b
Files a and b are identical

Судя по тестам все же включают генерацию, но другое дело, что, похоже, -march=core2 само ставит нужные флажки. А -mmmx нет смысла указывать даже в случае -march=pentium.

rival ★★ ()
Ответ на: комментарий от rival

хз хз - в доках типа -msse4.1 включает кучку sse вплоть до самой 4.1 + mmx - но
gcc флажки -Q --help=target
говорит совсем другое
например нет mmx
и при -march=native оно определяет мой проц как core2 и включает кучку sse, но про mmx забывает,а вот если подсунуть
gcc флажки -march=core2 флажки -Q --help=target
то ни одного sse и mmx включено не будет
короче кто где то кого то на...хм...обманул (

megabaks ★★★★ ()
Ответ на: комментарий от megabaks

Здесь кто-то пишет:

and man gcc says: --help={class|[^]qualifier}[,...] Print (on the standard output) a description of the command line options understood by the compiler that fit into all specified classes and qualifiers. These are the supported classes:

target This will display target-specific options. Unlike the --target-help option however, target-specific options of the linker and assembler will not be displayed. This is because those tools do not currently support the extended --help= syntax.

Which leads to the conclusion, that it only shows options that can be set. Not options how they are really set (besides a few that are enabled by the architecture). If you leave -march=core2 out. you will probably get the same result.

rival ★★ ()
Ответ на: комментарий от rival

Там же есть ссылка на утилиту dev.gentoo.org/~dirtyepic/bin/analyze-x86, которая работает вот так:

$ g++ evobench.c -O2 -march=core2 -mtune=generic -mfpmath=sse -mmmx -mssse3 -lrt -o a && ./analyze-x86.sh a
i486:    0 i586:    0 ppro:    1 mmx:   12 sse:   10 sse2:  133 sse3:    0 sse4.1:    0 sse4.2:    0
a will run on Pentium IV (pentium4) or higher processor.

$ g++ evobench.c -O2 -march=core2 -mtune=generic -mfpmath=sse -mmmx -lrt -o a && ./analyze-x86.sh a
Disassembling a, please wait...
i486:    0 i586:    0 ppro:    1 mmx:   12 sse:   10 sse2:  133 sse3:    0 sse4.1:    0 sse4.2:    0
a will run on Pentium IV (pentium4) or higher processor.

$ g++ evobench.c -O2 -march=core2 -mtune=generic -mfpmath=sse -lrt -o a && ./analyze-x86.sh a
i486:    0 i586:    0 ppro:    1 mmx:   12 sse:   10 sse2:  133 sse3:    0 sse4.1:    0 sse4.2:    0
a will run on Pentium IV (pentium4) or higher processor.

$ g++ evobench.c -O2 -march=core2 -mtune=generic -mfpmath=387 -mmmx -mssse3 -lrt -o a && ./analyze-x86.sh a
i486:    0 i586:    0 ppro:   18 mmx:    0 sse:    0 sse2:    0 sse3:    4 sse4.1:    0 sse4.2:    0
a will run on Pentium IV (pentium4) w/ SSE3 or higher processor.

$ g++ evobench.c -O2 -march=core2 -mtune=generic -mfpmath=387 -mmmx -lrt -o a && ./analyze-x86.sh a
i486:    0 i586:    0 ppro:   18 mmx:    0 sse:    0 sse2:    0 sse3:    4 sse4.1:    0 sse4.2:    0
a will run on Pentium IV (pentium4) w/ SSE3 or higher processor.

$ g++ evobench.c -O2 -march=core2 -mtune=generic -mfpmath=387  -lrt -o a && ./analyze-x86.sh a
i486:    0 i586:    0 ppro:   18 mmx:    0 sse:    0 sse2:    0 sse3:    4 sse4.1:    0 sse4.2:    0
a will run on Pentium IV (pentium4) w/ SSE3 or higher processor.

rival ★★ ()

спасибо за скрипт, давно искала

megabaks, ну вот и будет с чем теперь экспериментировать,
тем более в GCC 4.4 несколько изменили вроде поведение векторизации

Sylvia ★★★★★ ()
Ответ на: комментарий от megabaks

аналогично, единственное напишу , что с Glibc 2.11.1 анализатор врет, т.к. там в /usr/lib/*crt*.o уже есть cpuid , sse* , включая sse 4.2 (Nehalem), но похоже что для GCC 4.4 достаточно -msse* (без -mfpmath=sse и -ftree-vectorize) чтобы анализатор уже обнаруживал прирост инструкций SSE , 4.3.x этого не делал (хотя тесты смотрела давно, может и не совсем точно)

Sylvia ★★★★★ ()
Ответ на: комментарий от Sylvia

т.е для 4.4* ss*e* включаются без -mfpmath=sse и -ftree-vectorize ?
хорошо :)

megabaks ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.