Search
Cílem tohoto cvičení je prohloubit znalosti o cache, ujasnit a na příkladu ukázat principy časové a prostorové lokality, a zamyslet se nad otázkou optimalizace parametrů cache.
Uvažujte níže uvedený program read_array.S.
.set noreorder .globl pole .text .globl start .ent start start: la $s0, pole // adresa zacateku pole do registru s0 addi $s1, $0, 3 // Pocet pruchodu cyklem (pocet iteraci) nop // Proc je zde nop? Zkuste jej odranit.. Zmeni se hit rate? loop: beq $s1, $0, konec nop lw $s2, 0($s0) // Cteni 0-teho prvku pole lw $s2, 4($s0) // Cteni 1. prvku (4/4=1) lw $s2, 36($s0) // Cteni 9. prvku (36/4=9) lw $s2, 40($s0) // Cteni 10.prvku (40/4=10) addi $s1, $s1, -1 j loop nop konec: nop end_loop: //Koncova nekonecna smycka break j end_loop nop .end start .data .org 0x2000 pole: .word 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Dále uvažujte instrukční a datovou slovně zarovnanou cache, každou o velikosti 8 slov (1 slovo = 4B), strategie nahrazování (Replacement policy) LRU. Vyplňte následující tabulku pro instrukční a pro datovou cache. Detailně sledujte vykonávání programu a přístupy do cache. Datová cache:
Instrukční cache:
Na druhém cvičení jste měli za úkol připravit program, který počítá součet dvou vektorů o délce čtyř prvků. Upravte program pro délku 16 prvků. Umístěte tři vektory tak, aby na sebe navazovaly. Nastavte parametry na 4 sety s bloky o čtyřech slovech při stupni asociativity 2 (32 = 4 x 4 x 2). Politiku nahrazování volte LRU a pro zápis write-back. Nastavte časování souvislého sledu čtení/zápisů (burst) na 2. Sledujte chování pokud se cílový vektor shoduje s jedním ze vstupních. Dále pokud se jedná o tři různé vektory. Dále vložte mezi druhý a třetí vektor 4 slova. Změňte parametry cache na (32 = 2 x 4 x 4).
Vysvětlete pozorované chování.
Pozn. Jelikož máte write-back, tak nezapomeňte nakonec dát instrukci cache 9, 0(\$0) která vyprázní cache a zapíše do paměti, a v makefile odkomentujte řádek ARCHFLAGS += -march=mips3 aby ji překladač znal.
Uvažujte program z minulého cvičení (insert sort) a cache o velikosti 8 slov. Pro jakou strategii nahrazování (Replacement policy) lze očekávat dosažení nejlepších výsledků? Uvažujte i pro datovou i pro instrukční cache. Ověřte simulací.
Pro rychlé získání výsledků můžete s výhodou využít verzi simulátoru určenou pro spouštění z příkazové řádky
qtmips_cli --i-cache lru,4,1,1 --d-cache lru,4,2,4,wb --burst-time 2 --dump-cache-stats --dump-range pole,60,sorted-data.dat selection-sort
Parametry –i-cache a –d-cache určují parametry vyrovnávacích pamětí stejně jako z grafické verze simulátoru. –burst-time nastavuje dobu sekvenčních přístupů na 2 cykly, –dump-cache-stats určuje vypsání statistiky po skončení programu (dosažení instrukce break). –dump-range pak umožňuje uložení určitého rozsahu paměti po slovech (adresa může být zadaná i přes návěští). Veškeré parametry aplikace jsou vypsané po zadání parametru –help.
–i-cache
–d-cache
–burst-time
–dump-cache-stats
break
–dump-range
–help
Doplňující otázky:
Napište program v C/C + +, který zjistí a na obrazovku vypíše parametry cache pamětí Vašeho procesoru (procesoru, na kterém program běží) a velikost stránky virtuální paměti. Využijte knihovní funkce sysconf, parametry _SC_PAGESIZE, _SC_LEVEL1_DCACHE_LINESIZE atd. Seznam parametrů, které knihovna GNU C library (GLIBC) nabízí lze najít v jejích zdrojových kódech bits/confname.h. Dokumentace k parametrům Constants for Sysconf.
_SC_PAGESIZE
_SC_LEVEL1_DCACHE_LINESIZE
Porovnejte výsledky s hodnotami, které získáte čtením virtuálních souborů s informacemi od jádra operačního systému například příkazy
cat /proc/cpuinfo cat /sys/devices/system/cpu/cpu0/cache/index0/size find /sys/devices/system/cpu/cpu0/cache/ -type f -maxdepth 2 -print -exec cat '{}' ';'
příkazem lscpu případně sudo dmidecode na vlastním počítači, kde máte práva adminiztrátora.
lscpu
sudo dmidecode
Prepiste program selection sort z minuleho cviceni do jazyka C/C++. Zmerte hit rate instrukcni a datove cache prvni urovne, a dale hit rate cache posledni urovne – pokud program spustite na Vasem pocitaci (ucebna KN:2). Kolik pristupu do datove pameti se realizovalo? Kolik se vykonalo instrukci celkem? Zkuste menit uroven optimalizaci pri kompilaci.
Napoveda:Vyhodnotit jak program pracuje s cahce lze pomocí nástroje cachegrind.
valgrind --tool=cachegrind ./a.out
cg_annotate filename ~/main.cpp
Pozn.: Pri nedostatku casu muzete pouzit bubble sort z cviceni c.3.
Priklad vystupu po anotaci je zde: