POZNAŃ SUPERCOMPUTING AND NETWORKING. Zwiększanie efektywności programów optymalizacja pamięci część 1



Podobne dokumenty
POZNA SUPERCOMPUTING AND NETWORKING. Zwikszanie efektywnoci programów optymalizacja pamici cz2

Metody Kompilacji Wykład 1 Wstęp

Optymalizacja oprogramowania - wprowadzenie

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Zarządzanie pamięcią operacyjną

Wydajność systemów a organizacja pamięci, czyli dlaczego jednak nie jest aż tak źle. Krzysztof Banaś, Obliczenia wysokiej wydajności.

System pamięci. Pamięć wirtualna

Matematyczne Podstawy Informatyki

Systemy wbudowane. Uproszczone metody kosyntezy. Wykład 11: Metody kosyntezy systemów wbudowanych

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

ZASADY PROGRAMOWANIA KOMPUTERÓW

Architektura komputerów

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Architektura potokowa RISC

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Pamięć. Jan Tuziemski Źródło części materiałów: os-book.com

Materiały pomocnicze do laboratorium. 1. Miary oceny efektywności 2. Mnożenie macierzy 3. Znajdowanie liczb pierwszych

ANALIZA EFEKTYWNOŚCI MNOŻENIA MACIERZY W SYSTEMACH Z PAMIĘCIĄ WSPÓŁDZIELONĄ

Translacja wprowadzenie

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Sortowanie. Bartman Jacek Algorytmy i struktury

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Przetwarzanie potokowe pipelining

System pamięci. Pamięć wirtualna

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Zapisywanie algorytmów w języku programowania

Zarządzanie pamięcią operacyjną

Stronicowanie w systemie pamięci wirtualnej

PRZYDZIAŁ PAMIĘCI OPERACYJNEJ

10/14/2013 Przetwarzanie równoległe - wstęp 1. Zakres przedmiotu

Literatura. 11/16/2016 Przetwarzanie równoległe - wstęp 1

EFEKTYWNOŚĆ MNOŻENIA MACIERZY W SYSTEMACH Z PAMIĘCIĄ WSPÓŁDZIELONĄ

Modelowanie procesów współbieżnych

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

Podstawy programowania.

Pamięć wirtualna. Przygotował: Ryszard Kijaka. Wykład 4

Programowanie i techniki algorytmiczne

SYSTEMY OPERACYJNE WYKLAD 4 - zarządzanie pamięcią

Wydajność programów sekwencyjnych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

dr inż. Jarosław Forenc

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

Skalowalność obliczeń równoległych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

Wykład z Technologii Informacyjnych. Piotr Mika

System pamięci. Pamięć wirtualna

Procesor ma architekturę rejestrową L/S. Wskaż rozkazy spoza listy tego procesora. bgt Rx, Ry, offset nand Rx, Ry, A add Rx, #1, Rz store Rx, [Rz]

Algorytmy sortujące i wyszukujące

Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010

Algorytmy dla maszyny PRAM

Architektura komputerów, Informatyka, sem.iii. Rozwiązywanie konfliktów danych i sterowania w architekturze potokowej

Energooszczędne programowanie

Projektowanie. Projektowanie mikroprocesorów

Wstęp do informatyki. Maszyna RAM. Schemat logiczny komputera. Maszyna RAM. RAM: szczegóły. Realizacja algorytmu przez komputer

Algorytmy Równoległe i Rozproszone Część V - Model PRAM II

Podstawy Programowania C++

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

Architektura komputerów

Optymalizacja skalarna. Piotr Bała. Wykład wygłoszony w ICM w czercu 2000

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Według raportu ISO z 1988 roku algorytm JPEG składa się z następujących kroków: 0.5, = V i, j. /Q i, j

Programowanie współbieżne Wykład 2. Iwona Kochańska

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium Nr 4

ECDL Podstawy programowania Sylabus - wersja 1.0

