Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
statnice:bakalar:b0b35apo [2025/06/09 16:31] – [Zápis čísel v různých soustavách] zapleka3 | statnice:bakalar:b0b35apo [2025/06/09 21:41] (current) – zapleka3 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== Architektura počítače; | + | ====== Architektura počítače; |
[[https:// | [[https:// | ||
Line 106: | Line 106: | ||
</ | </ | ||
- | ===== Endianita | + | === Endianita === |
Když počítač pracuje s víc než jedním bytem (např. `uint32_t`, `uint64_t`), | Když počítač pracuje s víc než jedním bytem (např. `uint32_t`, `uint64_t`), | ||
Line 134: | Line 134: | ||
* ARM: může být obojí (většinou little endian) | * ARM: může být obojí (většinou little endian) | ||
- | ===== Přehled souvisejících pojmů | + | === Přehled souvisejících pojmů === |
* **bit** – nejmenší jednotka informace, může nabývat hodnoty 0 nebo 1. | * **bit** – nejmenší jednotka informace, může nabývat hodnoty 0 nebo 1. | ||
Line 146: | Line 146: | ||
- | ==== Celá a reálná čísla ==== | ||
- | |||
- | Záporná čísla lze zakódovat různými způsoby: | ||
- | |||
- | - první bit bude znaménko | ||
- | |||
- | nevýhodou je existence +0 a -0 a potřeba nového algoritmu pro sčítání | ||
- | |||
- | - dvojkový doplněk | ||
- | |||
- | pro $X>0$ je reprezentace $X$ | ||
- | pro $X<0$ je reprezentace $2^k - |X|$ | ||
- | |||
- | sčítání je stejné jako pro kladná čísla | ||
- | |||
- | 8-bitová -1 je 11111111 | ||
- | |||
- | 5+(-1) je 101+11111111=100000100, | ||
- | čísla nevejde, tedy výsledek je 101+11111111=100 | ||
- | |||
- | |||
- | rozsah čísel reprezentovaných k-bity je $-2^{k-1}$ až $2^{k-1}-1$ | ||
- | |||
- | nemusíme navrhovat obvod pro odčítání, | ||
- | |||
- | důležité je zjistit opačné číslo $-B$ | ||
- | |||
- | záporné $X$ je $2^k - |X|$, pokud znegujeme každý bit, dostaneme $(2^k - 1) - |X|$ | ||
- | |||
- | postup: | ||
- | * znegujeme všechny bity čísla X | ||
- | * přičteme 1 | ||
- | |||
- | V jazyce C jsou typy: | ||
- | |||
- | | typ | min | max | počet bytů | | ||
- | | char | -128 | 127 | 1 | | ||
- | | short | -32 768 | 32 767 | 2 | | ||
- | | long | -2 147 483 648 | 2 147 483 647 | 4 | | ||
- | | long long | -9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 | 8 | | ||
- | |||
- | Při sčítání čísel může dojít k přetečení: | ||
- | |||
- | < | ||
- | |||
- | \usepackage{tikz} | ||
- | \usetikzlibrary{matrix} | ||
- | |||
- | \begin{document} | ||
- | \begin{tikzpicture} | ||
- | \matrix (m) [matrix of nodes, nodes={font=\ttfamily}, | ||
- | 150 & = & & 1 & 0 & 0 & 1 & 0 & 1 & 1 & 0 \\ | ||
- | +120 & = & & 0 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ | ||
- | \hline | ||
- | 14 & = & & 0 & 0 & 0 & 0 & 1 & 1 & 1 & 0 \\ | ||
- | 270 & = & 1 & 0 & 0 & 0 & 0 & 1 & 1 & 1 & 0 \\ | ||
- | }; | ||
- | | ||
- | \end{tikzpicture} | ||
- | \end{document} | ||
- | |||
- | </ | ||
- | |||
- | |||
- | Pro převod celých čísel z dvojkové do desítkové soustavy obecně platí vztah | ||
- | |||
- | $$ \sum_{i=0}^{k-1} b_i \cdot 2^i $$ | ||
- | |||
- | kde $k$ je počet cifer a $b_i$ je hodnota cifry na daném indexu. | ||
- | |||
- | Pro příklad | ||
- | |||
- | $$ 0100101_{(2)} = 2^0 + 2^2 + 2^5 = 37_{(10)} $$ | ||
- | |||
- | Stejný princip lze aplikovat i na reálná čísla za předpokladu, | ||
- | |||
- | $$ \sum_{i=-j}^{k} b_i \cdot 2^i $$ | ||
- | |||
- | Pro příklad | ||
- | |||
- | $$ 0100101, | ||
- | |||
- | Zavádíme též obdobu věděckého zápisu | ||
- | |||
- | $$ 110110000000000, | ||
- | $$ −0, | ||
- | |||
- | (Vědecká notace se vyznačuje také tím, že žádné číslo kromě 0 nezačíná 0) | ||
- | |||
- | Obecně užívaný zápis desetinných čísel je standardizován dle IEEE-754. | ||
- | Ten definuje způsob zakódování desetinných čísel do 32, resp. 16/64/128, bitů. | ||
- | |||
- | {{: | ||
- | |||
- | Pro příklad | ||
- | |||
- | $$ 0, | ||
- | |||
- | Nejprve převedeme číslo do věděcké notace | ||
- | |||
- | $$ 0, | ||
- | |||
- | Na první pohled vidíme znaménko (kladné -> 0) a mantisu (10101). | ||
- | Exponent se zapisuje v tzv. posunuté formě. Posun lze stanovit jako | ||
- | |||
- | $$ 2^{j-1}-1 $$ | ||
- | |||
- | kde $j$ je počet bitů pro vyjádření exponentu. Vždy jde o kladné číslo, pro 8bit jde o posun o 127. | ||
- | |||
- | Exponent v našem příkladu vypočteme tedy jako $$ 2^{8-1}-1 -1 = 127 -1 = 126$$ | ||
- | |||
- | Nyní můžeme hledané desetinné číslo zapsat jako | ||
- | |||
- | {{: | ||
- | |||
- | Podle hodnoty exponentu rozlišujeme navíc speciální případy | ||
- | |||
- | |Exponent |Mantisa |Hodnota| | ||
- | |00000000 | 0 | 0.0 – čistá nula| | ||
- | |00000000 |nenulová | Denormalizovaná čísla blízká 0| | ||
- | |00000001 |0 | nejmenší normalizované číslo se skrytou 1 v mantise| | ||
- | |1 až 254 |cokoliv | normalizovaná čísla, skrytá 1 v mantise| | ||
- | |11111111 |0 | nekonečno| | ||
- | |11111111 |nenulová | NaN chybná hodnota| | ||
- | |||
- | Pozor... kontrola rovnosti při operacích s desetinnými čísly může [[https:// | ||
- | |||
- | === Denormalizovaná čísla === | ||
- | * čísla které mají exponent nulový ale mantisu nenulovou. | ||
- | * Umí vyjadřovat extrémně malá čísla | ||
- | * Klasicky mají čísla v mantise " | ||
- | * denormalizovaná čísla umí zobrazit čísla v mantise typu $0.0001\text{a další rozvoj}$, zatímco u normalizovaných čísel je v mantise vždy $1.000\text{a další rozvo}j$ | ||
- | * Většinou o hodně pomalejší výpočet (někdy až o stovky cyklů) | ||
- | * Na některých HW platformách nejsou podporovány (ARM Neon, staré verze CUDA, legacy architektury) | ||
- | |||
- | === Operace podle rychlosti (nejrychlejší po nejpomalejší, | ||
- | - Sčítání odčítání | ||
- | - Násobení | ||
- | - Dělení | ||
- | - Odmocnina | ||
- | |||
- | |||
- | --------- | ||
==== Celá a reálná čísla ==== | ==== Celá a reálná čísla ==== | ||
Line 533: | Line 390: | ||
=== Výpočet převodu desetinného čísla do IEEE 754 === | === Výpočet převodu desetinného čísla do IEEE 754 === | ||
- | - Převeď číslo do binárního zápisu | ||
- | - Převeď desetinnou část opakovaným násobením dvěma | ||
- | - Normalizuj – posuň čárku k první jedničce | ||
- | - Zaznamenej exponent (včetně posunu) | ||
- | - Mantisa = čísla za čárkou (bez úvodní 1) | ||
- | Příklad: | + | |
- | + | - Převeď číslo do binární soustavy | |
- | $$ | + | |
- | -12.625_{(10)} = -1100.101_{(2)} = -1.100101 \cdot 2^3 | + | - Exponent ulož jako e + bias (např. +127 pro float). |
- | $$ | + | - Mantisa = binární čísla za desetinnou čárkou (bez úvodní 1), doplň na 23 bitů. |
+ | Příklad pro číslo: -12.625 | ||
* Znaménko: 1 | * Znaménko: 1 | ||
- | * Exponent: | + | |
- | * Mantisa: | + | |
- | + | * Mantisa: 10010100000000000000000 | |
- | Výsledný IEEE zápis: 1 10000010 | + | |
+ | Výsledný IEEE 754 zápis: **1 10000010 10010100000000000000000** | ||
=== Výpočetní náročnost základních operací (float/ | === Výpočetní náročnost základních operací (float/ | ||
Line 569: | Line 422: | ||
* Binární reprezentace má své specifické chování, včetně přetečení, | * Binární reprezentace má své specifické chování, včetně přetečení, | ||
* 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 ===== | ===== 2. CPU ===== | ||
- | RISC/CISC architektura, | ||
- | ** RISC/CISC ** | + | ==== RISC vs. CISC architektura ==== |
- | Reduced Instruction Set Computing vs. Complex Instruction Set Computing referuje o přístupu | + | **RISC (Reduced Instruction Set Computer)** a **CISC (Complex Instruction Set Computer)** jsou dva různé |
- | ** Registry | + | |
+ | * všechny instrukce mají stejnou délku (např. 32 bitů), | ||
+ | * menší množství jednoduchých a rychlých instrukcí, | ||
+ | * méně složitých adresních módů, | ||
+ | * ALU operuje pouze s registry, | ||
+ | * vhodné pro optimalizaci na úrovni hardware a pipeliningu, | ||
+ | * více práce na straně kompilátoru/ | ||
- | |Registr | Popis| | + | * **CISC** – complex instruction set computer: |
- | |PC | Program counter - dresa právě prováděné | + | * instrukce mají různou velikost |
- | |IR | Instruction register - obsahje kód prováděné instrukce načtený zpaměti | | + | * větší množství komplexních instrukcí, |
- | |GPR | General purpose registers – obecné uživatelské | + | * mnoho složitých adresních módů, |
- | |SP | Stack Pointer - kazuje na vrchol zásobníku, slouží k organizaci lokálních dat funkcí| | + | * ALU operuje s registry |
- | |PSW | Program Status Word – definuje v jakém stavu je procesor | | + | * jednodušší kód, složitější dekódování a provádění, |
- | |IM | Interrupt Mask – kontrola přerušení | | + | * příkladem je architektura x86. |
- | |FPR | Floating point registers – rozšíření procesoru pro práci s reálnými čísly, případně i vektorové/ | + | |
- | ** Formát RISC CPU instrukcí ** | + | === Registry === |
- | Obecně – instrukce mají 32bit, kde bity 0-7 (LSb, little endian -> " | + | Registry jsou paměťové buňky uvnitř procesoru, které uchovávají mezivýsledky |
- | ** Porovnání jednocyklového procesoru a zřetězeného zpracování instrukcí ** | + | | Registr | Popis | |
+ | |--------|-------| | ||
+ | | `PC` | Program Counter – adresa právě prováděné (nebo následující) instrukce | | ||
+ | | `IR` | Instruction Register – obsahuje kód prováděné instrukce načtený | ||
+ | | `GPR` | General Purpose Registers – obecné uživatelské registry (někdy oddělené na datové a adresové), nebo univerzální | | ||
+ | | `SP` | Stack Pointer – ukazuje na vrchol zásobníku, | ||
+ | | `PSW` | Program Status Word – definuje stav procesoru (např. příznaky přetečení, | ||
+ | | `IM` | Interrupt Mask – kontrola přerušení (která přerušení mohou být obsloužena) | | ||
+ | | `FPR` | Floating Point Registers – rozšíření pro práci s reálnými čísly a často i vektorovými či SIMD operacemi | | ||
- | Jednocyklový procesor funguje asi takto | + | **Příklad specifických registrů u architektury RISC-V:** |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | - Opakuj od kroku 2 | + | |
+ | * `x10–x17` – `a0–a7`: argumenty funkcí, | ||
+ | * `x18–x27` – `s2–s11`: zachovávané registry (callee-saved), | ||
+ | * `pc` – program counter, | ||
+ | * `f0–f31` – registry pro práci s reálnými čísly (floating point). | ||
+ | === Formát RISC instrukcí === | ||
- | Zřetězení | + | {{: |
- | Tomuto procesu se také jinak říká pipelining. | + | |
+ | RISC instrukce mají typicky pevnou délku, například 32 bitů. Jsou navrženy tak, aby se snadno dekódovaly a zpracovávaly. | ||
+ | |||
+ | * bity 0–7 – operace (opcode), | ||
+ | * následují pole pro specifikaci registrů (zdrojových, | ||
+ | * případně okamžitá hodnota (immediate). | ||
+ | |||
+ | Příklady RISC-V instrukcí: | ||
+ | |||
+ | * `add rd, rs1, rs2` – [rd] ← [rs1] + [rs2] | ||
+ | * `addi rd, rs1, imm12` – [rd] ← [rs1] + imm12 | ||
+ | * `lw rd, imm12(rs1)` – [rd] ← Mem[[rs1] + imm12] – načtení slova z paměti | ||
+ | * `sw rs2, imm12(rs1)` – Mem[[rs1] + imm12] ← [rs2] – uložení slova do paměti | ||
+ | * `beq rs1, rs2, imm12` – [pc] ← [pc] + SignImm – skok pokud jsou rs1 a rs2 rovny | ||
+ | |||
+ | === Porovnání: | ||
+ | |||
+ | **Jednocyklový procesor (non-pipelined)** | ||
+ | |||
+ | - Každá | ||
+ | - Načtení instrukce, | ||
+ | - Dekódování, | ||
+ | - Provedení, | ||
+ | - Paměťový přístup, | ||
+ | - Zápis výsledku. | ||
+ | - Nová instrukce může začít až po dokončení předchozí. | ||
+ | - Jednoduché řízení, ale nízká propustnost. | ||
+ | |||
+ | **Zřetězený procesor (pipelined)** | ||
+ | |||
+ | - Instrukce se dělí na fáze, které | ||
+ | - Umožňuje paralelní zpracování více instrukcí najednou (v různých fázích). | ||
+ | - Zvyšuje propustnost bez zvyšování taktovací frekvence. | ||
+ | |||
+ | **Pětistupňová pipeline: | ||
+ | |||
+ | - **IF** – Instruction Fetch – načtení instrukce z paměti. | ||
+ | - **ID** – Instruction Decode – dekódování instrukce, načtení registrů. | ||
+ | - **EX** – Execute – výpočet operace (např. sčítání v ALU). | ||
+ | - **MEM** – Memory – přístup do paměti (čtení/ | ||
+ | - **WB** – Write Back – zápis výsledku do registru. | ||
+ | |||
+ | Obrázek pipeline: | ||
{{: | {{: | ||
- | | + | ==== Problémy |
- | - Instruction Fetch - přivedení PC na adreosvý vstup paměti, načtení instrukce | + | |
- | - Instruction Decode - dokódování opcode | + | |
- | - 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ů | + | |
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | - **Forwarding** – předání výsledku přímo z fáze EX/MEM/WB před jeho zápisem do registru (zrychlení toku dat). | ||
+ | |||
+ | **Řídicí hazard** – nevíme, zda instrukce typu `beq` provede skok, než se spočítá podmínka: | ||
+ | |||
+ | | ||
+ | | ||
+ | - **Brzké vyhodnocení** – přesun rozhodnutí do dřívější fáze (např. ID), používá se v architektuře MIPS. | ||
+ | |||
+ | **Superskalární architektura** – využívá více ALU jednotek a přejmenovávání registrů (register renaming), čímž dále zvyšuje paralelismus a zabraňuje konfliktům v zápisu | ||
+ | |||
+ | |||
+ | |||
- | ** Jaké problémy přináší zřetězené zpracování instrukcí a jak je lze řešit – stall/ | ||
- | Za předpokladu, | ||
- | Další možné hazardy, které mohou vzniknout, jsou tzv. " | ||
===== 3. Predikce skoků ===== | ===== 3. Predikce skoků ===== | ||
jak lze predikovat skoky v programu, jak se přiřadí prediktor k instrukci, co je to spekulativní vykonávání instrukcí. | jak lze predikovat skoky v programu, jak se přiřadí prediktor k instrukci, co je to spekulativní vykonávání instrukcí. | ||
+ | |||
+ | ==== Superskalární paralelismus a větvení ==== | ||
+ | |||
+ | **Superskalární procesory** mají více výpočetních jednotek (např. více ALU), které umožňují paralelní vykonávání více instrukcí. | ||
+ | |||
+ | Rozlišení architektur: | ||
+ | * **Statická superskalární architektura** – paralelně mohou být vykonávány pouze instrukce jdoucí **za sebou**. | ||
+ | * **Dynamická superskalární architektura** – umožňuje paralelní vykonání **libovolných** instrukcí (nezávislých), | ||
+ | |||
+ | Dle typu větví: | ||
+ | * **Unifikované větve** – všechny větve vykonávají všechny typy instrukcí. | ||
+ | * **Specializované větve** – každá větev je určena pro konkrétní typ instrukcí (např. ALU, load/ | ||
+ | |||
+ | Pozor na tzv. **interferenci skoku** – pokud dvě skokové instrukce mají podobnou adresu (např. stejné poslední bity), může to rozhazovat predikce kvůli sdíleným prediktorovým tabulkám. | ||
==== Přehled predikce skoků ==== | ==== Přehled predikce skoků ==== | ||
- | Skoky v programu jsou instrukce, které mění tok programu. Většina skoků je podmíněná, | ||
- | Moderní procesory prefetchují instrukce dopředu, aby mohl mít zaplněnou pipeline a případně měnit pořadí instrukcí. Pokud narazí na podmíněný skok tak procesor neví, jestli má další instrukce načíst za skokem nebo za instrukcí následující po skoku. Toto se dá vyřešit tak, že procesor počká než se vyhodnotí podmínka skoku a pak se rozhodne, co udělat. To ale způsobuje zpoždění, | + | Skoky (branch instructions) mění tok řízení programu – buď bezpodmíněně (např. `jmp`) nebo podmíněně (např. `beq`, `bne`). |
- | Proto se používají prediktory skoků, které se snaží odhadnout, zda bude skok vykonán nebo ne a spekulativně načítá a vykonává instrukce podle toho. Pokud je predikce správná, procesor může pokračovat v načítání instrukcí bez zpoždění. Pokud je predikce špatná, procesor musí zrušit všechny instrukce, které byly načteny po špatném skoku a začít znovu. | + | |
- | - podmínka skočila = taken. | + | V moderních procesorech, |
- | - podmínka | + | |
- | Cca každá 4. až 7. instrukce | + | Řešením je použití **predikce skoků** – procesor **odhaduje**, |
- | Při skoku na vyšší adresu | + | |
+ | * **Predikce správná** → pipeline pokračuje bez zdržení. | ||
+ | * **Predikce chybná** → procesor zruší (flushne) spekulativní instrukce a začne znovu. | ||
+ | |||
+ | Statistiky: | ||
+ | * Skoková je každá 4. až 7. instrukce. | ||
+ | * 80 % skoků je **podmíněných**. | ||
+ | * Z podmíněných: 66 % je **na vyšší adresu**, 34 % **na nižší**. | ||
+ | - Skoky na nižší adresu | ||
+ | - Skoky na vyšší adresu | ||
==== Statické prediktory ==== | ==== Statické prediktory ==== | ||
- | Statické prediktory mají pro danou skokovou instrukci vždy stejnou predikci (to neznamená že například vždycky skok bude vykonán, jen to že pokud máme nějaký podmíněný skok, tak je buď vždy vykonán nebo nikdy). | ||
- | === Prediktor | + | Statické prediktory **nemění svou predikci v čase** – mají pro každou skokovou instrukci **pevně danou předpověď**, |
- | Tento prediktor vychází ze statistiky, že většina skoků | + | |
+ | === Prediktor | ||
+ | |||
+ | Tento prediktor | ||
+ | |||
+ | Tento přístup je založen na pozorování, že **většina | ||
+ | |||
+ | **Výhoda**: | ||
+ | |||
+ | **Nevýhoda**: | ||
+ | |||
+ | **Výpočet úspěšnosti**: | ||
+ | |||
+ | Bereme v úvahu: | ||
+ | * 66 % skoků | ||
+ | * 34 % skoků | ||
+ | |||
+ | Spočítáme tedy vážený průměr: | ||
+ | |||
+ | $$ | ||
+ | p_{taken} = 0.66 \cdot 0.4 + 0.34 \cdot 0.99 = 0.264 + 0.3366 = 0.6006 | ||
+ | $$ | ||
+ | |||
+ | Přibližně **60% úspěšnost** – to znamená, že v průměru | ||
+ | |||
+ | === Prediktor BTFNT (Backwards Taken, Forwards Not Taken) === | ||
+ | |||
+ | Tento prediktor bere v úvahu **směr skoku** a předpokládá: | ||
+ | * **Zpětný skok** (na nižší adresu – např. v těle cyklu) → bude **vždy vykonán (taken)**, | ||
+ | * **Skok vpřed** (na vyšší adresu – např. větvení) → nebude vykonán (**not taken**). | ||
+ | |||
+ | Tento prediktor vychází z toho, jak programy typicky vypadají: | ||
+ | * cykly se často opakují (např. for, while), | ||
+ | * větvení má nižší pravděpodobnost vykonání. | ||
+ | |||
+ | Tímto přístupem se snaží prediktor **inteligentněji** odhadnout chování bez potřeby historie. Oproti prediktoru „vždy taken“ má výrazně lepší výsledky. | ||
+ | |||
+ | **Výpočet úspěšnosti**: | ||
+ | * zpětné skoky (34 %) → predikce = taken → úspěšnost = 99 %, | ||
+ | * skoky vpřed (66 %) → predikce = not taken → úspěšnost = 60 %. | ||
+ | |||
+ | Opět vážený průměr: | ||
+ | |||
+ | $$ | ||
+ | p_{BTFNT} = 0.66 \cdot 0.6 + 0.34 \cdot 0.99 = 0.396 + 0.3366 = 0.7326 | ||
+ | $$ | ||
- | === Prediktor BTFNT === | + | Tedy přibližně **73% úspěšnost**, což je **výrazně lepší** než u prediktoru „vždy |
- | Prediktor BTFNT (Backwards Taken, Forwards Not Taken) predikuje taken, pokud se jedná o skok na nižší | + | |
+ | Statická predikce je jednoduchá | ||
==== Dynamické prediktory ==== | ==== Dynamické prediktory ==== | ||
- | Dynamické prediktory se snaží zjistit, zda se skočí | + | Dynamické prediktory se snaží zjistit, zda se skoková instrukce provede, a to na základě |
+ | |||
+ | Protože | ||
- | Většinou procesor má $2^n$ prediktorů, protože | + | V praxi bývá počet prediktorů obvykle |
{{https:// | {{https:// | ||
=== 1-bitový Smithův prediktor === | === 1-bitový Smithův prediktor === | ||
+ | Tento prediktor je nejjednodušší formou dynamického prediktoru. Používá pouze 1 bit k uchování stavu, což znamená, že má pouze dva možné stavy. | ||
Nejjednodušší prediktor, který má pouze 2 stavy. | Nejjednodušší prediktor, který má pouze 2 stavy. | ||
< | < | ||
Line 690: | Line 683: | ||
</ | </ | ||
- | Má stavy: | + | Má následující |
- | * 0 - predikce not taken | + | * 0 – predikce: skok se neprovede (not taken) |
- | * 1 - predikce taken | + | * 1 – predikce: skok se provede (taken) |
+ | |||
+ | Ve výchozím stavu bývá predikce nastavena na „taken“, | ||
+ | |||
+ | Tento typ prediktoru je rychlý a jednoduchý, | ||
+ | |||
+ | === 2-bitový Smithův prediktor === | ||
+ | Tato varianta Smithova prediktoru používá 2 bity k uchování stavu, což umožňuje rozlišit čtyři různé úrovně „jistoty“ ohledně predikce. | ||
- | Ve výchozím stavu je většinou predikce taken. Pokud je predikce správná, tak se nic neděje. Pokud je predikce | + | Díky dvěma bitům si prediktor může dovolit „chybu navíc“, než změní svůj názor. To znamená, že je stabilnější a méně přecitlivělý |
- | == 2-bitový Smithův prediktor === | + | Má čtyři stavy: |
- | 2-bitový Smithův prediktor má 4 stavy. 2 stavy předpovídají skok a 2 stavy předpovídají neskok. Předpověď závisí na minulém chování, ale toleruje jednu odchilku od pravidelnosti. | + | * 00 – silná predikce: skok se neprovede |
+ | * 01 – slabá predikce: skok se neprovede | ||
+ | * 10 – slabá predikce: skok se provede | ||
+ | * 11 – silná predikce: skok se provede | ||
- | Má 4 stavy: | + | Výhoda tohoto prediktoru je, že není tak citlivý na náhodnou odchylku. Například, |
- | * 00 - predikce not taken | + | |
- | * 01 - predikce weakly not taken | + | |
- | * 10 - predikce weakly taken | + | |
- | * 11 - predikce taken | + | |
< | < | ||
Line 744: | Line 743: | ||
</ | </ | ||
+ | |||
+ | === 2-bitový prediktor s hysterezí === | ||
+ | Tento prediktor je mírně odlišnou variantou 2-bitového Smithova prediktoru. Podobně jako on má čtyři stavy, ale interpretace těchto stavů je zaměřena na zachování hystereze – tedy odolnosti vůči jednorázovým výkyvům. | ||
+ | |||
+ | Hystereze zde znamená, že prediktor nezmění názor ihned po první chybě, ale až po opakované. Tím se eliminuje „přepínání sem a tam“, které by nastávalo u prediktoru bez hystereze, když se chování skoku často mění. | ||
+ | |||
+ | Prediktor má 4 stavy a pro přechod mezi skupinami „skok“ a „neskok“ je třeba dvou po sobě jdoucích opačných výsledků. Díky tomu se předpověď mění méně často a je stabilnější. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Prediktor s hysterezí je v podstatě standardní 2-bitový prediktor – pokud je ale konkrétní zápis výslovně odlišen jako "s hysterezí", | ||
=== Hodnocení prediktorů === | === Hodnocení prediktorů === | ||
- | Je nemožné rozhodnout obecně, který prediktor je nejlepší. Vždy lze najít protipříklady, kdy se každý z uvedených | + | Nelze jednoznačně říct, který prediktor je nejlepší, protože jejich výkonnost se liší podle konkrétního programu. Některé prediktory jsou lepší při pravidelném chování skoků, jiné při složitějších vzorcích. |
+ | |||
+ | Z tohoto důvodu se kvalita | ||
- | Jediná možnost je statistická analýza různých programů. | + | | Typ prediktoru | Úspěšnost predikce | |
- | % tabulka s úspěšností | + | |----------------|---------------------| |
+ | | Statický prediktor – vždy skočí | 59.25 % | | ||
+ | | 1-bitový Smithův prediktor | 68.75 % | | ||
+ | | 2-bitový | ||
- | | Statický prediktor - vždy skočí | 59.25% | | + | Z tabulky je patrné, |
- | | 1-bitový | + | |
- | | 2-bitový Smithův prediktor | 81.75% | | + | |
=== Historie skoků - korelované prediktory === | === Historie skoků - korelované prediktory === | ||
Registr BHR (Branch History Register) uchovává historii posledních $n$ skoků. Na základě této historie se určuje, jaký prediktor se použije pro danou skokovou instrukci. | Registr BHR (Branch History Register) uchovává historii posledních $n$ skoků. Na základě této historie se určuje, jaký prediktor se použije pro danou skokovou instrukci. | ||
- | | + | * Pokud se skočilo pak obsahuje BHR 1, pokud se neskákalo pak obsahuje 0. |
- | - Nová informace se vloží do BHR na nejnižší bit a ostatní bity se posunou. | + | |
- | + | ||
+ | Díky tomu má procesor přehled o tom, jak vypadala nedávná historie větvení a může ji využít k přesnější predikci. | ||
Vybíráme prediktor podle BHR a adresy skokové instrukce. | Vybíráme prediktor podle BHR a adresy skokové instrukce. | ||
Takže místo toho abychom prediktor vybírali jen podle adresy skokové instrukce, tak vybíráme prediktor podle adresy skokové instrukce a historie posledních skoků. | Takže místo toho abychom prediktor vybírali jen podle adresy skokové instrukce, tak vybíráme prediktor podle adresy skokové instrukce a historie posledních skoků. | ||
Line 767: | Line 782: | ||
== Gshare == | == Gshare == | ||
- | Je téměř stejný jako BHR, ale místo toho aby se bral prediktor podle adresy | + | Varianta korelovaného prediktoru. Místo přímého spojení |
+ | |||
+ | Výpočet indexu: $index = BHR \oplus PC_{\text{lower bits}}$ | ||
+ | |||
+ | Výhoda: | ||
+ | * XOR pomáhá **rovnoměrněji rozdělit adresy** po predikční tabulce, | ||
+ | * snižuje kolize mezi různými skoky (lepší rozlišitelnost). | ||
{{https:// | {{https:// | ||
=== Turnajový prediktor === | === Turnajový prediktor === | ||
- | Turnajový prediktor je složený z několika | + | Kombinuje více prediktorů |
- | Má lepší úspěšnost než korelované prediktory. | + | **1-bitový turnajový prediktor** funguje následovně: |
+ | |||
+ | - Nechá **oba prediktory (P1, P2)** spočítat predikci. | ||
+ | - Pokud se **shodují** → použije se jejich predikce. | ||
+ | - Pokud se **liší**, zvolí se predikce podle toho, **který byl naposledy úspěšnější** (uloženo v jednom bitu). | ||
+ | - Po skutečném vykonání skoku se informace o úspěšnosti aktualizuje. | ||
+ | |||
+ | Výhoda: | ||
+ | * výběr nejlepší predikce pro daný typ kódu (cykly, větvení, vzory), | ||
+ | * vyšší úspěšnost než kterýkoli jednotlivý prediktor. | ||
- | Jak funguje 1-bitový turnajový prediktor | ||
- | - Vypočti predikci prediktory P1 a P2. | ||
- | - Pokud se predikce shodují je výsledkem tato predikce. | ||
- | - Pokud se predikce neshodují: | ||
- | - Výsledná predikce je podle toho, který prediktor byl v minulosti úspěšný. Tato informace je uložena v 1-bitovém stavovém automatu. | ||
- | - Podle skutečnosti vyber prediktor P1, nebo P2 pro příští predikci. | ||
{{https:// | {{https:// | ||
Line 796: | 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, | ||
+ | * Tento systém je založen na tzv. **paměťové hierarchii**, | ||
+ | * 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í, | ||
+ | * **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ší, | ||
+ | |||
+ | * 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. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | {{/ | ||
+ | |||
+ | * 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ší, | ||
+ | * Porovnání parametrů různých typů pamětí: | ||
+ | * **L1 SRAM** – 32 kB, velmi rychlá (0.2–2 ns), | ||
+ | * **Sync SRAM** – 1 MB, rychlá (0.5–8 ns/ | ||
+ | * **DDR3 (DRAM)** – 16 GB, střední propustnost (15 GB/ | ||
+ | * **HDD** – 3 TB, velmi pomalé (100 MB/ | ||
+ | * Některá data mohou existovat ve více kopiích (např. L1, L2, RAM). | ||
+ | * Aby nedocházelo k nesrovnalostem, | ||
+ | |||
=== 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. | + | |
- | Procesor provádí většinu operací nad registery (např. sčítání, | + | |
- | 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é, | ||
- | === 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, | ||
+ | * Systémy s více paměťovými kanály (dual-channel, | ||
+ | |||
+ | === 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ší, | ||
+ | * 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, | ||
+ | |||
+ | ==== 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ý, | 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ý, | ||
Moderní procesory mají několik úrovní cache pro optimální výkon: | Moderní procesory mají několik úrovní cache pro optimální výkon: | ||
- | | + | |
+ | | ||
* 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ř | + | * 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í, | ||
- | 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 | + | * Toto rozložení samozřejmě není univerzální, |
+ | * 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 | ||
=== Organizace Cache === | === Organizace Cache === | ||
- | * **Word size (WS)** | + | * **Word size (WS)** |
- | * **Capacity** (C) - kapacita cache v bytech nebo ve slovech | + | * **Capacity (C)** – kapacita cache v bytech nebo ve slovech. |
- | * **Block size (BS)** | + | * **Block size (BS)** |
- | * **Number of sets (SN)** | + | * **Number of sets (SN)** |
- | * **Index** | + | * **Index** |
- | * **TAG** | + | * **TAG** |
- | * **Validity bit** - bit platnosti, indikuje zda jsou data na řádku platná. | + | * **Validity bit** – bit platnosti, indikuje, zda jsou data na řádku platná. |
- | * **Dirty bit** - rošiřující pole v obsahu paměti. Indikuje že v cache je jiná hodnota, než v paměti | + | * **Dirty bit** – rozšiřující pole v obsahu paměti. Indikuje, že v cache je jiná hodnota než v hlavní |
- | * **Degree of associativity (N)** - Počet tabulek | + | * **Degree of associativity (N)** – počet tabulek. |
- | * **Number of blocks (BN)** | + | * **Number of blocks (BN)** |
- | * **Cache hit** (zásah) - pojmenování | + | * **Cache hit** – situace, kdy se požadovaná |
- | * **Cache miss** | + | * **Cache miss** |
- | * **Cache line nebo Cache block** | + | * **Cache line nebo Cache block** |
- | * **Hit rate** | + | * **Hit rate** |
- | * **Miss rate** 1 - Hit rate | + | * **Miss rate** |
- | * Average Memory Access Time (AMAT) | + | |
- | * AMAT pro více urovňovou cache lze spočítat rekurzivní použitím výše uvedeného | + | * Pro vícestupňové cache se AMAT počítá rekurzivně podle stejného |
- | * **Cache replacement policy** | + | * **Cache replacement policy** |
- | * Random | + | |
- | * LRU (least recently used) - nejdéle nepoužitá položka | + | |
- | * LFU (least frequently used) - sleduje jak často se k položkám přistupuje | + | |
- | * ARC (Adaptive | + | |
- | * **Write through (zápis, | + | * **Write through (propsání skrz)** |
- | * **Write back** | + | * **Write back** |
== Plně asociativní cache == | == Plně asociativní cache == | ||
- | Znamená že $\text{Degree of associativity} = text{Number of blocks}$, pro každý řádek | + | Znamená, že $\text{Degree of associativity} = \text{Number of blocks}$. Každý řádek |
- | **vlastnosti: | + | |
- | * 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, | + | * Tag musí obsahovat téměř celou adresu |
- | * Používá se v aplikacích kde je potřeba extrémní rychlost, takže třeba TLB (translation lookaside buffer, pro překlad virtulní na fyzickou paměť), potřebuje být velmi malá. | + | |
- | {{: | + | |
+ | * **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, | ||
+ | * 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ů. | ||
+ | |||
+ | {{: | ||
== Přímo mapovaná cache == | == Přímo mapovaná cache == | ||
- | * 1 cestná cache $\rightarrow$ | + | * 1-cestná cache → stupeň asociace = 1, tedy pouze jedna tabulka. |
- | * $\text{number | + | * $\text{Number |
- | * má index o délce bitů $log(\text{number | + | * Index má délku |
+ | |||
+ | * 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**: | + | * **Schéma:** |
{{: | {{: | ||
- | **Příklad s většími bloky:** | + | * **Příklad s většími bloky:** |
{{: | {{: | ||
- | **Vlastnosti: | + | * **Vlastnosti: |
- | * Hlavní cache u mikrokontrolerů a levných procesorů | + | * Hlavní |
- | * Má velkou | + | * Důvodem je jednoduchá a levná implementace, |
- | * Každou adresu | + | |
+ | * 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 | ||
== N-asociativní cache == | == N-asociativní cache == | ||
- | * **Obecnější model cache** | + | * **Obecnější model cache**, kde je stupeň asociace |
+ | |||
+ | * 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. | ||
{{: | {{: | ||
- | === RAM === | + | * Tento typ organizace nabízí kompromis mezi plně asociativní |
- | + | * **+** 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í | + | |
- | 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 | + | |
- | 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 907: | Line 1002: | ||
periferie mapované do paměti, sériový port, sběrnice – sériová/ | periferie mapované do paměti, sériový port, sběrnice – sériová/ | ||
- | RISC-V nemá speciální instrukce pro komunikaci s periferiemi, místo | + | ==== Periferie mapované do paměti ==== |
+ | * RISC-V nemá speciální instrukce pro komunikaci s periferiemi. | ||
+ | * Místo | ||
+ | * 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**: | ||
+ | * **Synchroní sběrnice**: | ||
+ | * Tento způsob je jednoduchý na implementaci, přehledný a často používaný v embedded systémech. | ||
+ | * Komunikace přes paměťovou mapu je vhodná pro zařízení, | ||
- | velmi jednoduchá konfigurace - periferie | + | ==== Sériová vs paralelní sběrnice ==== |
+ | * **Paralelní sběrnice** | ||
+ | * Vyšší propustnost, | ||
+ | * **Sériová sběrnice** | ||
+ | * Nižší náklady | ||
+ | * 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/ | ||
+ | * 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 | ||
+ | * **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 | + | |
- | * 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í | + | === Asynchronní |
- | * 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í | + | === Synchronní |
- | 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í |
- | + | * **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í | + | |
- | + | ||
- | RX_ST - stav přijímání dat | + | |
- | | + | |
- | RX_DATA - přijatá data | + | |
- | | + | |
- | TX_ST - stav odesílání dat | + | |
- | | + | |
- | TX_DATA - data k odeslání | + | |
- | | + | |
=== PCI === | === PCI === | ||
- | sběrnice | + | * **Paralelní synchronní |
- | + | | |
- | | + | |
- | | + | |
- | | + | |
- | - pokud je cílová periferie | + | |
- | | + | |
- | | + | |
- | | + | * **Nevýhody: |
- | + | * Half-duplex | |
- | PCI je half-duplex, nelze současně posílat data oběma směry. | + | * Sdílená |
- | + | * Omezená přenosová rychlost – 33 nebo 66 MHz: | |
- | Více zařízení na sběrnici - pomalá | + | * 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 | + | * Velmi vysoké rychlosti, ale vyžaduje kvalitní spoje – i drobné rozdíly v délce vodičů nebo kvalitě mohou narušit komunikaci. |
+ | * Nahrazuje klasické PCI u moderních | ||
- | je full-duplex, |