###### tags: `ASK`
# Raport do zadania opt-texture
### Autor: Piotr Stokłosa
Konfiguracja
---
Informacje o systemie:
* Dystrybucja: Ubuntu 18.04.1
* Jądro systemu: Linux 5.3.0
* Kompilator: gcc 7.5.0
* Procesor: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz (Coffee Lake)
* Liczba rdzeni: 6
Pamięć podręczna:
* L1d: 32 KiB, 8-drożny (per rdzeń), rozmiar linii 64B
* L2: 256 KiB, 4-drożny (per rdzeń), rozmiar linii 64B
* L3: 9 MiB , 12-drożny (współdzielony), rozmiar linii 64B
Pamięć TLB:
* L1d: 4 KiB strony, 4-drożny, 64 wpisy
* L2: 4 KiB + 2 MiB strony, 12-drożny, 1536 wpisów
Informacje o pamięciach podręcznych uzyskano na podstawie wydruku programu
`x86info`, `lscpu`, `getconf`.
Wyniki eksperymentów
---
Porównanie obu implementacji index_0 oraz index_1 dla t = 65536 oraz bloku $2^6$.
| Implementacja | Czas | IPC | L1 Data Cache miss ratio | L2 Data Cache miss ratio | L3 Cache miss ratio | Data TLB miss ratio |
|:-------------:| -------- |:-----:|:------------------------:| ------------------------ | ------------------- |:-------------------:|
| index_0 | 2.231310 | 0.763 | 95.526% | 142.820% | 105.440% | 69.460% |
| index_1 | 1.367902 | 2.147 | 73.584% | 154.683% | 95.035% | 1.977% |
Porównanie wykonanych instrukcji na jeden element (Instrukcje na jeden element = Total instructions/Scanned elements).
| Implementacja | instrukcji na jeden element |
|:-------------:| --------------------------- |
| index_0 | 13.26 |
| index_1 | 25.76 |
Porównanie czasów i IPC przy zmianie wielkości bloków ($2^{n}$).
| Blok | Czas | IPC |
| ---- |:--------:|:-----:|
| 2 | 2.483187 | 1.162 |
| 3 | 2.306786 | 1.251 |
| 4 | 1.676091 | 1.722 |
| 5 | 1.388984 | 2.126 |
| 6 | 1.366802 | 2.149 |
| 7 | 1.843279 | 1.597 |
| 8 | 2.130802 | 1.317 |
| 9 | 2.494855 | 1.193 |

Wnioski
---
* Czemu zmiana organizacji danych spowodowała przyspieszenie?
Zmiana organizacji danych spowodowała przyspieszenie (IPC wzrosło prawie trzykrotnie). Widać to na tabeli w wynikach eksperymentów. Nowa implementacja lepiej korzysta z pamięci podręcznej, dzięki czemu mamy mniej chybień, a co za tym idzie lepszą lokalność odwołań do pamięci.
* Czy translacja adresów ma zauważalny wpływ na wydajność przeglądania tekstury?
Translacja adresów ma wpływ na wydajność przeglądania tekstury, ale korzyści są na tyle duże (w przypadku index_1), że nie jest ona zuważalna.
* Jaki jest optymalny rozmiar kafla?
Po przeanalizowaniu tabeli oraz wykresu w wynikach eksperymentów najbardziej optymalny rozmiar kafla to $2^6$ (64), lecz rozmiar $2^5$ (32) jest również optymalny.
* Czy zoptymalizowana wersja wykonuje więcej instrukcji na jeden element?
Tak, zoptymalizowana wersja wykonuje więcej instrukcji na jeden element. Widać to w tabeli w wynikach eksperymentów. Wykonywane instrukcje na jeden element wzrosły z 13.26 do 25.76 (to prawie dwukrotna różnica).
* Jak zmieniło się IPC?
IPC zmieniło się średnio z 0.763 do 2.147. Jest to prawie trzykrotna różnica!
Ostatnia wersja jest najlepsza, bo dzięki zaimplementowaniu wersji z blokami poprawłem lokalność odwołań do pamięci. Daje to duże zyski w wydajności programu, co jasno wynika z danych (z pierwszej tabeli umieszczonej w wynikach eksperymentów).