Księgarnia PWN: Włodzimierz Stanisławski, Damian Raczyński - Programowanie systemowe mikroprocesorów rodziny x86

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Reprezentacje grafów nieskierowanych Reprezentacje grafów skierowanych. Wykład 2. Reprezentacja komputerowa grafów

TEORETYCZNE PODSTAWY INFORMATYKI

Programowanie komputerów

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

Sortowanie - wybrane algorytmy

Zrównoleglenie i przetwarzanie potokowe

1. Liczby i w zapisie zmiennoprzecinkowym przedstawia się następująco

wagi cyfry pozycje

Temat 20. Techniki algorytmiczne

architektura komputerów w. 8 Zarządzanie pamięcią

Metody optymalizacji soft-procesorów NIOS

UTK ARCHITEKTURA PROCESORÓW 80386/ Budowa procesora Struktura wewnętrzna logiczna procesora 80386

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Zofia Kruczkiewicz, Algorytmu i struktury danych, Wykład 14, 1

Systemy operacyjne III

KONSTRUKCJA KOMPILATORÓW

Kompresja danych Streszczenie Studia Dzienne Wykład 10,

Wydajność obliczeń a architektura procesorów. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

Programowanie w języku Python. Grażyna Koba

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

MATERIAŁY POMOCNICZE DO LABORATORIUM Z PRZETWARZANIA RÓWNOLEGŁEGO KWIECIEŃ 2018

Sortowanie zewnętrzne

Programowanie Współbieżne. Algorytmy

Algorytmy równoległe: prezentacja i ocena efektywności prostych algorytmów dla systemów równoległych

KARTA KURSU. Wstęp do programowania

Adam Korzeniewski p Katedra Systemów Multimedialnych

Zarządzanie pamięcią. Od programu źródłowego do procesu. Dołączanie dynamiczne. Powiązanie programu z adresami w pamięci

Transkrypt:

Zwiększanie efektywności programów optymalizacja pamięci część 1

literatura podstawowa [Aho2002] Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman, Kompilatory. Reguły, metody i narzędzia, WNT 2002 (tłum. pierwszego wydania amerykańskiego, 1986). [Aho2001] A.V. Aho, R. Sethi, J.D. Ullman, Compilers: Principles, Techniques, and Tools, Pearson Education 2001. 2

literatura uzupełniająca [Bentley2008] Jon Bentley, Perełki oprogramowania, wyd. trzecie, WNT, 2008 (tłum. drugiego wydania amerykańskiego, Pearson Education 2000). [Bentley2007] Jon Bentley, Więcej perełek oprogramowania. Wyznania programisty, WNT 2007 (tłum. pierwszego wydania amerykańskiego, Pearson Education 1988). 3

literatura uzupełniająca [Kernigham2002] Brian W. Kernigham, Rob Pike, Lekcja programowania, WNT 2002, (tłum. pierwszego wydania amerykańskiego, Pearson Education 1999). [Oram2008] Andy Oram, Greg Wilson (red.), Piękny kod. Tajemnice mistrzów programowania, Helion 2008, (tłum. wydania amerykańskiego, O Reilly Media Inc. 2007). 4

literatura uzupełniająca [Barr2005] Adam Barr, Znajdź błąd. Sztuka analizowania kodu, Helion 2005 (tłum. wydania amerykańskiego, Pearson Education 2005). 5

literatura uzupełniająca [Cooper2004] Keith D. Cooper, Linda Torczon, Engineering a Compiler, Morgan Kaufmann Publishers, San Francisco, 2004. [Goedecker2001] Stefan Goedecker, Adolfy Hoisie, Performance Optimization of Numerically Intensive Codes, Society for Industrial and Applied Mathematics, Philadelphia 2001. 6

literatura uzupełniająca [Kaspersky2003], Kris Kaspersky, Code Optimization: Effective Memory Usage, A-LIST, LLC, 2003. [Muchnik1997] Steven S. Muchnick, Advanced Compiler Design and Implementation, Morgan Kaufmann Publishers, San Francisco, 1997. 7

