Оптимизация gcc
Здравствуйте!
Вот доступные функции моего процессора:
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc nonstop_tsc extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt hw_pstate npt lbrv svm_lock nrip_save
В CFLAGS надо вписывать -msse, -msse2, -msse3, -mmmx, -m3dnow.
Так ли мне следует его заполнить? CFLAGS="-march=i686 -O2 -mmmx -msse3 -m3dnow -pipe"
Или достаточно написать один любой из них?(-mmmx -msse3 -m3dnow)
Также видел, что многие в -march пишут нечто такое:core2/native/amdfam10 и т.д., т.п. Они прописывают свой процессор или же native, а не разрядность. Это без разницы?
- Для комментирования войдите или зарегистрируйтесь
https://wiki.gentoo.org/wiki/
https://wiki.gentoo.org/wiki/Safe_CFLAGS
#
$ grep -m1 -A3 "vendor_id" /proc/cpuinfo
vendor_id : AuthenticAMD
cpu family : 16
model : 5
model name : AMD Athlon(tm) II X3 460 Processor
Такого там не нашел.
$ gcc -march=native -E -v - &1 | grep cc1
/usr/lib/gcc/i486-linux-gnu/4.7/cc1 -E -quiet -v -imultiarch i386-linux-gnu -march=amdfam10 -mcx16 -msahf -mno-movbe -mno-aes -mno-pclmul -mpopcnt -mabm -mno-lwp -mno-fma -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mno-avx -mno-avx2 -mno-sse4.2 -mno-sse4.1 -mlzcnt -mno-rdrnd -mno-f16c -mno-fsgsbase --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512 -mtune=amdfam10
Этот мне чтоли использовать?
Что по поводу -msse, -msse2, -msse3, -mmmx, -m3dnow?
http://gentoo.ru/content/u-me
http://gentoo.ru/content/u-menya-processor-imyarek-chto-podstavlyat-v-peremennuyu-cflags
http://i.imgur.com/usftZ.png
#
Т.е. -march=i686 эта оптимизация не конкретно под мой процессор, а под разрядность.
Что же тогда лучше мне использовать -march=native или -march=amdfam10?
Повторюсь, что процессор у меня:
vendor_id : AuthenticAMD
cpu family : 16
model : 5
model name : AMD Athlon(tm) II X3 460 Processor
а вывод на команду: $ gcc -march=native -E -v - &1 | grep cc1
/usr/lib/gcc/i486-linux-gnu/4.7/cc1 -E -quiet -v -imultiarch i386-linux-gnu -march=amdfam10 -mcx16 -msahf -mno-movbe -mno-aes -mno-pclmul -mpopcnt -mabm -mno-lwp -mno-fma -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mno-avx -mno-avx2 -mno-sse4.2 -mno-sse4.1 -mlzcnt -mno-rdrnd -mno-f16c -mno-fsgsbase --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512 -mtune=amdfam10
/
А почитать (и понять) всё написанное по ссылке?…
Не?…
i686
— это generic (базовый) набор инструкций для 32-х разрядных процессоров (x86) начиная ЕМНИП с Pentium2.А профиль какой?
Там же можно прочитать про значение
march
для genericamd64
.:wq
--
Live free or die
#
По ссылке я это и понял, про i686.
Профиль наверное выбиру [2] default/linux/x86/13.0/desktop
native ставь
native ставь
если не используешь (и не
если не используешь (и не планируешь) distcc, то банального native за глаза.
а по флагам проца с жёстко заданным семейством...
ты должен при этом указать только старшую из SIMD - т.к. они овер march/mtune задаются только для всего семейства, а не для конкретной модели:
например core2 это вплоть до ssse3
а тем не менее многие процы из сего семейства умеют sse_4.1.
все симды ещё умеют фичу - они включают все предыдущие варианты - т.е. тот же sse* включит и mmx, не говоря уже о младших sse*.
а вообще луче всего выяснить архитектуру задаваемую нитивом и приписать mtune под generic, и указать самую старшую симд/вектор.
если речь о 32, то нужно распорядиться о использовании оных инструкций овер mfpmath.
#
Т.е. как я понял если мне писать native, то флаги процессора вводить не надо. Т.к. они сами определятся как и сам процессор и строка будет у меня выглядеть так: CFLAGS="-march=native -O2 -pipe"
если же я все таки пропишу -march=amdfam10(у меня он вывелся при команде $ gcc -march=native -E -v - &1 | grep cc1), то надо указать флаги. Флаг -msse3 включает в себя -msse, -msse2, -mmmx и тогда будет выглядеть так:CFLAGS="-march=i686 -O2 -msse3 -m3dnow -pipe" а m3dnow надо тогда вводить?
емнип, надо
емнип, надо
#
что надо?
m3dnow
m3dnow
спасибо. значит без
спасибо.
значит без разницы
CFLAGS="-march=native -O2 -pipe"
или
CFLAGS="-march=amdfam10 -O2 -msse3 -m3dnow -pipe"
спасибо