Участник с: 08 октября 2015
|
Немного не понятна тема, как же определить точные флаги оптимизации под свой процессор тут сказано, что надо проделать:
Find CPU-specific options
At first, create two files and set language to English to get sed working:
user $touch native.cc march.cc
user $LANG="en"
Compile the first file:
user $gcc -fverbose-asm -march=native native.cc -S
Get march, which gcc will choose:
user $grep march native.s
Options passed: -D_GNU_SOURCE native.cc -march=core-avx-i -mcx16 -msahf
Now compile a second file:
user $gcc -fverbose-asm -march=core-avx-i march.cc -S
Now clean the
.s files for an easy comparisons:
user $sed -i 1,/options\ enabled/d march.s
user $sed -i 1,/options\ enabled/d native.s
When you not set LANG on an localized system, you have now empty files.
Compare both
.s files:
user $diff march.s native.s
Output empty? You found your -march=, use it. In other cases: тут то у меня и получается проблема. написано как я понял, чо если вывод диффа пустой, то нужные флаги найдены, если не пустой, то:
20,25c20,23
< # -maccumulate-outgoing-args -maes -malign-stringops -mavx
< # -mavx256-split-unaligned-load -mavx256-split-unaligned-store -mcx16
< # -mf16c -mfancy-math-387 -mfp-ret-in-387 -mfsgsbase -mfxsr -mglibc
< # -mieee-fp -mlong-double-80 -mmmx -mpclmul -mpopcnt -mpush-args -mrdrnd
< # -mred-zone -msahf -msse -msse2 -msse3 -msse4 -msse4.1 -msse4.2 -mssse3
< # -mtls-direct-seg-refs -mxsave -mxsaveopt
---
> # -maccumulate-outgoing-args -malign-stringops -mcx16 -mfancy-math-387
> # -mfp-ret-in-387 -mfsgsbase -mfxsr -mglibc -mieee-fp -mlong-double-80
> # -mmmx -mpclmul -mpopcnt -mpush-args -mred-zone -msahf -msse -msse2 -msse3
> # -msse4 -msse4.1 -msse4.2 -mssse3 -mtls-direct-seg-refs
Now guess, which switches -march=core-avx-i enable and -march=native not: -maes -mavx and some more. Now we build march.cc again with this two switches disabled:
gcc -fverbose-asm -march=core-avx-i -mno-aes -mno-avx march.cc -S
sed -i 1,/options\ enabled/d march.s
diff march.s native.s
< # -mmmx -mpclmul -mpopcnt -mpush-args -mrdrnd -mred-zone -msahf -msse
< # -msse2 -msse3 -msse4 -msse4.1 -msse4.2 -mssse3 -mtls-direct-seg-refs
---
> # -mmmx -mpclmul -mpopcnt -mpush-args -mred-zone -msahf -msse -msse2 -msse3
> # -msse4 -msse4.1 -msse4.2 -mssse3 -mtls-direct-seg-refs
One switch we need to disable too: -mrdrnd
Finally set CFLAGS:
FILE /etc/portage/make.conf
CFLAGS="-march=ivybridge -mno-avx -mno-aes -mno-rdrnd -O2 -pipe"
получается у меня вывод:
diff march.s native.s
23c23
< # -maes -malign-stringops -mavx -mavx256-split-unaligned-load
---
> # -malign-stringops -mavx -mavx256-split-unaligned-load
т.е. надо найтить различия и отключить их (-maes)...
но дальше там есть именно для моего проца строка с флагами, но получается она не подходит, если верить ентим действиям выше строка с флагами для моего i3 2100 процессора содержит CFLAGS="-march=sandybridge -O2 -pipe" , дополнительные опции выключения CFLAGS="-march=sandybridge -mno-avx -mno-aes -mno-rdrnd -O2 -pipe" содержатся для проца pentium на ентой архитектуре.
т.е. мой проц не поддерживает AES??? и его надо отключить? со строкой gcc -fverbose-asm -march=sandybridge -mno-aes march.cc -S diff выводится пустой. почему тогда для моего проца написана строка без -mno-aes в руководстве?
|