# Flagi gcc dot. wydajności -- make.conf

## Carnivorous

Mam takie pytanie:

Niedawno zainstalowałem Gentoo ze stage3 i zemergowałem serwer X'ów wraz z KDE. Chciałbym jednak przebudować cały system tak aby zdecydowanie zwiększyć wydajność i jeżeli to przy okazji możliwe skrócić czas kompilacji. Jakich flag i ustawień gcc powinienem użyć? Moja maszyna to: Pentium III 560MHz, 256MB SDRAM, Karta graficzna Nvidia Riva TNT2 32MB. 

Mój obecny make.conf to:

```
# These settings were set by the catalyst build script that automatically built this stage

# Please consult /etc/make.conf.example for a more detailed example

CFLAGS="-O3 -march=pentium3 -pipe"

CHOST="i686-pc-linux-gnu"

CXXFLAGS="${CFLAGS}"

MAKEOPTS="-j2"

GENTOO_MIRRORS="http://src.gentoo.pl http://gentoo.prz.rzeszow.pl http://gentoo.zie.pg.gda.pl http://gentoo.po.opole.pl ftp://gentoo.po.opole.pl ftp://mirror.icis.pcz.pl/gentoo/ "

SYNC="rsync://rsync.europe.gentoo.org/gentoo-portage"

VIDEO_CARDS="nvidia"

INPUT_DEVICES="keyboard mouse"

LINGUAS="pl"

CCACHE_SIZE="2G"

USE="-gtk -gnome kde qt dvd alsa cdr java gadu win32codecs"

ACCEPT_KEYWORDS="~x86"

```

PS. Jeżeli to pytanie jest naiwne/bezsensowne to wynika to z tego że przeniosłem sie z Ubuntu więc moja wiedza jeszcze nie jest zbyt głęboka...  :Embarassed: 

----------

## wodzik

na takim procku gentoo może ci działać wolniej niż ubuntu. wynika to z tego, ze w ubuntu developer zajmujący się dana aplikacja może kompilować program x razy z różnymi flagami kompilatora i porównywać na jakich działa najlepiej. zreszta liczac na magiczne przyspieszenie sys po odpowiednich flagach gcc możesz się zawieść. ja bym zajął się raczej optymalizacją systemu flagami USE. mniej flag to mniejsze zależności i mniej bibliotek potrzebnych do załadowania podczas uruchamiania programu. a tak na marginesie ja bym zmienił O3 na O2, albo ewentualnie na Os.

----------

## Carnivorous

Zwiechy się nie boję bo ten komp to mój poligon doświadczalny. BTW dlaczego odradzasz -O3??

----------

## wodzik

O3 działa dla niektórych pakietów, ale dla innych może powodować rozrastanie się kodu i wolniejsze działąnie binarki(czy jakos tak ;). ogólnie raczej się nie poleca.

----------

## Carnivorous

Czytałem trochę w temacie o gcc 4.3  na temat CFLAGS etc. ale nie za bardzo wiem które flagi do czego są . CZy mógłbyś podać jakieś linki do stron  gdzie wytłumaczone jest ich działanie i zastosowanie?

----------

## BeteNoire

Trzymaj się tego co jest ogólnie zalecane. Z tego co widzę O3 potrafi być nawet bardziej niebezpieczne niż Os (którego używam na dwóch swoich kompach). I nie wierz w to, że z syrenki zrobisz jumbo jeta. Tak będzie jechała jak jedzie i nigdy w cudowny sposób nie przyspieszy.

Wszystko o co pytasz jest opisane na gentoo-wiki.

----------

## n0rbi666

głównie : man gcc. Nie ma żadnych benchmarków - bo np -O3 będzie bardzo dobre dla Lame, gzip - a dla kde będzie zabójdze, bo kod będzie za duży, przez co wolniej ładuje się.

A co do flag :

```
CFLAGS="-march=pentium3 -O2 -fomit-frame-pointer -pipe"

CXXFLAGS="${CFLAGS}"

LDFLAGS="-Wl,-O1"
```

ew zamiast -O2 możesz spróbować -Os, i polecam np morph-sources na jako kernel  :Smile: 

----------

## Riklaunim