literatura uzupełniająca [Allen2002] Randy Allen, Ken Kennedy, Optimizing Compilers for Modern Architectures, Morgan Kaufmann Publishers, San Francisco, 2002. [Falk2004] Heiko Falk, Peter Marwedel, Source Code Optimization Techniques for Data Flow Dominated Embedded Software, Kluwer Academic Publishers, Boston 2004. 8

literatura uzupełniająca [Wolfe1995] Michael Wolfe, High- Performance Compilers for Parallel Computing, Addison Wesley, 1995. 9

plan optymalizacja hierarchii pamięci [Muchnick1997] rozdz. 20 [Allen2002] rozdz. 9 optymalizacja dostępu do pamięci [Goedecker2001] rozdz. 6, [Kaspersky2003] rozdz. 3 10

plan optymalizacja operacji na pamięci [Kaspersky2003] rozdz. 2 alokacja rejestrów [Cooper2004] rozdz. 13 ograniczenie wykorzystywanej pamięci [Bentley2008] rozdz. 10 [Kernigham2002] rozdz. 7 11

optymalizacja hierarchii pamięci rozważamy tutaj techniki optymalizacji kodu, wykorzystujące hierarchię pamięci, w szczególności: pamięci notatnikowe danych i rozkazów przydział rejestrów do elementów tablic 12

optymalizacja hierarchii pamięci od lat systemy posiadały pamięć główną i rejestry pamięć jest duża i wolna, a rejestry są małe i szybkie z czasem, różnica między cyklem procesora a czasem dostępu do pamięci wzrastała (wzrost szybkości procesora 50% rocznie, pamięci 20% rocznie) 13

optymalizacja hierarchii pamięci aby zapobiec pogarszaniu się wydajności, wprowadzono pamięć notatnikową (cache) między pamięć główną a rejestry, redukując niedopasowanie szybkości pamięć notatnikowa powiela wybrane fragmenty pamięci głównej, zwykle na życzenie sprzętu albo oprogramowania 14

optymalizacja hierarchii pamięci odczyt, zapis albo pobranie instrukcji skierowane do adresu reprezentowanego w pamięci notatnikowej jest spełniany zazwyczaj przez pamięć notatnikową, a nie przez pamięć główną efektywność pamięci notatnikowej zależy od cech przestrzennej i czasowej lokalizacji w programie 15

optymalizacja hierarchii pamięci jeżeli program wykonuje pętlę, wtedy pierwsza iteracja umieszcza jej kod w pamięci notatnikowej, a kolejne iteracje wykonują go z pamięci notatnikowej, zamiast ładować go z pamięci głównej 16

optymalizacja hierarchii pamięci podobnie, jeżeli blok danych jest wykorzystywany powtarzalnie, najlepiej jak jest umieści się go w pamięci notatnikowej i tam właśnie jest dostępny wtedy dane są pobierane z pamięci głównej tylko raz 17

optymalizacja hierarchii pamięci z drugiej strony, jeżeli kod i dane interferują w pamięci notatnikowej, czyli zajmują tam te same miejsca, albo gdy dane interferują ze sobą, w ten sposób że ich porcje są odwzorowane na te same bloki w pamięci notatnikowej, to wtedy wydajność znacznie spada 18

optymalizacja hierarchii pamięci w najgorszym razie, pamięć notatnikowa nic nie przyspiesza, czyli odczyt, zapis i pobieranie instrukcji nie są szybsze niż w przypadku pamięci głównej system może mieć oddzielne pamięci notatnikowe instrukcji i danych, może też mieć wspólną pamięć notatnikową dla instrukcji i danych 19

optymalizacja hierarchii pamięci system ze stronicowaniem ma inny typ pamięci notatnikowej TLB (translationlookaside buffer), do przechowywania informacji o translacji adresów wirtualnych w fizyczne, i odwrotnie 20

