2017-11-22 155 views
7

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

+2

Możliwy duplikat [GCC: Różnica między -O3 a -Os] (https://stackoverflow.com/questions/19689014/gcc-difference-between-o3-and-os) – Bilkokuya

+0

Powinienem dodać, że podczas gdy pytanie Oznaczyłem, że nie pytam konkretnie o -O2, odpowiedź jest tam odebrana. – Bilkokuya

+2

Tytuł pytania odnosi się do czasu kompilacji, ale tekst pytania wydaje się bardziej martwić o czas wykonania, co nie jest tym samym. – lurker

Odpowiedz

1

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.

+0

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

+0

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

2

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.