# Architektury počítačů

**Hierarchie paměťového systému**
- s rychlostí paměti roste její cena (rychlá paměť nemůže být velká)
- od nejrychlejších po nejpomalejší
	- registry
	- cache
	- hlavní paměť
	- virtuální paměť
	- externí (disková) paměť
	- archívní pásky

**Cache** (plně asociativní)
- koncepce vychází z časové a prostorové lokality výpočtu
	- referovaná adresa v paměti bude pravděpodobně použita opakovaně
	- pravděpodobně bude použito i blízké okolí referované adresy
- cache obsahuje kopie naposled použitých slov paměti a okolních adres
	- u každé položky v cache je i adresa hlavní paměti, odkud byla kopírována

**Cache na principu rychlé SRAM**
- obvykle rozdělena na několik částí (cest)
	- Tag, Index, Slovo
	- část adresy z CPU (index) vybere řádku ve všech cestách současně
	- zbytek adresy (tag) se porovná komparátory s adresou u dané řádky
	- není-li shoda v žádném komparátoru, nahradí se celý blok ve zvolené cestě novými daty
- příklad uložení dat v jednocestné cache
	- čtení z adresy `A1231C80` přepíše původní blok z adresy `50001C80` na indexu `1C8`
	- dvoucestná cache by mohla mít `A1231C80` v jedné cestě a `50001C80` ve druhé
- příklad: situace cache hit
	- cesta má na indexu `1C6` stejný tag jako je v adrese vystavené procesorem
- příklad: situace cache miss
	- elektronika cache vybere některou z cest a nahradí data na indexu `1C6` daty z adresy `033E1C65`

**Zápis do cache**
- Write Back
	- data se zapisují jen do cache
	- do RAM se zapíší až při výměně bloku za jiný
- Write Through
	- data se zapisují do cache i do RAM

**Problémy koherence**
- oba procesory mohou mít v cache kopii stejné adresy
- při změně obsahu jedním z nich je potřeba další kopie zneplatnit
	- alternativa: neukládat sdílenou oblast paměti do cache

**Paralelní výpočty**
- klasické rozdělené výpočtů podle způsobu provádění
	- SISD (Single Instruction, Single Data)
		- výpočet provádí jeden procesor jednoduchou operační jednotkou
	- SIMD (Single Instruction, Multiple Data)
		- výpočet provádí jeden procesor, několik stejných operačních jednotek provádí tutéž instrukci s různými daty
	- MIMD (Multiple Instruction, Multiple Data)
		- výpočet provádí několik procesorů, každý podle svého programu se svými daty
	- Data Flow
		- instrukce nejsou v programu zapsány sekvenčně, ale je dána množina požadovaných operací, které se provádí, jsou-li k dispozici požadovaná data

**Proudové zpracování** (pipeline)
- každá instrukce postupně zpracovávána v několika stupních
- kompletní zpracování instrukce vyžaduje několik taktů CLK
- v procesoru je současně v různých fázích zpracováváno několik instrukcí
- v každém taktu procesor dokončí jednu instrukci
- problémy
	- přístup k datům v paměti vyžaduje větší počet taktů
	- instrukce skoku a podmíněných skoků naušují pipeline

**Superskalární procesor**
- procesor provádí několik instrukcí současně
	- má je ve frontě a rozpozná možnost paralelního provedení
- problémy s různě dlouhými instrukcemi
- instrukce mohou pracovat s nezávislými operandy
- vhodným pořadím instrukcí v programu (optimalizujícím překladačem) lze podpořit jejich paralelní provádění

**Paralelismus na bázi mikrooperací**
- provádění mikrooperací v přeházeném pořadí (out of order)
	- několik instrukcí paralelně rozloženo
	- několik operačních jednotek (EU) provádí nezávislé mikrooperace v libovolném pořadí, pokud jsou k dispozici potřebné operandy

**Podpora více vláken**
- každé vlákno provádí procesor s vlastní sadou registrů
- paralelně prováděné části programu (vlákna/procesy) určí programátor resp. operační systém
	- vlákna (thread) - společné adresní prostory
	- procesy (process) - oddělené adresní prostory

**SMT** (Simultaneous MultiThreading)
- dvě nebo více vláken sdílí společné Execution Units (EU)
	- výhoda: větší pravděpodobnost nezávislých mikrooperací
- každé vlákno pracuje se svým nezávislým logickým procesorem
- skutečné pracovní registry jsou součástí fytického procesoru

**SMT: HyperThreading** (Intel)
- každé jádro schopno provádět 2 vlákna
- oba procesory maj společenou EU (Execution Unit)
	- paralelní běh T1 || T2 je jiný než T1 || T3

### Charakteristiky procesorů Core i7

- obsahují několik jader
- každé vlákno může paralelně provádět 2 vlákna
- jádra mají společnou L3 cache
- na čipu trojnásobný kanál pro připojení DRAM
- pro komunikaci s dalšími procesory nebo vzdálenými DRAM slouží kanály (sběrnice) QPI (Quick Path Interconnect)

**Stupně instrukcí v jádře**
- pořadí dané programem
	- čtení instrukcí a řazení do fronty
	- dekódování instrukcí
	- současné ukládání 2 vláken do fronty
- pořadí out of order
	- několik instrukcí paralelně rozloženo na mikrooperace
	- několik operačních jednotek (EU) provádí nezávislé mikrooperace v libovolném pořadí, pokud jsou k dispozici příslušné operandy

**Predikce skoků**
- maximální výkon architektury i7 je dosažen při plynulém čtení instrukcí z paměti
- podmíněné skoky mohou podle výsledku testu vést k nutnosti zrušit část obsahu fronty instrukcí atd.
- predikce skoků se snaží podle adresy a cíle skokové instrukce a podle historie predikovat, zda se skok provede nebo ne

**Detekce krátkých cyklů**
- krátké cykly jsou detekovány na úrovni mikrooperací
- instrukce v cyklu nejsou znovu čteny a dekódovány

**Instrukce SIMD**
- stejná instrukce se provádí s více daty
- vhodné pro vektorové a maticové operace, grafické aplikace, ...

**Cache paměti**
- L1 cache: oddělená datová a kódová cache, samostatná pro každé jádro
- L2 cache: společná pro kód a data, samostatná pro každé jádro
- L3 cache: společná pro kód a data, společná pro všechna jádra