Optymalizacja Loop - Loop optimization
W teorii kompilatora , optymalizacji pętli jest sposób zwiększania prędkości wykonania i zmniejszenie kosztów ogólnych związanych z pętli . Odgrywa ważną rolę w poprawie pamięci podręcznej wydajność i efektywne wykorzystanie przetwarzania równoległego możliwościami. Większość czasu wykonanie programu naukowego wydaje się na pętli; jako takie, wiele optymalizacji kompilator techniki zostały opracowane, aby uczynić je szybciej.
Zawartość
Reprezentacja obliczeń i przekształceń
Ponieważ instrukcje wewnątrz pętli może być wykonywany wielokrotnie, że często nie jest to możliwe, aby dać granicy liczby egzekucji instrukcji, która zostanie uderzony przez optymalizację pętli. Stwarza to problemy, gdy rozumowanie o prawidłowości i korzyści z optymalizacji pętli, specjalnie reprezentacje obliczeń są zoptymalizowane i optymalizacja (s) są wykonywane.
Optymalizacja w sekwencji przekształceń pętli
Optymalizacji pętli można się stosowanie sekwencji specyficznych przemian pętli (podanych poniżej lub w transformacji kompilator komputerowych wysokiej wydajności ) w kodzie źródłowym lub reprezentacji pośredniej , z których każda transformacji mającego skojarzony test legalności. Transformacja (lub sekwencja przemian) zazwyczaj muszą zachować sekwencję czasową wszystkich zależności , czy jest, aby zachować wynik programu (czyli być przekształcenie prawne). Oceny korzyści z przekształcenia lub sekwencji przemian może być dość trudne w tym podejściu, jak stosowanie jednej korzystnej transformacji może wymagać uprzedniego korzystania z jednej lub większej liczby innych przekształceń, które same w sobie, spowodowałaby spadek wydajności.
Wspólne transformacje pętla obejmują:
- Rozszczepienie lub dystrybucji - pętla rozszczepienie próby włamania pętlę na wiele pętli w tym samym zakresie indeksów, ale każda nowa pętla zajmuje tylko część ciała pierwotnego Loop. Może to poprawić lokalizację odniesienia , zarówno dane są dostępne w pętli i kod w ciele pętli jest.
- Fuzja lub połączenie - to łączy ciał dwóch sąsiednich pętli, która iteracyjne taką samą liczbę razy (czy ta liczba jest znany w czasie kompilacji), dopóki nie odnoszą się do danych nawzajem.
- Wymiana lub permutacji - te optymalizacji wymiany pętli wewnętrznej w pętli zewnętrznej. Gdy indeks zmienne pętlowe do tablicy, taka transformacja może poprawić lokalizację odniesienia, w zależności od układu w tablicy.
- Inversion - technika ta zmienia standard natomiast pętla na DO / czas (aka powtarzać / aż ) pętla opakowany w razie warunkowego, zmniejszając liczbę skoków przez dwa przypadki, w których pętla jest wykonywana. Czyniąc to powiela sprawdzić stan (zwiększenie rozmiaru kodu), ale jest bardziej efektywne, ponieważ skoki zwykle powodują stoisko rurociągu . Ponadto, jeśli początkowe warunki są znane w czasie kompilacji i wiadomo, że działania uboczne -bezpłatne początkowa czy -guard może zostać pominięty.
- Pętli niezmienna kod ruchu - można znacznie poprawić efektywność przenoszenia obliczenia od wewnątrz pętli na zewnątrz niej, obliczanie wartości tylko raz przed rozpoczęciem pętli, jeśli otrzymaną ilość obliczeń będzie taki sam dla każdej iteracji pętli ( czyli ilość pętli niezmienna). Jest to szczególnie ważne przy obliczaniu wyrażeń adres generowanych przez pętle ponad tablic. Dla prawidłowego wykonania, technika ta musi być używany z inwersją, gdyż nie cały kod jest bezpieczny zostać przesunięte poza pętli.
- Zrównoleglanie - jest to szczególny przypadek automatyczny zrównoleglanie koncentrując się na pętli, ich restrukturyzacji, aby skutecznie działać na systemach wieloprocesorowych. Może to być wykonywane automatycznie przez kompilatorów ( automatyczne równoległości ) lub ręcznie (wstawienie wskazówki równoległe jak OpenMP ).
- Rozwiązanie - subtelna optymalizacji że odwraca porządek, w którym wartości są przypisane do zmiennej wskaźnika. To może pomóc wyeliminować zależności , a tym samym umożliwić inne optymalizacje. Niektóre konstrukcje architektury wykorzystanie pętli w montażu poziomu, który liczy się w jednym kierunku (na przykład, ubytek-skoku, gdy nie-zerowej [DJNZ)].
- Szeregowania - ten dzieli się pętlę na wiele części, które mogą być prowadzone jednocześnie na wiele procesorów.
- Pochylanie - metoda ta jest stosowana do zagnieżdżonej pętli kolejno po wielowymiarowej tablicy, gdzie każdy iteracji pętli wewnętrznej zależy od poprzedniej iteracji, i przestawia tablicę jego dostępu tak, że tylko zależności są między iteracji pętli zewnętrznej.
- Rurociąg oprogramowanie - rodzaj wykonania out-of-order iteracji pętli ukryć opóźnienia jednostek funkcyjnych procesora.
- Dzielenie lub łuszczenie - Próbuje uprościć lub wyeliminować pętli zależności dzieląc ją na wiele pętli, które mają te same korpusy ale iteracyjnego różnych części zakres indeksu. Szczególnym przypadkiem jest złuszczanie pętla , co może uprościć pętlę problematyczny pierwszej iteracji, wykonując tę iterację oddzielnie przed wprowadzeniem do pętli.
- Okładziny lub blokowanie - reorganizuje pętli iteracyjne nad blokami danych o rozmiarze pasującym w pamięci podręcznej.
- Wektoryzacja - próbuje uruchomić jak wiele iteracji pętli, jak to możliwe w tym samym czasie na SIMD systemu.
- Rozwijając - duplikuje ciało pętli wiele razy, aby zmniejszyć liczbę razy warunek pętli jest testowane i liczby skoków, które może pogorszyć osiągi krępując rurociągu instrukcji. Całkowicie rozwijanie pętli eliminuje wszystkie narzut (z wyjątkiem wielokrotnego instrukcja pobiera i zwiększył czas ładowania programu), ale wymaga, aby liczba iteracji być znany w czasie kompilacji (z wyjątkiem przypadku JIT ). Należy również zadbać o zapewnienie, że wielokrotne ponowne obliczanie zmiennych indeksowanych nie jest większa niż górny wskaźniki postępu w pierwotnym pętli.
- Unswitching - porusza warunkowe od wewnątrz pętli na zewnątrz niej przez powielenie ciało pętli, a umieszczenie go wewnątrz wersję każdym razie i jeszcze klauzule warunkowego.
- Przeprowadzono podział na odcinki lub taśmy górnictwo - wprowadzone na procesorach wektorowych , pętlicowym cięcia jest techniką pętli przetwarzania dla umożliwienia SIMD (pojedynczej instrukcji, wiele danych) -encodings pętli i poprawy wydajności pamięci. Wiąże się to każda operacja wykonywana przez wektor wielkości mniejszej niż albo równej do maksymalnej długości wektora w danej maszynie wektora.
Unimodular ramy transformacja
Podejście unimodular transformacji wykorzystuje pojedynczy unimodular matrycę do opisania łącznego wyniku sekwencji z wielu powyższych przekształceń. Kluczowe znaczenie dla tego podejścia jest to, że widok na zbiorze wszystkich egzekucji oświadczenie w n pętli jako zbiór liczb całkowitych punktów w n -wymiarowej przestrzeni, z punktami wykonywane w porządku leksykograficznym . Na przykład Wykonania oświadczenia zagnieżdżona w zewnętrznej pętli ze wskaźnikiem ı i wewnętrzną pętlę o indeksie j może być związany z pary liczb całkowitych . Stosowanie unimodular przemiany odpowiada iloczynowi punktach wewnątrz tej przestrzeni przez matrycę. Na przykład, węzeł z dwóch pętli odpowiada matrycy .
Unimodular transformacja jest legalne, jeśli zachowuje sekwencja czasowa wszystkich zależnościach ; pomiaru wpływu wydajności na unimodular transformacji jest trudniejsze. Niedoskonale zagnieżdżone pętle i niektóre transformacje (takie jak glazura) nie łatwo zmieścić się w te ramy.
Ramy wielościanów lub ograniczenia oparte
Wielościanów Model obsługuje szerszą klasę programów i przekształceń niż unimodular ram. Zestaw egzekucji zbiór sprawozdań w możliwie niedoskonale zagnieżdżony zestaw pętli jest postrzegana jako unii zestawu polytopes przedstawiających egzekucje sprawozdania. Afiniczne transformacje są stosowane do tych polytopes, produkujących opis nowego porządku wykonania. Granice polytopes, zależnościami danych, i przekształcenia są często określane za pomocą systemów ograniczeń, to podejście jest często określany jako opartych na ograniczeniach podejścia do optymalizacji pętli. Na przykład, pojedynczy rachunek w zewnętrznej pętli „ o i: = 0, n ” i wewnętrzna pętla „ dla j: = 0 i + 2 ” jest wykonywany raz na każdy (i, j), parę tak, że 0 <= i <= n i 0 <= j <= i + 2 .
Po raz kolejny, transformacja jest legalne, jeśli zachowuje czasową kolejność wszystkich zależności . Oszacowanie korzyści z transformacji, lub znalezienia najlepszego transformację dla danego kodu na danym komputerze, pozostają przedmiotem ciągłych badań jak w chwili pisania tego tekstu (2010).