wpływ pamięci notatnikowej na przykład optymalizację jak efektywność wykonania programu zmienia się z odstępami między indeksami, z jaką następuje dostęp do tablicy gdy odległości są większe niż 32, efektywność maleje 21

wpływ pamięci notatnikowej na optymalizację 4 wersje mnożenia macierzy w j. Fortran MM: klasyczne (potrójnie zagnieżdżona pętla do mnożenia A przez B) MMT: z transpozycją macierzy A w pamięci MMB: z podziałem pętli na bloki MMBT: z transpozycją macierzy A i podziałem pętli na bloki 22

mnożenie macierzy [Muchnick1997] 23

wpływ pamięci notatnikowej na optymalizację efektywność klasycznej wersji jest zależna od rozmiaru macierzy i jej organizacji, i różni się nawet o współczynnik 14 efektywność pozostałych wersji jest bliska maksymalnej i jest stabilna 24

optymalizacja pamięci notatnikowej instrukcji cel: zwiększenie ilości trafień 2 podejścia interproceduralne 1 podejście intraproceduralne 3 podejścia i takie i takie 25

optymalizacja pamięci notatnikowej instrukcji pobieranie instrukcji wsparte sprzętowo pobieranie sekwencyjne albo z wybranej ścieżki pobieranie instrukcji wsparte programowo pobieranie do pamięci notatnikowej instrukcji znajdujących się w bloku o podanym adresie: iprefetch address 26

optymalizacja pamięci notatnikowej instrukcji pobieranie instrukcji wsparte programowo stosowane dla bloków kodu pobieranych pierwszy raz, albo dla bloków stosowanych powtarzalnie programowe wsparcie jedynie wtedy, gdy nie ma sprzętowego 27

sortowanie procedur najprostszym i najefektywniejszym zastosowaniem optymalizacji pamięci notatnikowej instrukcji jest sortowanie statycznie powiązanych procedur, zgodnie z relacjami ich wywołania i częstotliwością stosowania 28

sortowanie procedur celem jest: umieszczenie procedur blisko wywołań w pamięci wirtualnej, aby ograniczyć ruch stron umieszczenie często stosowanych i powiązanych procedur razem, aby zmniejszyć prawdopodobieństwo kolizji z innymi procedurami w pamięci notatnikowej 29

sortowanie procedur jeżeli jest dostępny wynik profilowania (dynamicznej analizy zachowania się programu), należy go uwzględnić jeżeli nie, należy posłużyć się heurystyką, która umieszcza procedury, które się często wywołują blisko siebie (wywołania w pętli powinny być ważniejsze od wywołań spoza pętli) 30

sortowanie procedur aby implementować tę ideę, posłużymy się nieskierowanym statycznym grafem wywołań, gdzie każda krawędź jest etykietowana liczbą razy, z jaką dwie procedury na obu jej końcach wywołują tę drugą procedurę 31

sortowanie procedur następnie scalamy graf w etapy, na każdym etapie wybierając krawędź o najwyższej wadze i łącząc węzły w jeden, scalając odpowiednie krawędzie i dodając wagi scalanych krawędzi 32

sortowanie procedur węzły, które zostały scalone, są umieszczone po sobie w końcowym uporządkowaniu procedur, z wagami połączeń w oryginalnym grafie stosowanymi do wyznaczenia ich wzajemnego porządku 33

sortowanie procedur algorytm ICAN tego procesu to procedura Proc_Position( ) ICAN - Informal Compiler Algorithm Notation rodzaj notacji (pseudokodu) do opisu algorytmów ICAN wywodzi się z C, Pascala, Moduli-2 plus naturalna notacja 34

sortowanie procedur [Muchnick1997] 35

sortowanie procedur funkcja Coalesce_Nodes(T,A,weight,psweight,p1,p2) scala węzły p1 i p2 w jeden węzeł a procedura Flatten(T) trawersuje drzewo binarne reprezentowane przez sekwencję T z lewej do prawej, i tworzy sekwencję liści (Flatten(T)nie jest tu wprost pokazana) 36

