Arch-Like - nietypowy blog, nietypowe forum.

Poradniki => Software => Wątek zaczęty przez: sir_lucjan w Październik 27, 2014, 20:32:41

Tytuł: [How To]Kompilujemy binarki pod własny procesor
Wiadomość wysłana przez: sir_lucjan w Październik 27, 2014, 20:32:41
Poradnik przeznaczony jest dla bardziej zaawansowanych użytkowników

Jeśli dość często kompilujemy za pomocą AUR bądź innych PKGBUILDów innego źródła, warto zastanowić się nad modyfikacją pliku /etc/makepkg.conf

Przed rozpoczęciem pracy, należy wykonać kopię zapasową pliku:

cp /etc/makepkg.conf /etc/makepkg.conf.backup
Na początek powinniśmy zlokalizować odpowiedni fragment:

#-- Exclusive: will only run on x86_64
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CPPFLAGS="-D_FORTIFY_SOURCE=2"
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4"
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro"
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"

Stosując takie ustawienia, uzyskamy klasycznie skompilowaną paczkę, z ustawieniami domyślnymi. Nie będzie ona przeznaczona pod żaden konkretny model procesora. Jeśli jednak chcemy uzyskać nieco większą wydajność, możemy zmienić ustawienia w taki sposób, iż skompilowane przez nas binarki będą charakteryzowały się lepszym wsparciem dla naszego procesora.

Jak to osiągnąć? Wystarczy wprowadzić niewielkie zmiany.

CPPFLAGS="-D_FORTIFY_SOURCE=2"
CFLAGS="-march=native -O2 -pipe -fstack-protector --param=ssp-buffer-size=4"
CXXFLAGS="${CFLAGS}"

Jeśli chcemy wiedzieć, co kryje się pod tajemnym "march=native", możemy to z łatwością sprawdzić.

[lucjan@archlinux ~]$ gcc -march=native -E -v - </dev/null 2>&1 | sed -n 's/.* -v - //p'
-march=corei7-avx -mno-cx16 -mno-sahf -mno-movbe -mno-aes -mno-pclmul -mno-popcnt -mno-abm -mno-lwp -mno-fma -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mno-avx -mno-avx2 -mno-sse4.2 -mno-sse4.1 -mno-lzcnt -mno-rtm -mno-hle -mno-rdrnd -mno-f16c -mno-fsgsbase -mno-rdseed -mno-prfchw -mno-adx -mfxsr -mno-xsave -mno-xsaveopt --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=6144 -mtune=corei7-avx

Od tej pory skompilowane przez nas paczki powinny charakteryzować się większą wydajnością oraz mniejszym zapotrzebowaniem na pamięć, jednak zmiany te mogą nie być znaczące. Należy też pamiętać, że tak skompilowane paczki powinny pozostać na użytek własny, gdyż u kolegi posiadającego inny sprzęt, całość może po prostu nie funkcjonować w oczekiwany sposób.

Niestety, poradnik ten nie działa podczas kompilowania programów opartych na bibliotece Qt 4/5.

Źródła:

https://wiki.archlinux.org/index.php/makepkg

https://wiki.gentoo.org/wiki/GCC_optimization