między march ustawionym na i386 a pentium3 nie będzie żadnej różnicy w codziennym używaniu systemu. Nieduże różnice pojawią się w przypadku skomplikowanych operacji obciążających mocno procesor  :Smile:  Dodanie agresywnych flag zazwyczaj kończy się niestabilnym systemem  :Smile: 

----------

## Raku

 *Carnivorous wrote:*   

> Chciałbym jednak przebudować cały system tak aby zdecydowanie zwiększyć wydajność i jeżeli to przy okazji możliwe skrócić czas kompilacji. Jakich flag i ustawień gcc powinienem użyć? Moja maszyna to: Pentium III 560MHz, 256MB SDRAM, Karta graficzna Nvidia Riva TNT2 32MB.

 

podsumujmy: chcesz dzięki odpowiedniemu ustawieniu flag kompilatora zrobić z procesora P3 Pentium Core Duo lub przynajmniej P4? Proponuję wrócić na ziemię...

----------

## timor

 *Carnivorous wrote:*   

> ...aby zdecydowanie zwiększyć wydajność i jeżeli to przy okazji możliwe skrócić czas kompilacji....
> 
> PS. Jeżeli to pytanie jest naiwne/bezsensowne to wynika to z tego że przeniosłem sie z Ubuntu więc moja wiedza jeszcze nie jest zbyt głęboka... 

 Naprawde świetny kawałek tekstu  :Smile:  Zerknij tu. Ten kawałek choć nieco podstarzały to klasyk gatunku  :Wink:  Jeśli po jego przeczytaniu nadal będziesz miał ochotę się bawić to daj znać o efektach.

----------

## Raku

 *timor wrote:*   

> Naprawde świetny kawałek tekstu  Zerknij tu. Ten kawałek choć nieco podstarzały to klasyk gatunku  Jeśli po jego przeczytaniu nadal będziesz miał ochotę się bawić to daj znać o efektach.

 

jedyna mądra wypowiedź z tego wątku dotycząca ustawień kompilatora jest tutaj (autor: ebfe).

----------

## Yatmai

Ja dodam swoje 3 grosze, CFLAGS mogą dać Ci niewielki "zysk" szybkości w stosunku do dobrze ułożonych USE  :Smile:  Generalnie Gentoo (z KDE ofkoz) śmiga mi sporo lepiej na PII 400Mhz niż koleżance Debian na 830Mhz a to już jest coś  :Smile: 

....taki bonus za to, że chciało się poświęcić chwilkę na kompilację Gentoo  :Very Happy: 

----------

## timor

 *Raku wrote:*   

> jedyna mądra wypowiedź z tego wątku dotycząca ustawień kompilatora jest tutaj (autor: ebfe).

 Mogłeś chociaż zaczekać, aż przeczyta... ;D Po dwóch dniach kombinowania poznałby na własnej skórze o co chodzi  :Wink: 

----------

## koziolek

 *Carnivorous wrote:*   

> dlaczego odradzasz -O3??

 

W przypadku niektórych aplikacji z góry zakładane jest jej działanie tylko do -O2 - O3 nie jest wspierane. Przykładem jest Gnome i GTK. Niektóre ebuild-y same zastępują O3 niższą wartością, np. GTK+ (replace-flags -O3 -O2), bo w przeciwnym razie to po prostu nie działa.

Dodatkowo -O3 z racji włączenia -finline-functions może produkować większy (objętościowo) kod, co niekoniecznie daje dobre rezultaty.

No i oczywiście z przymrużeniem oka:

http://funroll-loops.org/

 :Smile: 

BTW. W powyższych niektórych propozycjach brakuje -mfpmath=sse (o ile procesor wspiera sse - cat /proc/cpuinfo).

----------

## n0rbi666

 *koziolek wrote:*   

> BTW. W powyższych niektórych propozycjach brakuje -mfpmath=sse (o ile procesor wspiera sse - cat /proc/cpuinfo).

  Nie nie nie - mfpmath=sse warto włączać dopiero na procesorach z obsługą sse3, poniżej (czyli np pentium3, athlon-xp) - nie warto, to wręcz spowalnia kod.

----------

## koziolek

 *n0rbi666 wrote:*   

>  Nie nie nie - mfpmath=sse warto włączać dopiero na procesorach z obsługą sse3, poniżej (czyli np pentium3, athlon-xp) - nie warto, to wręcz spowalnia kod.

 