sortowanie procedur [Muchnick1997] 37

graf przepływu w sortowaniu procedur [Muchnick1997] 38

graf przepływu wpierw scalamy P2 i P4 do postaci [P2,P4] następnie scalamy P3 i P6 do postaci [P3,P6], potem P5 i [P2,P4], aby otrzymać [P5,[P2,P4]] ostateczny wynik to: [[P1,[P3,P6],[P5,[P2,P4]]],[P7,P8]] 39

umieszczenie procedury na krawędzi bloku wymaga modyfikacji konsolidatora, aby umieszczał każdą procedurę na krawędzi bloku w pamięci notatnikowej instrukcji pozwoli to w kolejnych fazach kompilacji pozycjonować często wykonywane segmenty kodu, takie jak pętle, aby zajmowały jak najmniejszą liczbę bloków pamięci notatnikowej 40

umieszczenie procedury na krawędzi bloku oraz pozwoli umieścić je blisko albo na krawędzi bloku, ułatwiając zmniejszenie braku trafień w pamięci notatnikowej i ułatwi pobieranie całych grup instrukcji przez superskalarny CPU w celu ich jednoczesnego wykonania w jednym cyklu zegara 41

umieszczenie procedury na krawędzi bloku gdy większość bloków jest krótka (4 albo 8 instrukcji), ułatwia to utrzymywanie początków bloków daleko od końca bloków pamięci notatnikowej kompilator może zbierać statystyki, a wyniki profilowania mogą być wykorzystane do oceny, czy umieszczanie procedury na krawędzi jest korzystne 42

intraproceduralne pozycjonowanie kodu podejście od dołu do góry Pettisa i Hansena z 1990 roku cel: przesunięcie rzadko wykonywanego kodu poza główną część kodu, oraz: wyrównanie kodu (usunięcie gałęzi niewarunkowych i umieszczenie jak najwięcej gałęzi warunkowych na ścieżce opadającej) 43

intraproceduralne pozycjonowanie kodu co powoduje, że większy fragment instrukcji pobieranych do pamięci notatnikowej jest faktycznie wykonywany odmiennie niż w sortowaniu procedur, ten proces jest przeprowadzany podczas kompilacji każdej procedury 44

intraproceduralne pozycjonowanie kodu aby to zrobić, zakłada się, że na krawędziach grafu przepływu procedury podane są częstotliwości ich wykonania, uzyskane przez profilowanie albo szacowanie 45

intraproceduralne pozycjonowanie kodu algorytm wykonuje przeszukiwanie wstępujące grafu przepływu, budując łańcuchy bloków podstawowych, które być powinny umieszczone jako kod wyrównany, ponieważ krawędzie są wykonywane często 46

algorytm pozycjonowania bloków bazowych początkowo, każdy blok bazowy jest sam łańcuchem następnie, w kolejnych krokach, dwa łańcuchy, których odpowiednio ogon i głowa są połączone krawędzią o najwyższej częstotliwości wykonań, są scalone 47

algorytm pozycjonowania bloków bazowych jeżeli najwyższa częstotliwość występuje na krawędzi, która nie łączy ogona łańcucha z głową innego łańcucha, łańcuchy nie mogą być scalone na koniec, dokonuje się umieszczenia bloku bazowego poprzez wybór łańcucha wejściowego i przetwarzanie innych łańcuchów zgodnie z wagą połączeń 48

algorytm pozycjonowania Block_Position(B,E,r,freq) B zbiór węzłów (bloków bazowych) E zbiór krawędzi r węzeł wejściowy freq odwzorowanie krawędzi na częstość wykonania 49

algorytm pozycjonowania[muchnick1997] 50

algorytm pozycjonowania 51

przykład pozycjonowania bloków bazowych rozważmy przykład [Muchnick1997] 52

