Kompilowanie GNU / Linux z optymalizacją -O3


Odpowiedzi:


8

Jest używany w Gentoo i nie zauważyłem niczego niezwykłego.


8
Należy jednak pamiętać, że -O3 jest często filtrowane przez ebuildy.
Maciej Piechotka,

17

-O3 ma kilka wad:

  1. Przede wszystkim często generuje wolniejszy kod niż -O2lub -Os. Czasami produkuje dłuższy kod z powodu rozwijania pętli, co może być w rzeczywistości wolniejsze z powodu gorszej wydajności pamięci podręcznej kodu.
  2. Jak powiedziano, czasami produkuje zły kod. Może to być spowodowane błędem w optymalizacji lub błędem w kodzie (np. Ignorowanie ścisłego aliasingu). Ponieważ kod jądra czasami jest, a czasem musi być „inteligentny”, powiedziałbym, że możliwe jest, że jakiś programista jądra popełnił błąd. Doświadczyłem różnych dziwnych problemów, takich jak zawieszanie się narzędzi przestrzeni użytkownika, kiedy skompilowałem jądro z gcc 4.5, które w tym momencie było stabilne. Nadal używam gcc 4.4 dla jądra i kilku wybranych narzędzi przestrzeni użytkownika z powodu różnych błędów. To samo może dotyczyć -O3.
  3. Nie sądzę, że oferuje wiele korzyści dla jądra Linuksa. Jądro nie wykonuje ciężkich obliczeń, aw niektórych miejscach jest zoptymalizowane pod kątem montażu. -O3Flaga nie zmieni kosztu przełączania kontekstu ani szybkości I / O. Nie sądzę, aby coś takiego jak przyspieszenie ogólnej wydajności o <0,1% było tego warte.

6
Linux jest kompilowany z opcją -fno-strict-aliasing, ponieważ Linus uważa, że ​​gcc jest głupie i nadmiernie restrykcyjne, ponieważ robi takie głupie rzeczy, jak traktowanie wartości jako różnych, chociaż rażąco oczywiście nie są (tj. Aliasing został wprowadzony w ramach jednej funkcji, a kompilator może Zobacz to). patrz mail-archive.com/linux-btrfs@vger.kernel.org/msg01647.html
Spudd86

@ Spudd86: Czy miał na myśli, że oczywiście nie są przeznaczone dla ludzi czytających kod lub dla kompilatora? Jak powiedziałem - jądro czasami musi robić inteligentne rzeczy, których nie powinny robić programy przestrzeni użytkownika. To, co ma sens dla przestrzeni użytkownika (ciężka optymalizacja w niektórych obszarach), może nie mieć sensu dla jądra (większa ilość inteligentnego kodu + wąskie gardło w różnych miejscach).
Maciej Piechotka

1
Nie to, co powiedział, dotyczy również przestrzeni użytkownika.
Spudd86,

1
@ Spudd86: Nie zgadzam się z tym. Uczynienie kompilatora „wystarczająco inteligentnym”, aby dostrzegać takie „oczywiste” rzeczy, nie jest trywialne. Zatem jedynym możliwym sposobem jest: a) generowanie tylko wolniejszego (er) kodu (co jest niedopuszczalne w niektórych przypadkach użycia, powiedzmy, HPC) i / lub zmuszanie programistów do ręcznej optymalizacji kodu b) zaostrzenie reguł, aby umożliwić „głupszy” kompilator do optymalizacji - trasa obrana przez standard C.
Maciej Piechotka

6

Zauważ, że duże fragmenty łańcucha narzędzi (w szczególności glibc) nie kompilują się, jeśli zmienisz poziomy optymalizacji. System kompilacji jest skonfigurowany tak, aby ignorować preferencje -O dla tych sekcji w większości rozsądnych dystrybucji.

Krótko mówiąc, niektóre podstawowe funkcje biblioteki i systemu operacyjnego zależą od tego, czy kod faktycznie robi to, co mówi, a nie co w wielu przypadkach byłoby szybsze. W szczególności -fgcse-after-reload (włączony przez -O3) może powodować dziwne problemy.


5

W ciągu ostatnich 10 lat korzystałem z wielu systemów Gentoo z ponad 1000 pakietów na -O3 -march=nativecałym świecie i nie spotkałem się z żadnym z tych mitycznych problemów ze stabilnością, które -O3powinny mieć. Testy porównawcze aplikacji intensywnie wykorzystujących procesor (takich jak aplikacje matematyczne / naukowe) konsekwentnie pokazują -O3szybsze tworzenie kodu, w końcu nie miałoby sensu, gdyby tak nie było. W większości aplikacji komputerowych i CFLAGStak nie ma to większego znaczenia, ponieważ są one związane z IO, ale ma to duże znaczenie dla rzeczy po stronie serwera, które są związane z procesorem.


3

-O3 stosuje pewne agresywne optymalizacje, które są bezpieczne tylko wtedy, gdy pewne założenia dotyczące użycia rejestru, sposobu interakcji ramek stosu i ponownego wprowadzenia funkcji są prawdziwe, a te założenia nie są gwarantowane w niektórych kodach, takich jak jądro, szczególnie gdy zestaw wbudowany jest używane (tak jak w niektórych bardzo niskim poziomie części jądra i jego modułów sterownika).


Nie wspominając już o tym, że nie zawsze jest to szybsze, musisz właściwie wymyślić testy porównawcze i przetestować je, -O2aby poznać pogodę, czy nie boli lub nie pomaga
Spudd86,

0

Podczas gdy można uniknąć używania opcji -O3 i innych pokręteł optymalizacji w większości aplikacji (i może to spowodować poprawę prędkości), wahałbym się użyć takich poprawek samego jądra lub łańcucha narzędzi wymaganych do jego zbudowania (kompilator, binutils, itp.).

Pomyśl o tym: czy wzrost wydajności podsystemów RAID i ext3 o 5% jest warty awarii systemu lub potencjalnej utraty danych i / lub uszkodzenia?

Ulepsz wszystkie pokrętła, które chcesz dla tego odtwarzanego portu Quake lub kodeków audio / wideo używanych do zgrywania kolekcji DVD do plików divx. Prawdopodobnie zauważysz poprawę. Po prostu nie zadzieraj z jądrem, chyba że masz czas do stracenia i dane, które możesz znieść, aby je stracić.


3
Nie pytam, czy warto, czy nie, jest bezpieczny czy nie, albo dlaczego nie powinniśmy tego robić, pytam o to, czy to naprawdę powoduje błędy w prawdziwej aplikacji ?, czy to się kiedykolwiek zdarzyło ?, czy to udowodniło ...
uray
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.