Troszkę mnie zaskoczyłeś - bo jednostki SSE nawet te nietaktowane z pełnym zegarem co procesor, są generalnie lepszym rozwiązaniem niż 387... Niemniej na Pentium M (1,86 GHz, 2048 kB cache, SSE, SSE2) wydaje się potwierdzać Twoją teorię krótki benchmark:

http://wklej.org/id/982e543e1b

(zysk: około 6,5%; powtarzalny zysk)

O dziwo w drugim przypadku kompilacja wyglądała:

 *Quote:*   

> i686-pc-linux-gnu-g++ -DHAVE_CONFIG_H -I. -I. -I..  -I.. -I../source/base -I../source/frontend -I../unix -I../libraries/png -pipe -Wno-multichar -O3 -msse -mfpmath=sse -msse2 -march=pentium-m -mtune=pentium-m -malign-double -minline-all-stringops -O3 -march=pentium-m -pipe -mfpmath=387 -c -o userio.o `test -f 'userio.cpp' || echo './'`userio.cpp
> 
> 

 

 :Smile: 

Tak czy inaczej - czy mógłbyś to (lepiej mfpmath=387 niż sse) szerzej opisać? Teoretyczne rozważania? Propozycje testów wydajnościowych, które mógłbym wykonać? Doświadczenia?

Rakieta dla povray wzięta z:

http://www.f-lohmueller.de/pov_tut/objects/obj_810e.htm

----------

## nbvcxz

Nie zgodzę się, że:

```
CFLAGS="-march=pentium3 -O2 -fomit-frame-pointer -pipe" 

CXXFLAGS="${CFLAGS}" 

LDFLAGS="-Wl,-O1"
```

to najlepsze co można ustawić. Ale zgoda - przesada może zrobić więcej złego iż dobrego.

Dla mnie pytanie Carnivorous dotyczny raczej konfiguracji gentoo w celu najwyższej wydajności. Proponuję zapoznanie się z:

https://forums.gentoo.org/viewtopic-t-509252.html

https://forums.gentoo.org/viewtopic-t-509783.html

----------

## Gabrys

Ja tam bym pozostał przy tych flagach, co masz.

Miałem kiedyś -O3 bez żadnych problemów (pewnie przez to, że jeśli wiadomo, że coś się nie kompiluje z -O3, to jest zamieniane na -O2).

Teraz mam:

CFLAGS="-march=athlon-xp -O2 -pipe -fomit-frame-pointer"

CXXFLAGS="${CFLAGS}"

ACCEPT_KEYWORDS="x86"

MAKEOPTS="-j1"

I teraz może po kolei:

dlaczego -O2 "zamiast" -O3? Czas kompilacji w przybliżeniu ze dwa razy dłuższy dla -O3, a wzrost wydajności niemal niezauważalny (no może, w niektórych sytuacjach).

dlaczego x86, a nie ~x86, bo nie lubię jak coś nie działa. Jak chcę mieć nowszą wersję niż oznaczona jako stable, to sobie dodaję wpisy do /etc/portage/package.keywords/ ale reszta systemu jest stabilna jak khm...

dlaczego -j1 a nie -j2: -j2 powoduje, w skrócie mówiąc kompilowanie dwóch kawałków kodu jednocześnie. Czyli mamy wzrost wydajności, bo w czasie wykonywania np. operacji dyskowych w jednym procesie, drugi proces może pożerać sobie procesor na swoje obliczenia, ALE: dwa procesy to dwa (~) razy więcej zżeranej pamięci. Konsekwencje tego są dwojakie: 1. zamulenie kompa, gdy akurat coś usiłujesz robić, czyli trochę brakuje pamięci. 2. Niektóre kompilacje zżerają np. 200-300 MB pamięci. Ta liczba razy dwa, przekracza dostępną fizyczną pamięć, następuje swapowanie, co (zamiast przyśpieszać) spowalnia kompilacje.

Podsumowując: jak kompilujesz sporo, powiedzmy na noc, to można sobie ustawić -j2, ale generalnie na desktop Gabrys poleca -j1.

