2008-09-09 30 views
12

Ktoś wie o tej funkcji kompilatora? Wygląda na to, że GCC to popiera. Jak to działa? Jaki jest potencjalny zysk? W takim razie jest dobrze? Wewnętrzne pętle?optymalizacja profilowa (C)

(ta kwestia jest specyficzny, a nie o optymalizacji w ogóle, dzięki)

+1

http://stackoverflow.com/questions/4365980/how-to-use-profile-guided-optimizations-in-g opisuje jak z niego korzystać (flagi itp.) Potrzebne – rogerdpack

Odpowiedz

12

Działa poprzez umieszczenie dodatkowego kodu w celu policzenia liczby razy, kiedy pobierana jest każda ścieżka kodowa. Podczas kompilacji po raz drugi kompilator korzysta z wiedzy uzyskanej na temat wykonywania programu, który mógł jedynie odgadnąć wcześniej. Istnieje kilka rzeczy, które PGO może wykonać w celu:

  • Decydowanie, które funkcje powinny być wbudowane lub nie w zależności od tego, jak często są wywoływane.
  • Decydowanie o tym, jak umieszczać podpowiedzi na temat tego, która gałąź wyrażenia "jeśli" powinna być przewidywana na podstawie procentu połączeń w jedną lub drugą stronę.
  • Decydowanie o optymalizacji pętli w zależności od tego, ile iteracji zostanie pobranych za każdym razem, gdy zostanie wywołana pętla.

Nigdy nie wiadomo, jak bardzo te rzeczy mogą pomóc, dopóki go nie przetestujesz.

+1

dziękuję, to wydaje się interesujące. masz jakiś link do dokumentacji do udostępnienia? – elmarco

+0

Zapowiedź rozgałęzień, o której wspomniałeś, nie jest używana i jest całkowicie bezużyteczna, ponieważ przedrostki trafienia gałęzi są używane tylko w przypadku pierwszego napotkania gałęzi przez procesor. Prawdziwą korzyścią jest to, że GCC wie, w jaki sposób może najlepiej skomponować złożony kod w oparciu o prawdopodobieństwa przewidywania. –

+0

Na prośbę OP, byłoby wspaniale, gdybyś mógł rozszerzyć swoją odpowiedź o informacje na temat tego, jak można z niej skorzystać. (np. konkretne opcje itp.) –

2

Zabawa rzeczą jest to, że prędkość optymalizacji zyski można znaleźć w Najbardziej niesamowity miejscach.

Jest to również powód, dla którego potrzebujesz profilera, zamiast zgadywać, gdzie występują problemy z prędkością.

Polecam zacząć od profilera (gperf, jeśli używasz GCC) i po prostu zacznij grzebać w wynikach działania aplikacji przez niektóre normalne operacje.

4

Doradztwo Jason jest tuż. Najlepsze przyspieszenia, jakie otrzymasz, pochodzą z "odkrywania", że pozwalasz algorytmowi O (n) wcisnąć się gdzieś w wewnętrzną pętlę lub że możesz buforować pewne obliczenia poza kosztownymi funkcjami.

W porównaniu do mikro-optymalizacji, które może wywołać PGO, są to największe wygrane. Po wykonaniu tego poziomu optymalizacji PGO może pomóc. Nigdy jednak nie mieliśmy z tym szczęścia - koszt oprzyrządowania był taki, że nasza aplikacja stała się wyjątkowo wolno (o kilka rzędów wielkości).

Lubię używać Intel VTune jako profilera głównie dlatego, że jest on nieinwazyjny w porównaniu do profilerów narzędziowych, które zbytnio zmieniają zachowanie.

6

PGO daje około 5% zwiększenia prędkości podczas kompilacji x264, projektu, nad którym pracuję, i mamy wbudowany do niego system (make fprofiled). Jest to przyjemne zwiększenie prędkości w niektórych przypadkach i prawdopodobnie pomaga więcej w aplikacjach, które w przeciwieństwie do x264, są mniej złożone z odręcznego zestawu.