Z powodu zadania szkolnego muszę przekonwertować kod C++ do złożenia (ARMv8). Następnie muszę skompilować kod C++ przy użyciu optymalizacji GCC-O0, -O1, -O2, -O3 i -Os, zapisać czas i porównać z czasem wykonania mojego kodu zespołu. Jak sądzę, wiem, że -O3 musi być szybszy niż -O1 i -O2. Jednak dostaję, że -O2 jest najszybszy, to są -O1, -O3, -Os, -O0. Czy to zwykle? (Obliczone czasy to około 30 sekund).Zoptymalizowany czas wykonania
Odpowiedz
Tak, to zwykle. Wybierz optymalizację -Ox jako linie pomocnicze. Średnio produkują optymalizację, która jest reklamą, ale wiele zależy od stylu, w jakim napisany jest kod, układu pamięci, a także od samego kompilatora. Czasami trzeba spróbować wielokrotnie zawodzić przed uzyskaniem optymalnego kodu. -O2 rzeczywiście daje najlepszą optymalizację w większości przypadków.
Dzięki! Udało mi się przekazać tylko -O0, gdzie mój kod montażowy działa w 57s i -O1-3 w około 33s. Czy to jest dobre? – Monstermania
Tak, to jest dobre, a do dalszej optymalizacji, prawdopodobnie trzeba poświęcić dużo czasu i wysiłku. Kod C++ jest zwykle trudniejszy do zoptymalizowania w porównaniu z kodem C. Jeśli możesz, możesz spróbować grać z optymalizacją pamięci, zmieniając rozmiar stosu i sterty. Czasami pomaga. – VladP
Należy zauważyć, że GCC ma wiele innychoptimization flags.
Nie ma gwarancji, że -O3
daje szybszy kod niż -O2
; kompilator może zastosować więcej przebiegów optymalizacji, ale wszystkie są heurystykami i mogą się nie udać (lub nawet spowolnić nieco twój konkretny kod). W związku z tym zdarza się, że kod -O3
podaje nieco wolniejszy kod niż -O2
(dla określonego kodu wejściowego , konkretnie).
Możesz wypróbować nowszą wersję GCC (najnowszy - w listopadzie 2017 - jest GCC 7, GCC 8 zgaśnie za kilka miesięcy). Możesz także wypróbować opcję better-march=
lub -mtune=
.
W końcu, z GCC plugin, można dodać swój własnyoptymalizacji przepustkę, albo zmienić kolejność (i set) zastosowanego optymalizacji przechodzi (istnieje kilkaset inny optymalizacja przechodzi w GCC). Ale będziesz potrzebował dużo pracy (być może rok lub dwa), aby móc rozbudować GCC.
Można dostroić parametry optymalizacji, a niektóre projekty (MILEPOST) wykorzystały nawet techniki uczenia maszynowego do ich ulepszenia.
Zobacz także slajdy i referencje na moim (starym) GCC MELT documentation.
Możliwy duplikat [GCC: Różnica między -O3 a -Os] (https://stackoverflow.com/questions/19689014/gcc-difference-between-o3-and-os) – Bilkokuya
Powinienem dodać, że podczas gdy pytanie Oznaczyłem, że nie pytam konkretnie o -O2, odpowiedź jest tam odebrana. – Bilkokuya
Tytuł pytania odnosi się do czasu kompilacji, ale tekst pytania wydaje się bardziej martwić o czas wykonania, co nie jest tym samym. – lurker