To chyba tyle. Jak jest jasne i ogólnie znane, że jakiś program dostaje mocnego kopa z konkretnymi flagami (jest kilka), to można go specjalnie skompilować z ustawionymi specjalnie dla niego flagami.

Czas zabawy z flagami zawsze będzie większy niż czas, który uzyskasz na szybszym działaniu komputera.

I jeszcze mała uwaga dotycząca -Os. Wydaje mi się, że nie powinno się zbytnio stosować tej optymalizacji. Sprawdziłbym to na Twoim miejscu.

----------

## wodzik

jeszcze dodam tak propo tego -j1 czy -j2. jest pare pakietoww, ktore ni ciula sie nie kompiluja z j2. np taki wine. niedawno jeszcze jeden pakiet ktory kompilowalem tak mial (nie pamietam co to bylo, wiec raczej jakas pierdola), wiec ustawilem j1 i tak zostalo. nie zauwazyłem jakiegos strasznego spowolnienia kompilacji.

----------

## nbvcxz

 *wodzik wrote:*   

> jeszcze dodam tak propo tego -j1 czy -j2. jest pare pakietoww, ktore ni ciula sie nie kompiluja z j2. np taki wine. niedawno jeszcze jeden pakiet ktory kompilowalem tak mial ...

 

ależ oczywiście że wine compiluje się -j2 ; u mnie kompilacja wine zajmowała bardzo dużo miejsca na /var/tmp i wszyskie ewentualne wywrotki brały się z powodu przepełnienia tej patycji podczas kompilacji (teraz mam na /var ok5GB i starcza) ale nigdy nie wymagały -j1

----------

## wodzik

u mnie niestety za malo ramu, albo wolnego miejsca na partycji. przy j1 sie nie rozrasta az tak. i moge kompilowac pracujac normalnie na kompie.

----------

## Gabrys

Zapomniałem dodać, że jak ktoś chce jednocześnie zmniejszyć czas kompilacji i szybkość działania, to jedynym wyjściem jest kupienie szybszego kompa  :Very Happy: . Każda dodatkowa optymalizacja, która potencjalnie (!) zwiększa wydajność kodu, powoduje wydłużenie czasu kompilacji.

----------

## n0rbi666

 *koziolek wrote:*   

> Tak czy inaczej - czy mógłbyś to (lepiej mfpmath=387 niż sse) szerzej opisać? Teoretyczne rozważania? Propozycje testów wydajnościowych, które mógłbym wykonać? Doświadczenia?

 

Propozycje testów : 

Nbench ( http://www.tux.org/~mayer/linux/bmark.html ) - ale to dość dziwny benchmark

Najlepiej np skompilować lame z różnymi flagami, zrobić plik ~100 mega (dd if=/dev/urandom of=/home/n0rbi bs=1M count=128) - i kompresować go lame porównując uzyskane czasy.

Kumpel jest w trakcie pisania skryptu, który robi to automatycznie dla różnych flag - na razie uzyskał takie wyniki :

http://rydek1.w.interia.pl/out.txt  (literówka tam jest - zamiast czas kompresji powinno być czas kompilacji

pierwszy wynik to czas kompresji pliku, drugi - wielkośc uzyskanej binarki, trzeci - czas kompilacji)

Można jeszcze użyć w tym celu gzip, bzip2, p7zip, transcode - generalnie wszystkiego, co wymaga dużej liczby obliczeń zmiennoprzecinkowych  :Smile: 

----------

## Carnivorous

Wielki dzieki za pomoc. A propos nowego kompa to pewnie nie wczesniej niz latem cokolwiek pomysle bo z kasa krucho. BTW nie chodzilo mi o zrobienie z pIII 500MHz Core 2 Duo, tylko ogolnie co sie zaleca. Na Gentoo przenioslem sie ze wzgledu na portage i ogolnie zeby poznac system "nie dla blondynek (bez urazy dla blondynek)". A tak swoja droga to czy komus dziala expat 2.0? bo mi caly czas wywala blad libexpat.so.0 a nie chce mi sie zbytnio revdep-rebuildowac bo znajduje prawie 100 pakietow do przebudowy.

----------

## Gabrys

 *Carnivorous wrote:*   

> A tak swoja droga to czy komus dziala expat 2.0? bo mi caly czas wywala blad libexpat.so.0 a nie chce mi sie zbytnio revdep-rebuildowac bo znajduje prawie 100 pakietow do przebudowy.

 

