The wiki page is under active construction, expect bugs.

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
statnice:bakalar:b0b35apo [2025/06/09 18:01] – [Dynamické prediktory] zapleka3statnice:bakalar:b0b35apo [2025/06/09 21:41] (current) zapleka3
Line 1: Line 1:
-==== Architektura počítače; CPU, paměti, subsystémy ====+====== Architektura počítače; CPU, paměti, subsystémy ======
  
 [[https://fel.cvut.cz/cz/education/bk/predmety/50/99/p5099306.html|B0B35APO]] [[https://cw.fel.cvut.cz/wiki/courses/b35apo/lectures/start|Webové stránky předmětu]] [[https://comparch.edu.cvut.cz|CompArch]] [[https://eval.comparch.edu.cvut.cz|WebEval]] [[https://fel.cvut.cz/cz/education/bk/predmety/50/99/p5099306.html|B0B35APO]] [[https://cw.fel.cvut.cz/wiki/courses/b35apo/lectures/start|Webové stránky předmětu]] [[https://comparch.edu.cvut.cz|CompArch]] [[https://eval.comparch.edu.cvut.cz|WebEval]]
Line 422: Line 422:
   * Binární reprezentace má své specifické chování, včetně přetečení, podtečení a zaokrouhlovacích chyb.   * Binární reprezentace má své specifické chování, včetně přetečení, podtečení a zaokrouhlovacích chyb.
   * Na rovnost dvou desetinných čísel nelze spoléhat — i malá aritmetická chyba způsobí rozdíl.   * Na rovnost dvou desetinných čísel nelze spoléhat — i malá aritmetická chyba způsobí rozdíl.
- 
-===== 2. CPU ===== 
-RISC/CISC architektura, registry, formát RISC CPU instrukcí, porovnání jednocyklového procesoru a zřetězeného zpracování instrukcí. Jaké problémy přináší zřetězené zpracování instrukcí a jak je lze řešit – stall/forwarding. 
- 
-** RISC/CISC ** 
- 
-Reduced Instruction Set Computing vs. Complex Instruction Set Computing referuje o přístupu k návrhu procesorů. Jak název napovídá první z přístupů disponuje tzv. redukovanou instrukční sadou a druhý komplexní instrukční sadou. V redukované sadě mají standardně všechny instrukce stejnou délku a jejich sada není příliš početná. V komplexní nemusí mít instrukce konstantní délku, a jejich množství je větší. Redukovaná sada představuje většinou více práce pro programátora, kdežto komplexní sada často umožňuje provedení několika operací zavoláním jedné instrukce.  
- 
-** Registry ** 
- 
-|Registr | Popis| 
-|PC | Program counter - dresa právě prováděné (nebo následující) instrukce| 
-|IR | Instruction register - obsahje kód prováděné instrukce načtený zpaměti | 
-|GPR | General purpose registers – obecné uživatelské registry, mohou se dělit na data a adresy do paměti, nebo být univerzální| 
-|SP | Stack Pointer - kazuje na vrchol zásobníku, slouží k organizaci lokálních dat funkcí| 
-|PSW | Program Status Word – definuje v jakém stavu je procesor | 
-|IM | Interrupt Mask – kontrola přerušení | 
-|FPR | Floating point registers – rozšíření procesoru pro práci s reálnými čísly, případně i vektorové/multimediální registry | 
- 
-** Formát RISC CPU instrukcí ** 
- 
-Obecně – instrukce mají 32bit, kde bity 0-7 (LSb, little endian -> "zprava doleva") definují operaci, následně zbytek obsahuje registry cíle a zdrojů, případně konstant, či další specifikaci operace. 
- 
-** Porovnání jednocyklového procesoru a zřetězeného zpracování instrukcí ** 
- 
-Jednocyklový procesor funguje asi takto 
- 
-  - Počáteční nastavení – inicializace PC a PSW 
-  - Načtení instrukce z paněti z adresy PC (nastav PC -> Přečti obsah do IR -> uprav PC dle délky instrukce) 
-  - Dekóduj instrukci 
-  - Proveď instrukci 
-  - Kontrola přerušení nebo výjimky 
-  - Opakuj od kroku 2 
- 
- 
-Zřetězení přináší rozdělení vykonání jednotlivých úkonů instrukce. Tj. mezitím co dochází k faktickému vykonání instrukce, již se připravuje vykonání další, či dalších několika. 
-Tomuto procesu se také jinak říká pipelining.  
- 
-{{:statnice:bakalar:pasted:20250529-123852.png|400}} 
- 
- Jednotlivé fáze pro pětistupňovou pipeline jsou - 
-  - Instruction Fetch - přivedení PC na adreosvý vstup paměti, načtení instrukce 
-  - Instruction Decode - dokódování opcode (bity 0-7), přímého operandu a načtení registrů 
-  - EXecution - provedení požadované operace v ALU 
-  - MEMory - zápis/čtení z paměti 
-  - Write Back - zpětný zápis výsledků do pole registrů pro meziregistrové instrukce a paměti 
- 
-** Jaké problémy přináší zřetězené zpracování instrukcí a jak je lze řešit – stall/forwarding ** 
- 
-Za předpokladu, že výsledek předchozí instrukce potřebujeme využít v další instrukci, došlo by bez ošetření k "datovému hazardu". Ten lze vyřešit pomocí zpoždění vykonání následující operace (stall), či doplněním procesoru o tzv. forwarding, při kterém jsou nově vypočítané hodnoty přímo předány instrukci následující. 
- 
-Další možné hazardy, které mohou vzniknout, jsou tzv. "control hazardy" (tj. řídící). Ty nastávají v případě, kdy je vyhodnocován skok. Pokud dojde ke skoku, může tak dojít na stav, kdy instrukce nejsou předpočítané a dochází tak k významnému zpomalení. Toto lze omezit efektivní predikcí skoků, či přesunutím rozhodování o skocích do kroku ID (jako například u architektury MIPS).  
  
  
Line 689: Line 637:
 Statická predikce je jednoduchá a nezatěžuje hardware, ale neposkytuje dostatečnou flexibilitu při složitějším chování programů. Statická predikce je jednoduchá a nezatěžuje hardware, ale neposkytuje dostatečnou flexibilitu při složitějším chování programů.
  
-===== Dynamické prediktory =====+==== Dynamické prediktory ====
 Dynamické prediktory se snaží zjistit, zda se skoková instrukce provede, a to na základě jejího předchozího chování. Jinými slovy, sledují minulost konkrétní skokové instrukce a podle toho se snaží odhadnout, zda se tentokrát skočí nebo ne. Dynamické prediktory se snaží zjistit, zda se skoková instrukce provede, a to na základě jejího předchozího chování. Jinými slovy, sledují minulost konkrétní skokové instrukce a podle toho se snaží odhadnout, zda se tentokrát skočí nebo ne.
  
Line 872: Line 820:
 ==== Hiearchie ==== ==== Hiearchie ====
 Každý moderní počítač má několik úrovní paměti, které se liší svou velikostí, rychlostí, latencí a funkcí. Hiearchie pamětí se může trochu lišit napříč architekturami a konkrétními sestavami. Každý moderní počítač má několik úrovní paměti, které se liší svou velikostí, rychlostí, latencí a funkcí. Hiearchie pamětí se může trochu lišit napříč architekturami a konkrétními sestavami.
 +
 +  * Paměť v počítači si můžeme představit jako vrstvy – od těch nejrychlejších a nejdražších, které jsou přímo v procesoru, až po nejpomalejší a nejlevnější, které slouží k dlouhodobému uložení dat. 
 +  * Tento systém je založen na tzv. **paměťové hierarchii**, kde platí, že čím je paměť blíže procesoru, tím je rychlejší, ale menší a dražší.
 +  * Základním principem, proč hierarchie funguje efektivně, je **časová a prostorová lokalita přístupu** – programy totiž zpravidla pracují jen s malou částí dat najednou, a často s těmi samými nebo sousedními položkami.
 +  * Paměť je technicky implementovaná jako pole adresovaných buněk (většinou o velikosti jednoho bytu). Každá buňka má přiřazenou **adresu** a obsahuje **hodnotu** – data uložená v paměti.
 +  * Velikost dostupné paměti je omezena šířkou adresy – například 16bitový adresní prostor pojme 64 KiB, zatímco 32bitový až 4 GiB.
 +
 +  * Mezi základní parametry, které paměť charakterizují, patří:
 +    * **Vybavovací doba** – čas od vzniku požadavku po nalezení dat.
 +    * **Doba přístupu** – vybavovací doba + čas nutný k obnovení obsahu nebo zadání dalšího požadavku.
 +    * **Propustnost** – kolik dat zvládne paměť obsloužit za jednotku času.
 +
 +  * Paměti dělíme také podle možnosti zápisu:
 +    * **ROM** – Read Only Memory, nelze přepisovat za běhu.
 +    * **RAM** – Random Access Memory, lze číst i zapisovat v libovolném pořadí.
 +      * **SRAM** – statická RAM, rychlá, ale drahá a s větší spotřebou.
 +      * **DRAM** – dynamická RAM, levnější, ale pomalejší, nutno pravidelně obnovovat.
 +
 +  * Podle uchování dat po odpojení napájení rozlišujeme:
 +    * **Permanentní paměti** – data zůstávají zachována i po výpadku proudu.
 +    * **Volatilní paměti** – data jsou ztracena při vypnutí systému.
 +
 +{{:statnice:bakalar:pasted:20250609-182543.png}}
 +
 +{{/mnt/data/1609b61d-74e8-4463-a3f1-dd677d0047e0.png}}
 +
 +  * Diagram ukazuje klasickou **paměťovou hierarchii** od nejrychlejších registrů po nejpomalejší diskové úložiště.
 +  * Čím blíže k procesoru, tím je paměť rychlejší, menší a dražší.
 +  * Porovnání parametrů různých typů pamětí:
 +    * **L1 SRAM** – 32 kB, velmi rychlá (0.2–2 ns), drahá (10 Kč/kB).
 +    * **Sync SRAM** – 1 MB, rychlá (0.5–8 ns/word), velmi drahá (300 Kč/MB).
 +    * **DDR3 (DRAM)** – 16 GB, střední propustnost (15 GB/s), běžná RAM (123 Kč/GB).
 +    * **HDD** – 3 TB, velmi pomalé (100 MB/s), levné (1 Kč/GB).
 +  * Některá data mohou existovat ve více kopiích (např. L1, L2, RAM).
 +  * Aby nedocházelo k nesrovnalostem, musí být zajištěna **koherence cache** a **konzistence dat** – např. při vícejádrovém zpracování (SMP).
 +
  
 === Registers === === Registers ===
-Nejrychlejší paměť s nejnižší latancí, která je přímo v jádrech procesoru. +  * Nejrychlejší paměť s nejnižší latancí, která je přímo v jádrech procesoru. 
-Obsahuje data běžícího programu, ale nikoliv instrukce programu. +  Obsahuje data běžícího programu, ale nikoliv instrukce programu. 
-Procesor provádí většinu operací nad registery (např. sčítání, odčítání atd.). +  Procesor provádí většinu operací nad registery (např. sčítání, odčítání atd.). 
-Konkrétní počet registerů závisí na konkrétní architektuře (x86, extensions atd.), většinou v řádu desítek registerů, sčítající na stovky bytů.+  Konkrétní počet registerů závisí na konkrétní architektuře (x86, extensions atd.), většinou v řádu desítek registerů, sčítající na stovky bytů
 +  * Registry jsou extrémně rychlé, protože jsou fyzicky integrovány přímo v procesorovém jádru. Přístup do nich trvá jen několik málo taktů. 
 +  * Protože jsou velmi omezené kapacitou, používají se pouze pro nejčastěji potřebná data – např. meziproměnné, čítače, ukazatele atd.
  
-=== Cache ===+=== RAM === 
 +  * Velká volatilní paměť, která fyzicky není v procesoru. 
 +  * Technologie DDR, DDR2, DDR3, DDR4. 
 +  * Celkový bandwidth záleží na frekvenci pamětí a počtu kanálů. 
 +  * Běžné procesory většinou podporují kanály pouze 2, serverové až 12, díky čemuž dosahují velké propustnosti - stovky GB/s. 
 +  * Největší problém je spíše latence, která je většinou přes 75ns. 
 +  * Někteří výrobci se proto snaží dát paměť co fyzicky nejblíže k procesoru, aby se minimalizovala latence. 
 +   
 +  * **RAM** (Random Access Memory) umožňuje přístup ke kterékoli buňce ve stejném čase – tedy **náhodný přístup**. To ji odlišuje například od sekvenčních úložišť jako pásky. 
 +  * I když má RAM vysokou propustnost, její latence je výrazně vyšší než u registrů nebo cache. To je důvodem, proč se mezi RAM a procesorem často vkládají cache paměti. 
 +  * Systémy s více paměťovými kanály (dual-channel, quad-channel atd.) umožňují zvýšit šířku přenosového pásma mezi RAM a procesorem. 
 + 
 +=== Disk === 
 +  * Velmi pomalé, nevolatilní úložiště. 
 +  * Slouží k dlouhodobému ukládání dat. 
 +  * Data se z něj načítají do paměti. 
 +  * Při nedostatku paměti je možné jej využít jako virtuální paměť - pagefile - může vézt k problémům s výkonem. 
 +    * **HDD** - levné, ale pomalejší úložiště (stovky MB/s). 
 +    * **SSD** - drahé, ale mnohem rychlejší úložiště (až desítky GB/s). 
 + 
 +  * Disky tvoří spodní vrstvu paměťové hierarchie. Jsou nejpomalejší, ale nejlevnější na jednotku velikosti, a mají neomezeně dlouhou dobu uchování dat. 
 +  * Pokud dojde RAM, může operační systém část obsahu paměti „odložit“ na disk – to se nazývá **swapování** nebo použití **virtuální paměti**. Tento mechanismus je funkční, ale výrazně zpomaluje běh programů. 
 +  * SSD disky jsou v současnosti mnohem rychlejší než HDD, protože nemají pohyblivé mechanické části – data se čtou elektronicky, nikoli fyzickým pohybem hlavice jako u HDD. 
 + 
 +==== Cache ====
 Cache je rychlá volatilní paměť přímo v procesoru, která se snaží snížit dopad relativně velmi pomalých pamětí RAM. Cache je rychlá volatilní paměť přímo v procesoru, která se snaží snížit dopad relativně velmi pomalých pamětí RAM.
 Historicky rostl výpočetní výkon procesorů mnohem rychleji než rychlost pamětí RAM a proto je cache stále více a více důležitý, aby nebyl procesor omezován (bottleneck). Historicky rostl výpočetní výkon procesorů mnohem rychleji než rychlost pamětí RAM a proto je cache stále více a více důležitý, aby nebyl procesor omezován (bottleneck).
 Moderní procesory mají několik úrovní cache pro optimální výkon: Moderní procesory mají několik úrovní cache pro optimální výkon:
-  * **L1** + 
 +  * **L1**
     * Nejrychlejší cache s nejnižší latencí. Rychlost přes 2000 GB/s, latence pod 1ns.     * Nejrychlejší cache s nejnižší latencí. Rychlost přes 2000 GB/s, latence pod 1ns.
     * Každé jádro má svůj vlastní L1 cache. U x86 je rozdělen na **L1i** (pro instrukce) a **L1d** (pro data), u ARM záleží na konkrétní architektuře.     * Každé jádro má svůj vlastní L1 cache. U x86 je rozdělen na **L1i** (pro instrukce) a **L1d** (pro data), u ARM záleží na konkrétní architektuře.
     * Velmi malý, velikost kolem 40KB na jádro.     * Velmi malý, velikost kolem 40KB na jádro.
   * **L2**   * **L2**
-    * Větší ale pomalejší než L2. Rychlost kolem 1000GB/s, latence kolem 2.5ns. +    * Větší ale pomalejší než L1. Rychlost kolem 1000GB/s, latence kolem 2.5ns. 
-    * U x86 většinou samostatný pro každé jádro, na arm většinou sdílený napříč jádry (unified).+    * U x86 většinou samostatný pro každé jádro, na ARM většinou sdílený napříč jádry (unified).
     * Velikost v řádu MB na jádro.     * Velikost v řádu MB na jádro.
   * **L3**   * **L3**
     * Zdaleka největší a taky nejpomalejší. Rychlost kolem 500GB/s, latence kolem 10ns.     * Zdaleka největší a taky nejpomalejší. Rychlost kolem 500GB/s, latence kolem 10ns.
     * Většinou pouze u x86.     * Většinou pouze u x86.
-    * Sdílený napříč jádry nebo bloky jáder (např amd epyc).+    * Sdílený napříč jádry nebo bloky jáder (např. AMD Epyc).
     * Velikost v řádu desítek až stovek MB.     * Velikost v řádu desítek až stovek MB.
-Toto rozložení samozřejmě neni univerzální, ale je typické. 
-Intel např. dříve experimentoval s velkým L4 cache a nové intel procesory obsahují L0 cache (což je jen debilně pojmenovaný L1 cache - každé jádro má zde vlastní L0d, L0i, L1, L2 a sdílený L3). 
  
-Optimalizace datových struktur programu tak, aby se vešla dobře do cache, může vést k masivnímu nárustu výkonu.+  * Toto rozložení samozřejmě není univerzální, ale je typické. 
 +  * Intel např. dříve experimentoval s velkým L4 cache a nové Intel procesory obsahují L0 cache (což je jen jinak pojmenovaný L1 cache – každé jádro má zde vlastní L0d, L0i, L1, L2 a sdílený L3). 
 + 
 +  * **Cache** slouží jako vyrovnávací paměť mezi procesorem a RAM, urychluje přístup k často používaným datům, a tím snižuje latenci a zvyšuje výkon. 
 +  * Optimalizace datových struktur programu tak, aby se vešla dobře do cache, může vést k masivnímu nárůstu výkonu. 
 === Organizace Cache === === Organizace Cache ===
-  * **Word size (WS)** velikost slova je podle architektury systému 32bit $\rightarrow$ 32bitová slova, 64bit $\rightarrow$ 64bitová slova, má většinou velikost $2^i$, kde i je počet bitů potřeba na adresaci bytů uvnitř slova.  +  * **Word size (WS)** – velikost slova je podle architektury systému 32bit → 32bitová slova, 64bit → 64bitová slova, má většinou velikost $2^i$, kde $ije počet bitů potřeba na adresaci bytů uvnitř slova. 
-  * **Capacity** (C) kapacita cache v bytech nebo ve slovech +  * **Capacity (C)** – kapacita cache v bytech nebo ve slovech. 
-  * **Block size (BS)** velikost prostoru pro data v jednom řádku cache, měří se ve slovech, bývá o velikosti $2^b$, kde b je počet bitů kterými jde adresovat jeden řádek (např, pokud má řádek 128bitů, tak jde adresovat 7 bity $\arrowright$ $2^7$, kde b=7).  +  * **Block size (BS)** – velikost prostoru pro data v jednom řádku cache, měří se ve slovech, bývá o velikosti $2^b$, kde $bje počet bitůkterými lze adresovat jeden řádek. 
-  * **Number of sets (SN)** počet řádek v jedné cachovací tabulce, většinou musí být množství $2^n$ +  * **Number of sets (SN)** – počet řádek v jedné cachovací tabulce, většinou o velikosti $2^n$. 
-  * **Index** do řádku cache, odpovída počtu řádků (SN) cache která většinou musí být $2^n$, Index má poté $n$ bitů. Většinou se bere do Indexu nejnižích $b+i \rightarrow n+b+i$  bitů adresy z paměti (prvních $b$ bitů, adresuje obsah jednoho řádku)+  * **Index** – do řádku cache, odpovídá počtu řádků cachevětšinou musí být $2^n$; používá se $n$ bitů z adresy, obvykle nejnižších $b+i \rightarrow n+b+i$ bitů. 
-  * **TAG** - Obsahuje zbytek adresy kromě toho co už vyjadřuje index, takže je to rozsah $b+n+i \rightarrow \text{délka adresy}$ +  * **TAG** – obsahuje zbytek adresy kromě bitů použitých pro index a offsettedy $b+n+i \rightarrowdélka adresy. 
-  * **Validity bit** bit platnosti, indikuje zda jsou data na řádku platná.  +  * **Validity bit** – bit platnosti, indikujezda jsou data na řádku platná. 
-  * **Dirty bit** - rošiřující pole v obsahu paměti. Indikuje že v cache je jiná hodnotanež v paměti hlavní +  * **Dirty bit** – rozšiřující pole v obsahu paměti. Indikuježe v cache je jiná hodnota než v hlavní paměti. 
-  * **Degree of associativity (N)** - Počet tabulek +  * **Degree of associativity (N)** – počet tabulek. 
-  * **Number of blocks (BN)** počet řádků přes všechny tabulky, je roven $\text{Degree of associativity} * \text{Number of sets}$ +  * **Number of blocks (BN)** – počet řádků přes všechny tabulky, je roven $\times \text{Number of sets}$. 
-  * **Cache hit** (zásah) - pojmenování situace, kdy požadovaná hodnota v cache je+  * **Cache hit** – situace, kdy se požadovaná data nachází v cache. 
-  * **Cache miss** - výpadek, data v cache ješte nejsou +  * **Cache miss** – situacekdy data v cache nejsou a musí se načíst z pomalejší paměti. 
-  * **Cache line nebo Cache block** základní kopírovatelná jednotka mezi hierarchickými ůrovněmi (typicky, $8B$, do $1KB$+  * **Cache line nebo Cache block** – základní kopírovatelná jednotka mezi hierarchickými úrovněmi (typicky 8B až 1KB). 
-  * **Hit rate** počet paměťových přístupů obsloužených danou úrovní cache dělený všemi ístupy +  * **Hit rate** – počet paměťových přístupů obsloužených danou úrovní cache dělený celkovým počtem ístupů. 
-  * **Miss rate** 1 - Hit rate +  * **Miss rate** – $1 - \text{Hit rate}$. 
-  * Average Memory Access Time (AMAT) $AMAT = \text{HitTime} + \text{MissRate} \text{MissPenalty}$ +  * **Average Memory Access Time (AMAT)** – průměrná doba přístupu k paměti: $AMAT = \text{HitTime} + \text{MissRate} \times \text{MissPenalty}$. 
-  AMAT pro více urovňovou cache lze spočítat rekurzivní použitím výše uvedeného vztahu +    Pro vícestupňové cache se AMAT počítá rekurzivně podle stejného vztahu. 
-  * **Cache replacement policy** pravidla pro výběr položky vyřazení z cache, když potřebujeme nahrát novou hodnotu do cache +  * **Cache replacement policy** – pravidla pro výběr, která položka bude z cache odstraněna: 
-    * Random - vybraná položka je náhodná +    * **Random** – náhodná volba. 
-    * LRU (least recently usednejdéle nepoužitá položka +    * **LRU (Least Recently Used)** – odstraní nejdéle nepoužitou položku. 
-    * LFU (least frequently used- sleduje jak často se k položkám přistupuje +    * **LFU (Least Frequently Used)** – odstraní položku s nejmenší četností použití. 
-    * ARC (Adaptive replacement cache- kombinace LRU a LFU +    * **ARC (Adaptive Replacement Cache)** – adaptivní algoritmus kombinující LRU a LFU. 
-  * **Write through (zápis, propsání skrz) cache** - Při každém zápisu se data hned propíšou i do hlavní paměti, takže cache má vždy čistou kopii, ale každý zápis stojí čas+  * **Write through (propsání skrz)** – při každém zápisu se data uloží do cache i hlavní paměti. 
-  * **Write back** - Data se uloží jen do cache a blok se označí jako dirty“; do hlavní paměti se pošlou až při vytlačení bloku, čímž šetříš počet zápisů, ale musíš hlídat dirty bity.+  * **Write back** – data se uloží pouze do cachea označí se jako "dirty". Do hlavní paměti se zapíší až při odstranění z cache. 
 == Plně asociativní cache == == Plně asociativní cache ==
-Znamená že $\text{Degree of associativity} = text{Number of blocks}$, pro každý řádek tímpádem existuje tabulkato znamená že index má $0bitů (tedy neexistuje) tag má velikost $\text{TAG} = $\text{délka adresy} - b+i$, kde b je počet bitů potřeba na adresaci jednoho slova v bloku a i je počet bitů na adresaci bytů ve slově. +Znamenáže $\text{Degree of associativity} = \text{Number of blocks}$. Každý řádek má svou vlastní tabulkucož znamenáže **index má 0 bitů** **celá adresa kromě offsetu se ukládá do tagu**.
  
-**vlastnosti:** +  V plně asociativní cache neexistuje pevné přiřazení adresy do konkrétního řádkuJakýkoli blok z paměti může být uložen kamkoli do cache. To zajišťuje maximální flexibilitu
-  * Nemusíme nahrazovat záznamy v cache do té doby než nám kompletně dojde. +  * Díky absenci indexu není třeba řešit kolize způsobené stejnými indexy – všechny bloky soutěží o všechna místa. 
-  * Je velmi drahá na implementaci, takže musí být malá +  * Tag musí obsahovat téměř celou adresu (kromě offsetu), protože není jiný způsob, jak určit, které slovo je právě v cache.
-  * Používá se v aplikacích kde je potřeba extrémní rychlost, takžtřeba TLB (translation lookaside buffer, pro překlad virtulní na fyzickou paměť), potřebuje být velmi malá. +
-{{:statnice:bakalar:pasted:20250602-114623.png?300}}+
  
 +  * **Vlastnosti:**
 +    * Nemusíme nahrazovat záznamy v cache, dokud není plně zaplněna.
 +      * To znamená, že cache dokáže efektivněji využít svou kapacitu a zvyšuje se pravděpodobnost cache hitu.
 +    * Je velmi drahá na implementaci, proto se používá pouze pro malé paměti.
 +      * Nutnost porovnávat všechny tagy najednou při každém přístupu zvyšuje komplexitu a spotřebu.
 +    * Používá se např. v **TLB (Translation Lookaside Buffer)**, kde je potřeba extrémní rychlost a malá velikost.
 +      * TLB je specializovaná cache pro překlad virtuálních adres na fyzické – zde má každá mikrosekunda význam, a malý rozsah přístupů odpovídá malému počtu záznamů.
 +
 +{{:statnice:bakalar:pasted:20250602-114623.png?300}}
  
 == Přímo mapovaná cache == == Přímo mapovaná cache ==
-  * 1 cestná cache $\rightarrow$ stupeň asociace = 1, tedy má jednu tabulku +  * 1-cestná cache → stupeň asociace = 1, tedy pouze jedna tabulka. 
-  * $\text{number of sets} = \text{number of blocks}$ +  * $\text{Number of sets} = \text{Number of blocks}$. 
-  * má index o délce bitů $log(\text{number of sets})$+  * Index má délku $log_2(\text{Number of sets})$ bitů.
  
-**Schéma**:+  V přímo mapované cache je každý blok z paměti jednoznačně přiřazen právě k jednomu místu (setu) v cache – tedy žádná flexibilita. 
 +  Pokud dva různé bloky z hlavní paměti spadnou na stejné místo, musí si navzájem přepisovat obsah cache – to může vést ke zvýšenému počtu missů. 
 +  Tag je kratší, protože část adresy je vyjádřena indexem. 
 + 
 +  **Schéma:**
  
 {{:statnice:bakalar:pasted:20250602-152014.png?750}} {{:statnice:bakalar:pasted:20250602-152014.png?750}}
  
-**Příklad s většími bloky:**+  * **Příklad s většími bloky:**
  
 {{:statnice:bakalar:pasted:20250602-153331.png?750}} {{:statnice:bakalar:pasted:20250602-153331.png?750}}
  
-**Vlastnosti:** +  * **Vlastnosti:** 
-  * Hlavní cache u mikrokontrolerů a levných procesorů +    * Hlavní typ cache u mikrokontrolerů a levných procesorů. 
-  * Má velkou pravděpodobnost kolizí $\rightarrow$ budeme muset vyřadit záznam z cache bez toho aniž bychom celou cache zaplnili +      * Důvodem je jednoduchá a levná implementace, která nevyžaduje složité vyhledávání a porovnávání tagů. 
-  Každou adresu můžeme zařadit pouze do jednoho místa v tabulce cache +    * Má vysokou pravděpodobnost kolizí – může dojít k vyřazení záznamu, i když cache není plná. 
 +      To je způsobeno tím, že více různých adres může sdílet stejný index. 
 +    * Každou adresu lze zařadit pouze do jednoho místa v cache tabulce
 +      * Výsledkem je nižší hit rate oproti flexibilnějším typům cache
 == N-asociativní cache == == N-asociativní cache ==
-  * **Obecnější model cache** - $\text{stupeň asociace} = n$+  * **Obecnější model cache**, kde je stupeň asociace $n$ – tzn. že každý set obsahuje $n$ bloků. 
 + 
 +  * Tento typ cache kombinuje výhody předchozích dvou přístupů: 
 +    * Každá paměťová adresa směřuje do konkrétního setu (jako u přímo mapované), ale v rámci tohoto setu může být uložena v libovolném z $n$ bloků. 
 +    * Tím se snižuje pravděpodobnost kolizí, protože více položek může sdílet jeden set bez vzájemného přepisování. 
 +    * Implementace je jednodušší než u plně asociativní cache, protože se porovnávají tagy jen v rámci jednoho setu, ne celé cache.
  
 {{:statnice:bakalar:pasted:20250602-153444.png?750}} {{:statnice:bakalar:pasted:20250602-153444.png?750}}
  
-=== RAM === +  * Tento typ organizace nabízí kompromis mezi plně asociativní a přímo mapovanou cache: 
- +    * **+** Lepší využití paměti a vyšší **hit rate** než přímo mapovaná
-Velká volatilní paměť, která fyzicky není v procesoru. +    * **+** Nižší složitost a režie než plně asociativní
- +    * **** Může docházet ke konfliktům, ale méně často než u přímého mapování.
-Technologie DDR, DDR2, DDR3, DDR4. +
- +
-Celkový bandwidth záleží na frekvenci pamětí počtu kanálů. +
-Běžné procesory většinou podporují kanály pouze 2, serverové až 12, díky čemuž dosahují velké propustnosti - stovky GB/s. +
- +
-Největší problém je spíše latence, která je většinou es 75ns. +
-Někteří výrobci se proto snaží dát paměť co fyzicky nejblíže k procesoru, aby se minimalizovala latence. +
- +
-=== Disk === +
- +
-Velmi pomalé, nevolatilní úložiště. +
-Slouží k dlouhodobému ukládání dat. +
-Data se z něj načítají do paměti. +
-Při nedostatku paměti je možné jej využít jako virtuální paměť - pagefile - může vézt k problémům s výkonem+
-  * **HDD** - levné, ale pomalejší úložiště (stovky MB/s)+
-  * **SSD** - drahé, ale mnohem rychlejší úložiště (až desítky GB/s).+
  
  
Line 983: Line 1002:
 periferie mapované do paměti, sériový port, sběrnice – sériová/paralelní, half-duplex/full-duplex, sběrnice PCI. periferie mapované do paměti, sériový port, sběrnice – sériová/paralelní, half-duplex/full-duplex, sběrnice PCI.
  
-RISC-V nemá speciální instrukce pro komunikaci s periferiemi, místo toho se zapisuje do určené oblasti pamětito vede k zápisu / čtení z periferií+==== Periferie mapované do paměti ==== 
 +  * RISC-V nemá speciální instrukce pro komunikaci s periferiemi
 +  * Místo toho se čtení a zápis do periferií provádí zápisem do vyhrazené oblasti paměťovém prostoru. 
 +  * Periferie při inicializaci získají svůj vlastní **paměťový rozsah**, přes který komunikují s CPU. 
 +  * **Address Decoder** rozhoduje, ke které periferii daný paměťový přístup patří. 
 +    * **Asynchroní sběrnice**: USB, SATA 
 +    * **Synchroní sběrnice**: PCI, PCIe 
 +  * Tento způsob je jednoduchý na implementacipřehledný a často používaný v embedded systémech. 
 +  * Komunikace přes paměťovou mapu je vhodná pro zařízení, která nepotřebují složité řízení přenosu.
  
-velmi jednoduchá konfigurace - periferie i inicializaci získají paměťový rozsahten slouží esunu dat mezi CPU periferiemi+==== Sériová vs paralelní sběrnice ==== 
 +  * **Paralelní sběrnice** enáší více bitů najednoukaždým vodičem jeden bit. 
 +    * Vyšší propustnost, ale více vodičů = vyšší nároky na prostor a synchronizaci. 
 +  * **Sériová sběrnice** enáší data bit po bitu jedním vodičem. 
 +    * Nižší náklady menší fyzické rozměry – dnes preferovaná varianta i pro vysokorychlostní přenosy. 
 +  * Paralelní sběrnice se používaly u starších zařízení (např. ATA), sériové dnes dominují (např. USB, PCIe).
  
-Adress Decoder rozhoduje kam se data přesměrují+=== Sériový port (UART) === 
 +  * Jeden z nejstarších a nejjednodušších způsobů komunikace. 
 +  * **Asynchronní přenos** bez hodin – vysílač a přijímač musejí být nastaveny na stejnou přenosovou rychlost (**baud rate**). 
 +    * Např. 9600 Bd, 115200 Bd, nově až 921600 Bd (Bd = 1 bit/s). 
 +  * **UART (Universal Asynchronous Receiver/Transmitter)** – obvod pro obousměrný sériový přenos: 
 +    * Využívá dvě linky: **TX** (transmit) a **RX** (receive). 
 +   
 +  * **Paměťově mapované registry UARTu**: 
 +    * **RX_ST** – stav přijímání dat 
 +      * bit 0: **ready** – byla přijata data 
 +    * **RX_DATA** – čtení přijatých dat 
 +      * čtením z této adresy se data přečtou a příznak ready se smaže 
 +    * **TX_ST** – stav vysílání 
 +      * bit 0: **ready** – UART je připraven k odeslání 
 +    * **TX_DATA** – zápis dat k odeslání 
 +      * zápis do registru rovnou spouští odeslání po TX
  
-**Asynchroní sběrnice** +=== Half-duplex vs Full-duplex === 
-  USB +  * **Half-duplex** – data mohou proudit **pouze jedním směrem v daný čas**. 
-  * SATA+    Např. klasický PCI – nelze současně odesílat i přijímat. 
 +  * **Full-duplex** – data mohou proudit **oběma směry současně**. 
 +    * Např. PCIe – vyšší efektivita přenosu.
  
-**Synchroní sběrnice** +=== Asynchronní sběrnice === 
-  * PCI +  * Data nejsou přenášena podle společného hodinového signálu. 
-  * PCIe+  * Používají se tam, kde nelze garantovat přesnou synchronizaci nebo to není potřeba. 
 +    * **USB** – univerzální rozhraní pro připojení periferií. 
 +    * **SATA** – rozhraní pro připojení disků.
  
-=== Sériová vs paralelní sběrnice === +=== Synchronní sběrnice === 
-Sériová sběrnice přenáší data po jedné datové lince, paralelní sběrnice přenáší data po více datových linkách současně +  * Přenos je řízen společným hodinovým signálem, všechna zařízení se musí synchronizovat. 
- +    * **PCI** 
-Sériová linka +    * **PCIe**
- +
-jeden z nejstarších způsobů komunikace, asynchronní přenos bez hodin +
-obě strany jsou nastaveny na stejnou rychlost která definuje délku vysílání jednoho bitu (baud rate, dříve např 9600 - 115200 Bd, nově až 921600 Bd, Bd = 1bit/s) +
- +
-=== UART === +
-Universal Asychronous Receiver Transmitter +
- +
-speciální zařízení které přijímá a vysílá byty po sériové lince (dva dráty RX a TX) +
- +
-RX_ST - stav přijímání dat +
-   bit 0 ready - byla přijata data +
-RX_DATA - přijatá data +
-  Čtení z adresy RX_DATA současně odstraní čtená data z UARTu a vymaže příznak ready (pokud nejsou další data) +
-TX_ST - stav odesílání dat +
-  bit 0 ready - můžeme zadávat data k odeslání +
-TX_DATA - data k odeslání +
-  Zápis do TX_DATA vede rovnou k odesílání data+
  
 === PCI === === PCI ===
-sběrnice PCI je řízena hodinamipro správnou činnost je nutná co nejpřesnější synchronizace hodin +  * **Paralelní synchronní sběrnice**half-duplex. 
- +  * Počáteční přenos vyžaduje řízení ístupu pomocí arbitra. 
-  přenos začíná tím, že iniciátor pořádá arbitra o idělení sběrnice +  * Iniciátor nastaví adresu a příznak **FRAME** – tím začíná rámec přenosu. 
-  - iniciátor začne vysílání nastavením adresy cílové periferie na AD sběrnici nastavením íznaku FRAME rámec přenosu a bitů cmd +  * Cílové zařízení (**Target**odpoví signálem **DEVSEL**že rozpoznalo svou adresu
-  - periférie, která rozpozná svoji adresu nastaví DevSel na 1 +  * Data se enášejíkdyž jsou oba signály **TRDY** (Target Ready) a **IRDY** (Initiator Ready) aktivní. 
-  - pokud je cílová periferie (Target) připravena přijmout datanastaví TRDY na 1+  * Přenos končí shozením **FRAME** na 0. 
-  - pokud je iniciátor ipraven vyslat datanastaví IRDY na 1 +  * Po přenosu všechny signály přejdou zpět na 0 a sběrnice je opět volná
-  - pyslání posledních dat je indikováno shozením příznaku FRAME na 0. +   
-  - po ukončení přenosu se signály IRDY, TRDY a DEVSEL vrátí na 0 a sběrnice se uvolní pro další přenos+  * **Nevýhody:** 
- +    * Half-duplex – nelze komunikovat oběma směry současně
-PCI je half-duplexnelze současně posílat data oběma směry. +    * Sdílená sběrnice – pomalá periferie brzdí všechny ostatní
- +    * Omezená přenosová rychlost – 33 nebo 66 MHz: 
-Více zařízení na sběrnici - pomalá periférie brzdí rychlé periférie, zvyšuje latency ech ostatních periférií+      32bit: 132 MB/s nebo 264 MB/
- +      64bit: 264 MB/s nebo 528 MB/s
-PCI sběrnice umožňuje pouze hodiny s 33 MHz, nebo 66 MHz. +
-  To odpovídá 132MB/s nebo 264 MB/s pro 32 bitovou variantu +
-  To odpovídá 264MB/s nebo 528 MB/s pro 64 bitovou variantu+
  
 === PCIe === === PCIe ===
-i malé nepřesnosti v délce vodičů, kvalitě spojů vedou k rozdílným rychlostem šíření signálů +  * **Sériová sběrnice**, point-to-point (peer-to-peer). 
-to je problém pro vysoké frekvence přenosů +  * **Full-duplex** – data mohou proudit současně v obou směrech. 
- +  * Každé spojení je realizováno jako samostatný link – nedochází ke sdílení přenosového pásma. 
-PCIe te peer-to-peer sběrnicedata se posílají jen mezi dvěma zařízeními+  * Velmi vysoké rychlostiale vyžaduje kvalitní spoje – i drobné rozdíly v délce vodičů nebo kvalitě mohou narušit komunikaci. 
 +  * Nahrazuje klasické PCI u moderních zařízení (grafické karty, SSD, síťové adaptéry apod.).
  
-je full-duplex, tedy data mohou být posílána oběma směry současně 
Navigation

Playground

QR Code
QR Code statnice:bakalar:b0b35apo (generated for current page)