przykład pozycjonowania bloków bazowych krawędź o największej częstości wykonania jest od B1 do B2, stąd [B1,B2] następna krawędź o największej częstości wykonania jest od B2 do B4, stąd sekwencja jest rozszerzona do [B1,B2,B4] podobnie dodaje się entry oraz B8 w kolejnych dwóch krokach, stąd mamy: [entry,b1,b2,b4,b8] 53

przykład pozycjonowania bloków bazowych 54

przykład pozycjonowania bloków bazowych następna krawędź o największej częstości wykonania jest od B9 do exit, stąd [B9,exit] w kolejnych krokach [B9,exit] jest rozszerzona do [B6,B9,exit] dwie nowe sekwencje są utworzone [B3,B7] i [B5] 55

przykład pozycjonowania bloków bazowych 56

przykład pozycjonowania bloków bazowych następnie obliczamy funkcję edges(), podającą liczbę krawędzi do innych sekwencji: edges([entry,b1,b2,b4,b8])=2 edges([b3,b7])=1 edges([b5])=1 edges([b6,b9,exit])=0 57

przykład pozycjonowania bloków bazowych następnie porządkujemy sekwencje tak, że ta z entry jest pierwsza, potem są sekwencje zgodnie z porządkiem określonym funkcją edges() na koniec, poprawiamy kod dodając i usuwając gałęzie, aby graf przepływu był równoważny co do efektu z grafem oryginalnym 58

wynik intraproceduralnego pozycjonowania kodu [Muchnick1997] 59

podział procedury zwiększa efektywność algorytmów sortowania procedur i intraproceduralnego pozycjonowania kodu każda procedura jest dzielona na składnik pierwotny i wtórny pierwotny: zawiera często wykonywane bloki bazowe wtórny: rzadko wykonywane bloki bazowe 60

podział procedury to powoduje, że składniki pierwotne są umieszczane blisko siebie w jednej sekcji, podobnie jak wtórne podział procedury wymaga dopasowania granic między składnikami obszary oznaczone p i s oznaczają kod pierwotny i kod wtórny 61

podział procedury [Muchnick1997] 62

kombinacja procedur intra- i interproceduralnych zmiana kolejności instrukcji w pamięci i rezygnacja z umieszczania pewnych instrukcji w pamięci notatnikowej, doktorat Scotta McFarlinga, Stanford Univ. 1991 analiza, czy warto wstawiać procedurę (w miejsce jej wywołania) McFarling procedure inlining 63

zastąpienie elementów macierzy skalarami jeżeli zastąpimy dostępy do C(i,j) przez zmienną ct, a ct jest przydzielona do rejestru, zmniejszamy liczbę dostępów do pamięci do 2(N 3 N 2) czyli blisko 2 razy skalar zamiast C(i,j) (czasowo) 64

mnożenie macierzy [Muchnick1997] 65

przykład: rekurencja HIR użycie dwóch zmiennych tymczasowych, t0 i t1 zmniejsza dostępy do pamięci o 40% HIR: High-Level Intermediate Representation 66

przykład: rekurencja HIR [Muchnick1997] 67

zastąpienie przez skalar zastępowanie zmiennych z indeksami przez skalary, co pozwala przydzielać je do rejestrów, nazywa się zastępowaniem przez skalar (scalar replacement) albo potokowym przetwarzaniem rejestrów (register pipelining) 68

zastąpienie przez skalar pokażmy tę metodę w przypadku zagnieżdżeń pętli, nie zawierającej warunków aby ją zastosować, potrzebujemy stałej liczby iteracji pętli pomiędzy odwołaniami do zmiennych indeksowanych 69

zastąpienie przez skalar możemy też ułatwić zastąpienie przez skalar poprzez zamianę pętli i fuzję pętli 70

zamiana pętli [Muchnick1997] 71

fuzja pętli [Muchnick1997] 72

zastąpienie przez skalar pętli z if stosujemy trzy tymczasowe zmienne: t2 zamiast a[i-2] t1 zamiast a[i-1] t0 zamiast a[i] 73

pętle z if [Muchnick1997] 74