I to rozwiązuje sprawę, zostaw sobie na noc.

----------

## timor

 *wodzik wrote:*   

> u mnie niestety za malo ramu, albo wolnego miejsca na partycji. przy j1 sie nie rozrasta az tak. i moge kompilowac pracujac normalnie na kompie.

 No to już wiesz jaka byłą tego przyczyna, za mało pamięci (ram + swap). W Twoim przypadku może nawet lepiej będzie zostawić na j1.

 *Carnivorous wrote:*   

> .... a nie chce mi sie zbytnio revdep-rebuildowac bo znajduje prawie 100 pakietow do przebudowy.

 Właśnie dlatego powienieneś go zrobić!

----------

## Raku

 *n0rbi666 wrote:*   

> Najlepiej np skompilować lame z różnymi flagami, zrobić plik ~100 mega (dd if=/dev/urandom of=/home/n0rbi bs=1M count=128) - i kompresować go lame porównując uzyskane czasy.

 

taaaaa...

i w ten sposób uzyskasz optymalne flagi do kompilacji lame.

Nie ma optymalnych flag kompilatora, które byłyby idealne dla wszystkich programów. W jednym kopa da flaga X, w drugim ta flaga spowoduje błędy w działaniu binarki. Dlatego najoptymalniejsze są te flagi uznane na Wiki za tzw. 'safe flags'.

Zapewne kiedyś sami dojdziecie do takiego wniosku. Mi zajęło to ok. rok.

 *Carnivorous wrote:*   

> 
> 
> A tak swoja droga to czy komus dziala expat 2.0? bo mi caly czas wywala blad libexpat.so.0 a nie chce mi sie zbytnio revdep-rebuildowac bo znajduje prawie 100 pakietow do przebudowy.

 

zmień więc dystrybucję albo zostań przy wcześniejszych wersjach tej biblioteki   :Twisted Evil: 

----------

## timor

 *Raku wrote:*   

> ... Dlatego najoptymalniejsze są te flagi uznane na Wiki za tzw. 'safe flags'.
> 
> Zapewne kiedyś sami dojdziecie do takiego wniosku. Mi zajęło to ok. rok.

 Sad but true. Tak na prawdę podając  -march=?? kompilator na tej podstawie dobiera to co dla naszego procka najlepsze, nie ma sensu dopisywać jeszcze raz mmx, sse itd. Najczęściej czas stracony na znalezienie najoptymalniejszych flag nie zwraca się. Stracić dwie godziny (czasem więcej) na kombinowanie po to aby przyspieszyć program o 1s... i zwróci się to po ponad 7000 wywołań programu (tak statystycznie). Po co?  :Smile: 

----------

## n0rbi666

 *Raku wrote:*   

>  *n0rbi666 wrote:*   Najlepiej np skompilować lame z różnymi flagami, zrobić plik ~100 mega (dd if=/dev/urandom of=/home/n0rbi bs=1M count=128) - i kompresować go lame porównując uzyskane czasy. 
> 
> taaaaa...
> 
> i w ten sposób uzyskasz optymalne flagi do kompilacji lame.
> ...

 

Taa ale pytanie było : jak sprawdzić czy mfpmath=sse jest wolniejsze od mfpmath=387 - i na nie udzielałem odpowiedzi, lame jest dobrym przykładem w tym wypadku  :Smile: 

----------

## Raku

 *n0rbi666 wrote:*   

> Taa ale pytanie było : jak sprawdzić czy mfpmath=sse jest wolniejsze od mfpmath=387 - i na nie udzielałem odpowiedzi, lame jest dobrym przykładem w tym wypadku 

 

ano fakt   :Embarassed: 

----------

## Eeeyeore

 *n0rbi666 wrote:*   

> ...
> 
> Kumpel jest w trakcie pisania skryptu, który robi to automatycznie dla różnych flag - na razie uzyskał takie wyniki :
> 
> http://rydek1.w.interia.pl/out.txt  (literówka tam jest - zamiast czas kompresji powinno być czas kompilacji
> ...

 

Ooo widzisz to by bylo bardzo interesujace. Czy bylbys w stanie go udostepnic ?

----------