kombinacje zastąpień skalarami wpierw zastąpienie skalarami wartości x[i] potem rozwinięcie pętli wewnętrznej (przez współczynnik 3, arbitralny) następnie zastąpienie skalarami wartości y[j] 75

zastąpienie skalarami x[i] [Muchnick1997] 76

rozwinięcie pętli wewnętrznej [Muchnick1997] 77

zastąpienie skalarami y[j] [Muchnick1997] 78

optymalizacja pamięci notatnikowej danych zajmiemy się teraz optymalizacją wykorzystania pamięci notatnikowej do kodu numerycznego (inaczej naukowego) przez kod numeryczny rozumiemy program, zwykle w Fortranie, który operuje na dużych tablicach danych, zazwyczaj na wartościach zmiennoprzecinkowych 79

optymalizacja pamięci notatnikowej danych wiele z tych programów stosuje wzorce wykorzystania danych o regularnej strukturze, które dają możliwość ponownego wykorzystania danych zanim zostaną usunięte z pamięci notatnikowej 80

optymalizacja pamięci notatnikowej danych dysponujemy globalnym układem danych, który zakłada, że mamy dostępny cały program do analizy i transformacji, stąd informacja zebrana przez wszystkie części programu może być wykorzystana przez kompilator do ułożenia wszystkich tablic tak, aby zminimalizować konflikty w pamięci notatnikowej danych 81

optymalizacja pamięci notatnikowej danych idea optymalizacji pamięci notatnikowej danych odnosi się do pojedynczych procedur, które eliminują opóźnienie wynikające z pobierania danych z pamięci do pamięci notatnikowej i zapamiętania w niej wyników z rejestrów 82

optymalizacja pamięci notatnikowej danych ten typ optymalizacji osiągnął najlepsze wyniki dla kodu numerycznego, któremu większość czasu zajmuje wykonywanie zagnieżdżonych pętli operujących na macierzach wartości numerycznych 83

optymalizacja pamięci notatnikowej danych optymalizacje wpierw wyjaśniają wzorce ponownego używania danych w pętlach, a następnie transformują je do postaci wykazującej lokalność odniesienia to znaczy stosują te same lokalizacje danych, albo bloki pamięci notatnikowej są tak blisko w czasie, że wykonują się bez konieczności usuwania danych z pamięci notatnikowej 84

optymalizacja pamięci notatnikowej danych główną techniką do określenia wzorców ponownego używania danych w pętlach jest analiza zależności, opisywana oddzielnie oraz transformacja zagnieżdżeń pętli, jako podejście do zbliżenia wykorzystania danych w czasie (transformacje te nie powinny zmieniać wyników obliczeń!) 85

transformacje zmieniające wynik obliczeń (0.0, 0.0, 1.0, n) 86

transformacje zmieniające wynik obliczeń pętle HIR sumują te same sekwencje wartości zmiennoprzecinkowych, ale dają odmienne wyniki: 0.0, 0.0, 1.0 i n HIR oznacza High-Level Intermediate Representation (sposób lub język reprezentacji) 87

optymalizacja pamięci notatnikowej danych istotna jest również technika wyprzedzającego pobierania danych, ukrywającego opóźnienie pobierania danych stosuje się też współdziałanie optymalizacji skalarnych i optymalizacji pamięci, optymalizację pamięci notatnikowej danych dla wskaźników, dynamiczne przydzielanie obiektów danych 88

optymalizacja pamięci notatnikowej danych przeprowadza się również integrację optymalizacji pamięci notatnikowej instrukcji (I-cache) i pamięci notatnikowej danych (D-cache) 89

wnioski w prezentacji skupiono się na optymalizacji hierarchii pamięci, w szczególności optymalizacji wykorzystania pamięci notatnikowej instrukcji i pamięci notatnikowej danych 90

wnioski pozostałe kwestie dotyczące optymalizacji dostępu do pamięci, operacji na pamięci, alokacji rejestrów i ograniczenia wykorzystywanej pamięci, są przedmiotem kolejnych spotkań 91