APO Flashcards

1
Q

von Neumannova architektura pocitace

A

Zakladni deleni pocitace na 3 casti:

  1. Procesor - vykonava instrukce:
    • control unit - ma registry a ridici hradla ktera dekoduji a provadi operace,
    • ALU - aritmeticko-logicka jednotka
  2. Pamet - slozena z bunek - bajtu, stejna pro program i data
  3. I/O - klavesnice, mys, monitory, sluchatka….

Ma instrukce a data zapsane do stejne pameti dohromady (oproti Harvardske architekture, ktera ma dve ruzne pameti)

Program predepisuje instrukce, ktere ma pocitac vykonat. Program je nahran do pameti, tedy instrukce jsou sekvencne za sebou a postupne je procesor cte, instrukce jsou aritmeticke a logicke operace, presuny dat, skoky a vetveni…

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

CPU, co to je a co obsahuje v sobe

A

Central Processing Unit - vykonava instrukce.

  1. Uzivatelske registry - nekolik standardnich “ulozist” pro promenne, tedy do registru (ktery je pevne zadan pro konkretni ucel) zadam hodnotu a tim komunikuju s CPU (treba do registru zadam 2 cisla abych je secetl), je to pamet primo na CPU, tedy extremne rychla
  2. ALU - arithemtic logical unit - umi provadet aritmeticke operace na datech.

CPU nacita z pameti instrukce sekvencen a kazdou z nich vykona. Adresa aktualni instrucke je v registru PC nebo IP

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Pocitacova pamet, zakladni definice

A

Uchovava data - bajty, slova
Je to ocislovany seznam bajtu
Je to jako pole, do ktereho mohu zapisovat a cist

Velikost adresy urcuje i velikost pameti - tedy pokud mam 32-bitovou adresu, tak mohu zakodovat 2^32 adresnich bunek

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Instrukce procesoru, zakladni prehled

A

Instrukce jsou jedine cinnosti, ktere CPU umi vykonavat - nacte instrkci - vykona - cte dalsi…

Pracuje s daty, ktere umi skladat do registru (jako do promennych) a posilat je dal do ALU:

  1. Ulozit konstantu do registru
  2. Nacist data z pameti do registru
  3. Ulozit data z registru do pameti
  4. Provest mat. operaci s registry a vysledek ulozit do registru
  5. Porovnat dve cisla
  6. Podle vysledku porovnani provest jinou instrucki - skok v programu

VSECHNY PROGRAMY, ktere provadeji i slozite vypocty se stejne kompilatorem prelozi na tyto zakladni typy

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Instruction Set Architecture (ISA), definice

A

Je to Architektura souboru instrukci.

Tedy kompletni instrukcni sada vcetne adresnich modu a specifikaci

// mam nekolik druhu, jak mohou vypadat instrukce (neco jako programovaci jazyky maji svuj syntax, tak i instrukce mohou byt ruzne a pracovat s ruznymi adresami)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Priklady ISA a co musi obsahovat

A

ISA obsahuje:
1. Samotne instrukce
2. Podporovane datovy typy (cela cisla, cela cisla se znamenkem, realna)
3. Registry
4. Adresni mody
5. Organizace pameti,

Toto charakterizuje instrukcni sadu.

Prikaldy: x86, ARM, MIPS, RISC-V

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Rozdil mezi RISC a CISC

A

Reduce/Complex Instruction Set Computer

Tedy pocitac muze byt postave na zaklade RISC nebo CISC sady instrukci, tj jeho procesor “rozumi” RISC nebo CISC instrukcim

RISC je mensi, odlehceni a jednodussi model

CISC - ruzne dlouhe instrukce, nejcastejsi jsou nejkratsi
RISC - stejne dlouhe 32 bitove instrukce, jednoduchy inkrement PC+4, skoky na nasobky 4 ALE
do instrukce se nevejde cele 32-bitove cislo (je potreba 2 operace nacteni po 16 bitech), ma obecne delsi program nez CISC

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Booleovska algebra, operace and, or, not a komplexnejsi

A

Booleovska algebra je matematicka struktura, ktery ma pouze dve hodnoty, popisujici ano/ne

  1. Or: operace + (nebo)
    0+0 = 1, 1+0=1, 0+1=1, 1+1=1
  2. And: operace * (zaroven)
    00 = 0, 10 = 0, 01 = 0, 11 = 1
  3. Not: negace
    not 0 = 1, not 1 = 0

Vsechny komplexnejsi oprace jako (nand, nor, xor…) jsou pouze kombinaci techto zakladnich

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Logicky obvod, definice

A

Je to zapojeni vodicu tak, ze podle napeti na vstupu splnuji booleovske operace. Jejich kombinaci muzeme ziskavat komplexnejsi vysledky

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Jak scitat binarni cisla v ALU?

A

Pomoci binarni scitacky:

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Operace shift

A

Je posun doleva/doprava o 1 bit.

treba
001 -> 000 posun doleva, pokud mam jen 3 mista
010 -> 001 posun doprava, pokud mam jen 3 mista

Tedy rotuju a pridavam nuly zleva a ubiram prvky vpravco

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Binarni cislo

A

Je to takove cislo, ktere je reprezentovano ve dvojkove soustave a jeho zapis se do desitkove soustavy prepise jako:

101001011 znamena:
1(2^8) + 0(2^7) + 1(2^6) + 0(2^5) + 0(2^4) + 1(2^3) + 0(2^2) + 1(2^1) + 1*(2^0), tedy

Posloupnost mocnic 2^0 - 2^12
1, 2, 4, 8, 16, 32, 64, 128, 256, 518, 1024, 2048, 4096

Tedy priklad:
1024 + 256 + 8 + 2 + 1 = 1291

dek_cislo = Suma ai*(2^0)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Zakladni velikosti ukladanych cisel v pocitaci

A

Bit - nejmensi velikost 1, je to jen jedno policku s hodnotou 1/0, tedy dvojkovy bit reprezentuje cislo pouze 0-1

Nible: 4 bity, reprezentuje cisla 0-15, tedy je to:
_ _ _ _, kam mohu dosadit 0000=0, 1111=15 (hexadecimalni cislo)

Bajt: 8 bitu, _ _ _ _ _ _ _ _, tedy 0-255, zakladni jednotka pameti - slovo

Unsigned char - 1 bajt, cisla 0-255
Unsigned short int - 2 bajty, cisla 0-65535
Unsigned int - 4 bajty, cisla 0-4,3 miliardy

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Ulozeni cisel v pameti - Big/Little endien

A

Bit Endien - ulozeni nejvyssho bajtu jako prvni v pameti, nizsi bajty jdou dal, Motorola

Little Endiend - nejmene vyznamny bajt (posledni z cisla) je ulozen jako prvni v pameti, Intel

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Sestnactkova soustava

A

Cislo je zapsano pomoci mocnin 16.

ma cislice: 0-9
ma pismenka: A-F, kde
A = 10,
B = 11,
…,
F = 15

Slovo/cislo:
0A0B0C0D v pocitace znamena zapis:
0000A0000B0000C0000D, ale zkracuje se zapis

Kazde pismenko sestnackve soustavy je samo o sobe binarni cislo o 4 bitech:
A = 1010.

Takze celkovy zapis je:
(0000)(1010)(0000)(1011)(0000)(1100)(0000)(1101)

Tedy 32 bitu - 4 bajty, ktere treba delim 0A, 0B, 0C, 0D

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Jak slovo 0A0B0C0D zapise v pameti Big/Little/Midle endien?

A

Big - stejne, nejvyssi bajt jako prvni:
0A, pak 0B… => 0A0B0C0D

Little - obracene, posledni bajt jako prvni:
0D, 0C,… => 0D0C0B0A

Midle - kombinace od poloviny slova
0B0A0D0C

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Prevod desitkoveho cisla do binarniho

A

Dva kroky:

  1. Cislo % 2 = nove_cislo + zbytek (0|1)
  2. nove_cislo % 2 = nove_nove_cislo + zbytek (0|1)…

Tedy poradim delam modulo 2 a zapisuju si zbytky v obracenem poradi

Na konci prepisu 0|1 z 1. kroku v OBRACENEM poradi:

2437 do bin. soustavy:
1. 2437 % 2 = 1, delim 2
2. 1218 % 2 = 0, delim 2…
3. 609 % 2 = 1
4. 304 % 2 = 0
5. 152 % 2 = 0
6. 76 % 2 = 0
7. 38 % 2 = 0
8. 19 % 2 = 1
9. 9 % 2 = 1
10. 4 % 2 = 0
11. 2 % 2 = 0
12. 1 % 2 = 1
13… vzdy 0

  1. pozice je moje prvni, 1. pozice je posledni, tedy zleva dorpava pisu jako zespoda nahoru:
    100110000101
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Dvojkovy doplnek pri pocitani s cisly se znamenky

A

Prvni bit cisla reprezentuje znamenko (ale take se podili na hodnote)
0 -> +
1 -> -,
Nech mam zadane cislo M, pak od 0 do M/2 - kladna cast - ma standardni reprezentaci v bin. soustave.
ALE
-M/2 do 0 - zaporna cast - ma DOPLNKOVY tvar, tedy
1. zapisu jakoby jeji kladnou hodnotu (z -12 udelam 12 a zapisu v bin. podobe)
2. INVERTUJU VSECHNA ZNAMENKA (0->1, 1->0),
3. Prictu 1 => doplnkovy tvar, ukazuje zaporna cisla

  1. bit mi urci znamenko hned od pohledu:

01111111 -> + 127
kdyz k tomu prictu 1:
10000000 -> - 128

Tedy pokud od 0:
00000000 odectu 1:
00000001
__________ dostanu:
11111111 -> coz je -1

PULI MI TO CELKOVY ROZSAH NA DVE POLOVINY PRO ZNAMENKOVA CISLA, KDE ZAPORNYCH JE O 1 VIC, PROTOZE 0 PATRI DO KLADNYCH:
signed char = -128 az 127…

Dvojkovy doplnek cisla 98:
1. Do bin. soustavy: 1100010
2. Doplnit na 8 bitu, nebo 16, atd…: 01100010
3. Inverze: 10011101
3. Prictu 1: 10011110

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Binarni scitacka, definice

A

Je zarizeni, ktere je schopno secist dve binarni cisla. Dela to normalne jako pod sebou a vypocita pro kazdou pozici zvlast jak vysledek pozice, tak i carry dal.

Treba scitam cisla:

A4A3A2A1A0
+ B4B3B2B1B0
———————
C4S4S3S2S1S0

Tedy po slozkach sestu sumu jako Si, a vysledek muze mit cary Ci.
Kazdy castecny soucet Ai+Bi muze byt ovlivnen C(i-1) z predchoziho souctu, tedy:

Ai + Bi + C(i-1) = SiCi

1-Bitova scitacka dela presne toto:
je to takovy V, kde nahore bere Ai a Bi, dole vyprodukuje Si, zleva vyprodukuje Ci, a zprava bere C(i-1) pripadne.

Takove scitacky muzeme retezit za sebou - tim dostnanu N-bitovou scitacku (KTERA MI SECTE DVE N-BITOVA CISLA HNED JAKO POD SEBOU), ale je to pomaly, protoze kazda dalsi scitacka musi cekat na Ci vsech scitacek pred sebou, tedy je to operace slozitosti N.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Ripple Carry Adder VS Carry Look Ahead Adder

A

Ripple Carry Adder je obycejne retezeni 1-Btovych scitacek za sebou, kdy mam vyslednou N-Bitovou scitacku (secte dve N-bitova cisla) ale je to pomaly, protoze vzdy musim cekat na Carry z predchozi scitacky.

Carry Look Ahead Adder predikuju mozny predchozi Carry uz z cisel, ktera vstupuji do predchozi scitacky. Tedy C(i-1) predikuje podle A(i-1) a B(i-1). Dve varianty, kdy vznikne prenos:

  1. Generovani carry: A=1, B=1 => nutne pri A+B vznikne carry=1
  2. Propagace: A=1, B=0, C=1 => preposlu carry, pokud alespon jeden z A,B neni 0

Tedy rekurentni vztah pro odhad pripadneho carry je:
C1 = G0 + P0*C0 // carry z 1. souctu je bud vygenerovan v aktualnim souctu NEBO je propagovan z predchoziho souctu
C2 = G1 + P1C1
C3 = G2 + P2C2
G4 = G3 + P3C3…

Tento pristup je rychlejsi, protoze nemusi cekat na carry predchozi, ale spocita ho hned ze zadanych cisel, tedy rychlost je konstantni

Jeste rychlejsi algortimus je pomoci stromove struktury, kde je slozitost log(n)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Binarni nasobicka

A

Bud normalne pod sebou to vynasobim jako kdbycyh to delal v dekadicky soustave.

Nebo soucin A*B je jenom B-krat soucet A samo se sebou pomoci B scitacek kde vstup je A+A.

Nebo pomoci nasobicky ktera se sklada z pasky, kam zapisuju mezi vysledek a ze ktere vyctu vysledek, jedne scitacky a operace & (and).

  1. Necht A=4 bity, B=4 bity, AB=C, kde C=4+4=8 bitu
  2. Vytvorim tedy pasku delky 8 bitu.
  3. Rozdelim pasku na [0…0 | B], tedy pulka jsou nuly, na druhou pulku dam B a vzdy si ohranicim POSLEDNI bit pasky - kteremu budu rikat b (a bude se menit furt)
  4. Postavim bin. scitacku, ktera jako LEVY vstup bere LEBOU cast pasky a jako PRAVY vstup bere A&b, tedy bitovy AND A s b (to znamena, ze mi bud zustane samotne A, nebo samotne nuly).
  5. Vysledek scitacky se PRICTE K LEVE strane pasky.
  6. Cela paska se shiftuje doprava o 1 bit.
  7. Novy posledni bit b znovu poslu do (A&b) -> sectu s levou casti pasky -> prictu mezivysledek k leve casti pasky -> shift doprava -> …

Tento proces delam tolikrat, jak je dlouhe cislo B (neboli kratsi z nich).
Po tom, co jsem provedl posledni krok (dostal jsem i carry???) -> udelam posledni rotaci doprava (aby se mi carry veslo na pasku) a je to hotovy vysledek.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Jak fyzicky reprezentovat bit/bajt?

A

Jako vodic napetim, tj bajt je 8 ruznych vodicu se svymi hodnotami

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Co znamena operace shift vzhledem k binarnimu cislu

A

nasobeni/deleni mocninou 2

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Dva druhy reprezentace zaporneho cisla

A
  1. Vrchni bit urcuje znamenko: ale mensi rozsah, mame 0 a -0, potrebujeme jiny algoritmus na scitani
  2. Dvojkovy doplnek: scitani funguje jak jsme si definovali, odecitani je jenom pricitani opacneho cisla, opacny cislo udelam jako dvojkovy doplnek.
    Tedy A-B = A+(-B), -B vyrobim jako B -> inverze symbolu -> +1

Dvojkovy doplnek je jakysi uzavreny cyklus:
pocitam od 0 do 01111111 (do 127). Kdyz prictu 1, tak se dostanu do 10000000 (toto prohlasim za -128) a kdyz budu dal pricitat 1, tak to funguje primocare: 10000001 (-127), 10000010 (-126) …
Takze je to jako:
0 -> max, max + 1 = -min, min+1 = min+1…

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Preteceni pri scitani cisel

A

Muze k tomu dojit i pri scitani bezznamenkovych cisel.
Bez znamenek - je to situace, kdy pri nejake operace vznikla carry hodnota, ktera se uz ale nevejde do 8-bitoveho slova, tedy se ztrati.
Rozpoznam - vysel mi vysledek mensi treba nez jsem ocekaval, protoze nejvyssi mocnina dvojky se mi ztratila

Znamenka: pri situaci, kdy dojde k prenosu carry na poslednich cifrach, ale nedojde k preneseni carry na predposlednich cifrach, tedy treba
10100110 +
11010110
—————
1|01111100, tedy na zacatku mam carry 1, ktery se uz nevejde, ALE prisel jsem o informaci, ze puvodni prvni cifry byly 1, tedy to byla zaporna cisla, ale jejich suma dala kladne cislo - chyba

Rozpoznam: soucet dvou zapornych cisel dava kladny, soucet dvou kladnych cisel dava zaporny vysledek.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Jak zapsat realne cislo s desetinnou carkou binarne, obecne definice

A

1100101.10101

Pred des. carkou normalni postup. Vse napravo od desetinne carky je identicky postup, ale beru zaporne mocniny dvojky, tedy:

…| 2^(-1) + 2^(-2) + 2(-3) ….

64, 32, 16, 8, 4, 2, 1, 1/2, 1/4, 1/8, 1/16, 1/32, 1/64…

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q

Vedecka notace zapisu realnych cisel, definice

A

Treba 12345,67 se zapise jako:
1,234567 * 10^4, tedy desetinnou carku jsem ponusul o 4 pozice doleva, musime cislo vynasobit 10^4 abych ziskal jeho puvodni tvar

jinak: 1,234567E+4 - tedy musim pohnout desetinnou carkou o 4 pozice doprava, abych ziskal puvodni tvar cisla. Vzdy ve vedecke notaci je pouze 1 cislice, nasledovana zbytkem cifer a exponent.

To samy pro binarni zapis: 11010.1101 se rpepise na:
1.10101101E+4, ALE v bin. soustave neexistuje cifra 4, tedy ji prepisu jako 100:
1.10101101E+100 - des. carku posun o 4 (100) pozice doprava a dostanes puvodni tvar

Naopak zaporna exponent znamena, ze des. carku musis posunout doleva - male cislo

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
28
Q

IEEE standard pro ulozeni float cisla v pocitaci

A

Pro realna cisla s desetinnou carkou.
Float - 32 bitu.

  1. bit - znamenko, 0=+, 1=-
  2. bitu exponent zvetseny o +127
    23 bitu = samotna mantisa, v normalizovanem pripade ma jeste skrytou jednicku, ktera se nepise, protoze je jasny, ze tam stejne je

[znamenko] [exponent+127] [mantisa]
1 bit, 8 bitu, 23 bitu

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

Normalizovane/denormalizovane cislo

A

Normalizovane - takove, co ma skrytou jednicku, tedy ve vedecke notaci je ve formatu:
1, neco….E+-neco

Denormalizovane - nema skrytou jednicku, treba 0, -0, +- nekonecno, NaN, cisla mensi nez 1e-127

A) Exponent i mantisa = 0 => zapis pro +- 0 v IEEE:
[0|1][8 nul][23 nuly]

B) Exponent 0, mantisa nejaka => cisla mensi nez 1e-127:
[1|0][8 nul][00001010..] = 1.01e-(127 + 5 (posun)) = 1.01e-132

C) Exponent same 1, mantisa 0 => +- nekonecno
[1|0][8 jednicek][23 nuly]

D) Exponent same 1, mantisa nenulova => NaN
[1|0][8 jednicek][alespon 1 jednicka]

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

Jak prevest des. cislo na IEEE?

A
  1. Bud pomoci online nastroje - schmidt float converter - vzdy zaskrtavam exponenty a mantisu tak, aby tmp cislo bylo mensi nez moje hledane a postupne ho zpresnuju dokud nemam presnou reprezentaci (ale 0.1 nejde zapsat presne binarne)
  2. Vypoctem
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

Scitani dvou realnych cisel v IEEE

A

Dekadicka soustava:
2,2785e+3 + 8,203125e-2
1. Prevedu na vetsi spolecny exponent e+3 a sectu pod sebou:
2.2785 e+3
0.00008203125e+3
—————————
2.27858203125e+3 => hotovo

Stejny princip pro binarni: prevedu na stejny exponent a sectu mantisu
1, 000 1110 0110 1000 0000 0000e+11
0, 000 0000 0000 0001 0101 0000e+11
——————————————————-
1, 000 1110 0110 1001 0101 0000e+11 => hotovo
V tomto pripade NEMAM problem, ze by pred dest. carkou byly dve cifry, ale muze mi vzniknout vysledek takova tvaru:

10,01010…e+3 Ale IEEE stanovuje 1 cifru max pred des. carkou, tedy cislo rotuju a zvetsuju exponent o 1:
1.001010…e+4

Pokud mi pri odcitani vyjde tvar 0.00001…e+11, tak naopak rotuju doleva tak dlouho, dokud nenarazim na prvni 1. Tolikrat ale musim i snizit exponent:
1.neco…e+6

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

Dulezite registry

A

PC - adresa vykonavane instrukce, nebo pristi
IR - obsahuje kod provadene instrukce nacteny z pameti
SP - stack pointer

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
33
Q

Zakladni cyklus behu procesoru

A
  1. Pocatecni anstaveni - inicializace registru PC po zapnuti proudu nebo resetu.
  2. Precti prvni instrukci z pameti z adresy PC:
    • podivej se do pameti na adresu PC,
    • precti obsah instrukce do IR (kod instrukce),
    • posun PC o delku instrukce (jdi na dalsi instrukci)
  3. Dekoduj instrukci IR
  4. Proved instrukci:
    • spocti adresu, vyber registry, nacti operandy, proved vypocet ALU, uloz vysledky…
  5. Zkontroluj preruseni a vyjimky
  6. Opakuj krok 2….
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
34
Q

Jak velke jsou instrukce v RISC systemu a kokik je vetsinou registru

A

32 bitu a 32 registru. Umoznuje to pres 128 tisic druhu instrukci pro tri operadny

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
35
Q

8 typu instrukci v RISC-V

A
  1. Aritmetika dvou registru: add, sub, slt, or, and
  2. Aritmetika registru a immediate (konstanty):
    addi, subi, slt, or, and
  3. Cteni z pameti - lw (load word)
  4. Zapis do pameti - sw (save word)
  5. Vetveni branch - beq (branch if equal)
  6. Podprogramy - jal (jump)
  7. Navrat z podprogramu - jalr (jump … return)
  8. Nacteni hodni casti konstantny - lui (load upper immediate)
36
Q

Rychlost procesoru, co to je a jak se pocita?

A

Rychlost procesoru je doba vykonani jedne instrukce pro nejhorsi pripad - treba lw.
T = nacteni_instrukce + pristup_do_pameti + cteni_pameti + vypocet + ulozeni + vyjimka

Frekvence tohoto casu je f = 1/T v Hz.
Napriklad f = 22 700 000 instrukci za sekundu = 22 MIPS (mega instructions per second) - frekvence procesoru

37
Q

Co dela ridici jednotka CU v procesoru?

A

Prevadi bity opcodu instrukce na bity pro ALU jednotku, tedy dekoduje instrukci a posila ji dal na vyreseni.

Ma nekolik pevnych typu:
MemToReg, MemWrite, Branch, AluCOntrol, RegWrite…

38
Q

Z ceho se sklada instrukce RISC-V?

A

Z pole pevne delky 32 bitu rozdeleneho nasledovne:

[opcode][rd][funct3][rs1][rs2][funct7]

opcode - prvnich 6 bitu mi urci typ instrukce (aritmeticka, load/store, skok…), toto se dela na nejnizsi urovni prekladace, ja to nepisu primo v instrukci
rd - register destination, kam se ulozi vysledek
funct3 - 3 bity urcuje podtyp operace (napr soucet)
rs1 - prvni zdrojovy registr
rs2 - druhy zdrojovy registr (pokud je potreba)
funct7 - dalsi rozliseni operace podle potreby…

Takze treba insturkce secti registry x1 a x2 a uloz do x3:

add x3, x1, x2 prekladac k tomu pak dodoa opcode operace add:
[0000000] [00111] [00110] [000] [00001] [0110011]
funct7 rs2 rs1 funct3 rd opcode

39
Q

Proc je PC ukazatel vzdy delitelny …

A

Ctyrmi, tj skok na dalsi instrukci je vzdy PC+4, protoze instrukce ma 32, tedy zabira 4 bajty. V RISC-V je pevna velikost instrukce, tudiz presne vime, ze kazda instrukce je 4 bajty dlouha, takze dalsi ukazatel je PC+4

40
Q

Faze jednocykloveho procesoru

A
  1. Fetch - nacteni instrukce z PC
  2. Decode - dekodovani instrukce - vybere se typ funkce, registry a konstanty
  3. Execute - ALU provede operaci
  4. Memory access - zapsani do pameti
  5. Write back - zapsani do registru

Priapadne osetreni vyjimky - pokud v nejake fazi dojde k vyjimce, tak se ulozi dalsi hodnota PC (abych vedel, kam se mam vratit a kde pokracovat), provede se skok na kod, osetrujici vyjimku, po jeho ukonceni se vratim skokem zpet na puvodni misto a pokracuju v PC…

41
Q

Typy pristupu k pameti

A
  1. RAM - random access - mohu se dotazat na nahodnou cast pameti
  2. Sekvencni pristup
  3. Pro HDD, SSD, Flash je pristup mozny po celych blocich
42
Q

Druhy pameti ROM, RAM, Permanentni. VOlatilni

A

ROM - read only pameti, nelze zapisovat
RAM - zapis i cteni v libovolnem poradi
Permanentni - uchovavaji data i bez proudu (disky)
Volatilni - docasna pamet, vymaze se bez napajeni (cache)

43
Q

Hierarchie pameti - porovnani velikosti, rychlosti a ceny

A

Kdyz v CPU pri vykonavani instrukce ridici jednotka dekoduje instrukci a zjisti, jaka data musi vstoupit do vypoctu, tak data muze vytahnout z:

  1. Registry - pamet nejbliz CPU, nejrychlejsi, pouze ale $0-$31 registru, pricemz nektere jsou zabrane
  2. L1 cache - vyrovnavaci pamet na CPU, hned po registrech nejrychlesi, je to jakesi uloziste nejcasteji potrebnych dat, abych se na ne neptal opakovane do RAM, takze si je necham vedle CPU pro dalsi uziti, obecne 32kB, cena 10kc/kB, nejdrazsi kvuli technicke narovnocsit provedeni
  3. L2 cache - nadstavba pro L1, stejny princip, vetsi, ale pomalejsi, levnejsi - 1MB, 300kc/MB
  4. L3 cache - stejny princip…
  5. RAM - hlavni pamet, velmi pomaly pristup, ale extremne levny, operacni pamet, treba 16GB, 120kc/GB
  6. Disky - obrovska uloziste, nejpomalejsi ze vsech, nejlevnejsi, pristup k nim je fatalni pro vykon procesoru, pouziti jen jako dlouhodobne ukladani bez casteho pristupu, treba terabajty dat, 1kc/GB
44
Q

Cache hit/miss, line/block, hit/miss rate, Average Memory Access Time (AMAT)

A

Cache hit - zasah, tj pozadovana hodnota byla v cache
Cache miss - opak, vypadek, musim hledat jinde
Cach line/block - zakladni jednotka, ktera se nacte do cache (muze byt vice hodnot naraz, PROTO JE VZDY VYHODNEJSI PROCHAZET 2D POLE PO RADCICH, PROTOZE NEKOLIK HODNOT Z RADKU SE NARAZ NACTE DO CACHE, PROTOZE JSOU V PAMETI ULOZENY ZA SEBOU SEKVENCNE - TUDIZ SE TAM HNED NACTOU, ALE PODLE SLOUPCU TO TAK NEFUNGUJE, TUDIZ CACHE ZTRACI SMYSL)
Hit rate - pocet hitu deleny poctem vsech dotazovani
Miss rate = 1- hit rate
AMAT - prumerny cas straveny pristupem do cache:

AMAT = HitTime + (MissRate * MissPenalty), kde MissPenalty je doba prodlevy - cekani na nalezeni hondoty ve vsech dalsch pametovych urovnich, rekurzivne se pocita

Tedy je to dobra pristupu jako (Nasel jsem hned nebo nenasel a cekam az najdu jinde)

45
Q

Cache replacment policy

A

Pokud jsem v cache nenalezl data, tak je najdu jinde a chci je pripadne zapsat do cache. Co delat, kdyz je ale cache plna? Musim neco z ni vyhodit a existuje nekolik variant:
1. Random - vyhodim nahodnou hodnotu (nekdy nejefektivnejsi)
2. LRU - least recently used, musim ale pridat flags ohledne doby posledniho vyuziti
3. LFU - least frequently used, taky musim pridat kolirkat pouzita hodnota
4. ARC - Adaptive replacment cache, combinace LFU a LRU

46
Q

Z ceho se sklada bunka/zakladni stavebni kamen cache?

A

Z adresy, ktera vypada nasledovne:

[tag][data][flags]

kde tag je pozice dat v RAM a je spolecna pro cely blok dat, data je adresa, na ktere je ulozena hodnota v RAM, flgas jsou priznaky…

Tedy pokud chci do cache nahrat 4 slova (16 bajtu), tak je vyberu jako cely BLOK v RAM a jejich adresy posledni musi byt delitelny 16. Tedy cache mi nahrava cele bloky z RAM a TAG je jakysi spoloecny identifikator bloku, tzn nejdriv hledam podle bloku a pak v ramci bloku mam adresu samotnych dat.

47
Q

Zapis z cache do RAM dva pristupy

A
  1. Write through - zapis z cache primo do RAM, pomalejsi pristup, ale je zajistena konzistence dat v L1 a hlavni pameti
  2. Write back - data se nezapisou hned, ale nastavi se tzv dirty bit, ktery ukazuje, za hodnota je pozmenena oproti RAM, pak se to za nejakou dobu synchronizuje. Vyhoda - mene pristupu do RAM, ale nekonzistence dat hlaven v pripade vlaken, kde kazdy vlakno v jadrech ma svoji L1 cache a svoje hodnoty
48
Q

Skryta cache pamet 32bitoveho procesoru ma celkem 8 bloku/bunek. Nakreslete jeji architekturu pro plne asociativni, dvoucestni a primo-mapovanou (jednocestni) verzi. Delka bloku je jedno slovo.

Kolik bude miss pri cteni adres 0, 28, 32, 60, 64

A
  1. Nejdriv me zajima vzhled plne asociativni cache.
  2. Celkem 8 bloku - znamena 8 radku, kam budu ukladat slova.
  3. Delka bloku je jedno slovo - slovo ma 4 bajty -> tedy mam 8 radku, kde v kazdem radku mam pouze 4 bajty.
  4. Obecny vzhled bunky tedy bude: tag+set+offset+flag pripadny

Chci zjistit, jak rozkodovat adresu. Dejme tomu, ze mam cist z adresy:
11000101.

  • offset: urcim nejdriv pozici v ramci jednoho radku, tedy pozici v ramci slova, ktere ma 4 bajty. Tedy ptam se, jak mohu popsat pozici ve 4 bajtech neboli kolik znaku mi staci pro zakodovani pozice o ctyrech mistech? Delam tedy log2(delka bloku) - tolik znaku potrebuju pro urceni pozice v ramci bloku.
    V tomto pripade log2(4) = 2, potrebuju 2 posledni bity adresy pro urceni pozice ve slove.
  • mnozina/set: tyto bity mi vybiraji mnozinu, do ktere smim zapisovat hodnoty (v pripade neasociativni cache), tedy nemohu ukladat hodnotu vsude, ale pouze na urcite sety (radky) cache. Tedy zase se ptam, kolik bitu potrebuju k zakodovani 8 radku? Je to tedy:
    log2(pocet mnozin). V tomto pripade log2(8) = 3. Potrebuju tedy 3 bity adresy pro zjisteni, do jake mnoziny (radku) hodnotu mohu zapsat.
  • tag: zbytek bitu adresy po odecteni bitu offset+mnozina

Tedy tato adresa 11000101 v plne asociativni cache je:
110001|01, kde prvni cast je tag, 01 je identifikator 1. bajtu ve slove/bloku daneho radku.

V pripade neasociativni cache:
110 | 001 | 01. kde 110 je tag, 001 je set (radek) a 01 vybere 1. bajt daneho radku.

  1. Plne asociativni cache - hodnoty mohu ukladat kamkoliv na volne pozice - tudiz je to proste tabulka o 8 radcich a 4 bajtech, kde nejsou bity mnozin.
  2. Primo-mapovana cache (jednocestni) mi udela 8 mnozin (radku), a hodnoty po dekodovani adresy smim ukladat pouze do jejich mnoziny podle bitu adresy, ktere mi urcily mnozinu.
  3. Vice-cestna cache: udela kopie jednocestni, tim padem pro ty same mnoziny mam najednou 2,4,8,… moznosti. (tedy doslova udelam jednocestni cache ale k-kopii, tim padem pokud mam plno v nejakem setu predchozi cache, tak to hodim do STEJNEHO setu jine cache, kde je volno)

Vzdy kdyz mam dotaz - je adresa 11000101 v cache, tak:
1. Plne asociativni - komparator se podiva, zda tag je v cachi - pokud ano, tak je tam i ta hodnota (to vim, protoze cache nahrava VSECHNY hodnoty daneho tagu). Pokud komparator v cache nenasel tag, tak je to miss. To ma l-komparatoru, kde l je pocet mnozin/bunek/radku

  1. N-cestna cache - N-komparator se podivaji do SVYCH mnozin z adresy a pokud a alespon jeden ma ve sve mnozine odpovidajici tag - hit, jinak miss

0 = 0000… | 000 | 00, celkova delka je 32 bitu
28 = 0000…|111| 00,
32 = 1 | 000 |00 - STEJNA MNOZINA JAKO 0 ale jiny tag -> vyhodit
60 = 1 |111 |00 - STEJNA MNOZINA JAKO 28 ale jiny tag -> vyhodit
64 = 10|000|00 - STEJNA MNOZINA JAKO 32 ale jiny tag -> vyhodit

49
Q

Virtualni pamet

A

Kazdy proces dostane pridelenou virtualnu pamet, aby se navzajem neovlivnovaly a byly bezpecne. Treba 4gigabajty dostane. Potom se cela virtualni pamet rozdeli na stejne velke kusy po 4kilobajtech a budeme jim rikat stranky. V ramce zavedeme stejne dlouhe ramce, ktere jsou fyzicke stranky, tedy obsahuji jejich hodnoty. Kazdy proces pak ma svoji vlastni tabulku stranek, ktera prevadi adresu virtulani stranky na fyzicky ramec v RAM. Tyto tabulky jsou taky normalne ulozeny v RAM

MMU - memory managment unit, soucasti CPU a prevadi virtualni adresy na fyzicke, tedy CPU pracuje v virtualnimi adresami, MMU se pak diva do RAM na tabulku stranek a podle toho zjisti realne ramce.

TLB - transaction looaside buffer, specialni cache pro prevod stranky na ramec, je to cache, ktera je jako porovnavaci tabulka/zaznam kde ma stranka|ramec, tedy funguje stejne principielne jako normalni cache, ale neuchovava data, ale virtualni adresu jako tag a adresu ramce jako hodnotu.

Pro efektivnejsi pristupy do pameti anebo pro pripad, kdy by tabulka stranek byla giganticka muzeme retezit tabulky stranek do sebe (tedy je stepit na mensi podtabulky) jako tabulka(tabulek(tabulek … stranek)))) Abychom neplytvali pameti v priapde, ze je tabulka nenaplnena a ma hodne 0.

50
Q

Zretezeny procesor s pipeliningem

A

Oproti jednocyklovemu procesoru, ktery ma faze:
IF - instruction fetch
ID - instruction decode
EX - execute
MA - memory access
WB - write back
a kazda instrukce se provede v tomto cyklu a nezacne nova, dokud neskonci ta predchozi. Tj mame jednu instrukci za 5 cyklu, coz je zbytecne moc casu, kdy procesor nic nedela.

Pipelining zavadi casova hradla/brany a umoznuje aby kazda faze uz mohla zacit vykonavat svoji cast z nasledujici instrukce, tj jakmile IF nacte instrukci a preposle ji dal, tak ihned nacita novou instrukci.
Timto mi po 4 fazich “naplni” cely procesor a kazda zona ma co delat, tj zrychluju celkovou propustnost procesoru jak na vyrobnim pasu. Kazda zona udela svoji casti, a ihned zacina vykonavat dalsi instrukci kterou dostala z predchozi zony, tj nema prazdne cykly.

Tento pristup muze zavest problem, kdy nasledujici instrukce pracuje s daty, ktere jeste nebyly aktualizovany/vypocteny z predchozi instrukce. Tj ve fazi ID nactu NEAKTUALIZOVANE/ZASTARALE hodnoty (ktere se pak ale prepisou fazi WB z predchozi instrukce) a vypocet bude chybny.

Dva pristupy, jak tomu predejit:
1. Stall - vlozim operaci NOP a cely beh pozastavim o jeden cyklus, nebo tolik cyklu, kolik je potreba, aby faze ID byla pod fazi WB (tj abych behem dekodovani uz nactel spravna nova data).
- toto ale snizuje propustnost procesoru a muze dokonce ji uplne znicit

  1. Forwarding - preposilani aktualnich hodnot z predchozi instrucke do faze EX nasledujicich instrukce (tj jakmile mam nove hodnoty k dispozici, tak je rovnou sipkou poslu do EX faze nasledujci instrukce - tedy PREPISU ZASTARALE hodnoty, ktere se nacetly v ID). Je to efektivnejsi postup, protoze nepotrebuje stally, ale muze dojit k situacim, kdy to nebude stacit a budeme alespon 1 stall potrebovat.)

Tyto 2 pripady resi tzv Hazard Unit na procesoru, ktery bud vklada stally nebo preposila forwardingem data tam, kde uz jsou potreba

Delam to pomoci tabulky, kam vlevo dam instrukce a do radku pisu casove cykly jako pyramidu
IF ID EX MA WB
IF ID EX MA WB
IF ID EX MA WB…

Tj bez pipelinu 10 radkovy kod by potreboval 5 cyklu v pro kazdou instrukci - tj 50 cyklu.
Pipelining se mi “naplni” ve 4. cyklu (1. WB) a vykonavam hned 5 fazi najednou, tedy posledni radek mi zacne v 9. cyklu (pocitam od 0) + jeho 4 dalsi faze = 13 cyklu

50 vs 13 cyklu (v idealnim pripade)

51
Q

Co je superskalarni procesor?

A

Paralelni pipelining na vic instrukci zaroven v KAZDE fazi, tzn muze naraz nacist 4 instrukce, pak je vsechny 4 naraz dekodovat, 4 vykonat atd…

Tzn je to jako obycejny pipelining, ktery ma ale vic cest/urovni/dimenzi… a kazda faze ma vic prostredku na to aby mohla vykonat nejen jednu instrukci za fazi ale nekolik.

Treba superskalarni procesor s SIRKOU=2 (pocet paralelnich vetvi) ma pyramidu instrukci jako:

IF ID EX MA WB
IF ID EX MA WB
IF ID EX MA WB
IF ID EX MA WB
IF ID EX MA WB
IF ID EX MA WB

Tedy ve stejny cas bezi 2 instrukce zaroven

52
Q

Staticka/dynamicka superskalarni architektura

A

Staticka - paralelne se mohou vykonat pouze instrukce, ktere jsou ulozeny v programu za sebou (pokud na sobe zavisi, tak se pozastavi stallem)

Dynamicka - paralelni zrpracovani libovolne umistecnych instrukci, umoznuje predbihani instrukci

53
Q

Jak je v realine realizovan superskalarni procesor a jeho vetve? Muze kazda vetev zpracovavat vsechny druhy instrukci?

A

V teorii ano, ale je to zbytecne slozte a drahe. V praxi se kazde vetvi priradi jeji role - zpracuj registry, nebo osetri skok, nebo pristup do pameti. Tedy kazda paralelni vetev dostane instrukci podle sve role

54
Q

SPekulativni vykonani instrukce

A

V pripade, ze se instrukce predbehnou a jeste neni vypocteno, kam se data ulozi (treba v priapde lw pred sw). Dojde tedy k hazardu.

Spekulativni vykonani je reseni - tuto instrukci stejne vykonam, i kdyz neni jasne, zda data budou spravna. Pri dokonceni instrukce sw se zkontrolujou vsechny spekulativni instrukce a pokud je nalezen hazrd, tak se tyto instrukce zahodi. Zachovava to tedy poradi.

  1. Instrukce2 predbehla instrukci1.
  2. Stejne vykonej instrukci2 jako kdyby se nic nedelo
  3. Vykonej instrukci 1.
  4. Zkontroluj konflikty
  5. Pokud nastal konflikt - zahod krok 2
55
Q

Control hazard/ridici hazard, co to je a jak se resi?

A

Je to situace v procesoru, kdy musi rozhodnout, jaka instrukce se provede dal v pripade skoku/vetveni. Toto se rozhodne pouze po vysledku predchoziho vetveni, tedy musi pockat na odpoved.

Resi se to pomoci Stall

56
Q

Jake negativa zavadi skokove instrukce do procesoru?

A

Skokove instrukce mohou skocit na jine instrukce v programu (ktere muzou byt libovolne umisteny) podle provedenho porovnani treba. TO ale znamena, ze v moment, kdy zjistim vysledek porovnani, tak uz mam nacteny nebo i spekulativne vykonany dalsi instrukce, ktere bych musel zachodit a nacis skok od zacatku…

Reseni - spekulativne odhadneme, kam se bude skakt podle historie minulych skoku. Po dokonceni spekulativniho skoku zkontrolujeme, zda jsme skocili spravne.

57
Q

Procentualni zastoupeni skoku v programu

A

Statisticky kazda 4 az 7 instrukce progrmau.
20% nepodminene skoky - skoci se vzdy, neni treba rozhodovat
80% podminene - rozhodovani:
- 66% skoky dopredu (vyssi adresa) - if
- 34% skoky na nizsi adresu (zpet) - smycky

Skoci se - T (taken)
Neskoci se - NT (not taken)

58
Q

Staticke prediktory skoku

A

Ma vzdy stjny vysledek bez rozhodovani, treba ze se VZDY skoci pri vetveni

59
Q

K cemu je predikce skoku?>

A

Aby procesor dokazal predem tipnout, zda po vykonane instrukci vetveni se v progrmau skoci nebo ne, pokud predpovi ze ano, tak se uz nactou instrukce skoku (ktere jsou nekde libovolne rozmistene). Pokud predpovi ze ne, tak se normalne pokracuje v sekvencnim vykonavani instrukci.

Pokud by ale prediktor myslel, ze se neskoci a nacte dalsi instrukce a zacne je treba i spekualtivne vykonavat, a pak az se zjisti, ze se melo skocit, tak musim vyhodit hodne nactenych a uz vykonanych instrukci a skocit, vykonat a pak to vsechno nacitat znovu

60
Q

Druhy prediktoru

A

Staticky - vzdy odpovi ano (dobry pro smycky), nebo ne (v pripade if-else)

Dynamicke - rozhoduji se podle sveho aktualniho stavu:
1-Bitovy Smithuv - ma pouze dva stavy Taken/NotTaken a mezi nimi prechazi pokud se netrefil a dokud se trefuje tak v nem zustava. V pripade smycky se netrefi treba na zacatku a pak az na konci smycky.

2-Bitovy prediktor - ma 4 stavy (StronglyTaken -> WeekltTaken, -> WeeklyNotTaken -> StronlgyNotTaken), ted je stabilnejsi vuci obcasnym odchylkam a potrebuje dvakrat se netrefit, aby presel do jineho stavu. Toleruje jednorazovou odchylku. Treba ve dvojitem for cyklu

2-Bitovy s hysterezi - StronglyTaken -> WeeklyTaken -> STRONGLYNOTTAKE a naopak. Tedy dvakrat se netrefit znamena ihned prechod do opacne strongly polarity. Hystereze skipuje weekly opacnou fazi

Priklady:
mam nejaky kod treba:
for(i=0; i<5; ++i){
body();
}

Coz v assembleru znamena:

addi $8, $0, 0 //inicializuj i=0 a uloz do registru 8
j cond //skoc na podminku
nop //konec

for1:
addi $8, $8, 1 // inkrementuj o 1

cond:
slti $9, $8, 5 // porovnej i a 5, (store 1 if lotwer than imm)
bne $9, $0, for // branch if not equal 0 and reg9 -> jump to for1

Tedy pro kazdy bne v programu zavedu prediktor. 1-bitovy zacne treba ve stavu NT:
pokud bne skoci na for1, tak je to T a porovnam to s tim, co mi predikoval prediktor (rikal mi NT, takze se netrefil a zmenil stav na T).
Pak nasleduje 4krat uspech a pak zase neuspech, kdy mi dosel cykus a 5!<5, tedy z T do NT. CElkem 4krat se trefil, 2 krat se netrefil…

Obecne kouknu na kazdy bne a jeho prediktor a jeho predikci a skutecnou hodnotu a pocitam pomer uspech.neuspech

61
Q

Jak rozlisit dva prediktory z vyberu prediktoru?

A

Podle PC, kde PC konci 00, protoze je delitelny 4. A pak dalsich n-bitu mi rozlisi 2^n prediktoru v pameti. Nemusi to ale stacit a nejake prediktory mohou byt spolecne pro ruzne programy, tedy se ovlivnovat - kolize prediktoru

62
Q

BHR - branch history registr

A

Je to 2-bitovy registr, ktery chovava historii zda se skocilo nebo ne v poslednich krocich. Rotuje a nahrazuje starou hodnotu.

Tedy :
00 -> neskocilo, neskocilo
pak se skocilo:
10
pak se skocilo:
11
pak se neskocilo
01 …

Tyto bity pridame do vyberu prediktoru podle PC a ted vybirame podle historie i podle adresy.

63
Q

Jak instrukci priradit prediktor?

A

Podle jeji pametove adresi. Tj PC ma 32-bitu. Posledni dva jsou 00 aby adresa byla delitelna ctyrmi. Pak vlevo od nich se vyjme n-bitu pro rozliseni 2^n-prediktoru. Hned prvni dve pozice se nechaji pro BHR registr, ktery mi uchovava historii, a n-2 bitu mi tedy koduje urcity prediktor v pameti, kde jich je 2^n. Toto je Gselect pristup.

GShare pristup:
Stejny princip skoro:
udelam PC, vyjmu posledni dva bity pro 00. Pak n-bitu vlevo udelam s XOR BHR a vysledne n-bity mi ukazuji na prideleny prediktor

64
Q

Perceptron

A

Je to zakladni stavebni kamen neuronu a neuronovych siti, na nem funguje predikce skoku v modernich CPU

65
Q

Jsou adresy/instrukce a data presouvany pres stejnou sbernici?

A

Ne, kazda ma svoji 32-bitovou sbernici. Mohou byt oddelene, multiplexovane, obousmerne, paralelni, seriove…

Ridici signaly sbernice - ridi komunikaci na sbernici, co se bude prenaset a jak to bude casove probihat

66
Q

Klasifiakce periferii

A

Podle typu:
1. Pouze vystupni
2. Pouze vstupni
3. Kombinace (dnes vetsina)

Podle partnera
1. Clovek (cim clovek komunikuje s pocitacem)
2. Pocitac (treba modem, site/WLAN, datova uloziste…)

Podle pripojeni:
1. Primo na CPU
2. Hierarchicke pres jine periferie (bridge, switch)

Parametry prenosu:
1. Kapacita - maximalni prenos dat
2. Latence - cas, do ktereho se provede prenos dat

67
Q

Tri typy komunikace CPU s periferii

A
  1. Na vyzadani - CPU oslovi periferii a bud od ni dostane data, nebo ji posle data, je to pomalejsi, protoze CPU aktivne zjistuje, zda jsou data pripravena
  2. Periferie komunikuje pomoci preruseni - vyvola preruseni a CPU ji zacne “poslouchat”
  3. Periferie ma primy pristup do pameti - take pomoci preruseni, CPU vsem periferiim prideli svoji adresovou cast v pameti a periferie samy ridi zapis/cteni, CPU pak zkontroluje jenom vysledek
68
Q

Pametove mapovane periferie

A

Treba RISC-V nema instrukce na komuikovani s periferiemi. Misto toho se komunikace provadi ctenim a ukladanim dat do/z pameti.

Tedy ve spolecnem adresovem prostoru ukrojime cast pameti pro periferie, kam mohou zapisovat a cist. CPU se tam pak diva/zapisuje/cte…

69
Q

Address Decoder

A

rozhoduje, kam se data presmeruji behem komunikace CPU a periferii.

Typy:
1. Centralizovany dekodere - spolecny pro vsechny prvky (CPU, RAM, I/O1, I/O2…)

  1. Decentralizovany - autonomni dekoder prilepeny primo na kazdy element svuj
70
Q

Asynchronni vs synchronni sbernice

A

Asynchronni: zacatek a konec kazdeho bitu je detekovatelny druhou stranou, NEBO je dohodnuta doba trvani vyslani jednoho bitu
jsou to sbernice BEZ HODIN, tedy kazde zarizeni musi znat delku prenosu bitu
- seriovy port, USB, disky

SYnchronni: jeden signal na prenos hodin vysilajiciho k prijimajiicmu, data jsou vysilana podle hodin, DDR, PCI, PCIe

71
Q

Seriova linka

A

Nejstarsi a zpusob komunikace asynchronni bez hodin. Navrzeno pro propojeni dvou zarizeni. Obe strany jsou nastavy na stejnou rychlost, prijimajici po jednom bitu. Je full-duplex = vysila i prijima soucasne na dvou ruznych cestach

  1. Prenos zacne Start bitem (prechod 1->0), tim se synchronizuji lokalni hodiny vsech zarizeni
  2. Vysilani jednotlivych bitu kazdeho bajtu
  3. Optional - bity parity pro kontrolu chyb
  4. Stop bit (predcho ->1)

Ve stejnou dobu je mozna komunikace i opacnym smerem

72
Q

UART

A

Universal asynchronous receiver/transmitter

Je to zariveni, ktere provadi komunikaci pres seriovou linku. Je to jako rkabicka, ktera ma vstupni pole, kam se nahravaji prijate bity, potom buffer, kam se ukladaji cela slova a priznak, ze jsou tam ready data ke cteni dal do CPU (Rx - receive), to samy i pro odesilani - tedy nejdriv se data nahraji do bufferu, pak to vysilaciho pole, odkud se vysilaji po bitech seriovou linkou, taky priznak, ze jsou data raeady k odeslani (Tx - transmit)

lw - load word nacte z prijimajiciho bufferu data
sw - save word vlozi slovo do odesilajiciho bufferu

Je to polling - tedy CPU se aktivne dotazuje, zda UART ma data ready nebo ceka dal, tedy je to zbytecne zatezujici operace, kdy CPU nic nevykonava

73
Q

Topologicke druhy sbernic

A
  1. Sdilena - prochazi spolecne vsemi prvky (PCI)
  2. Peer-to-peer se switchem - jedna sbernice vede do jakehosi rozhodovaciho bodu/krizovatky (switch) ktery dynamicky prideluje pervek na sbernici, vypada jako slunicko. Tedy je to jedna sbernice, ale krizovatka ji prideli zrovna nejaky prvek (PCIe)
74
Q

PCI sbernice

A

Paralelni, sdilena, synchronni sbernice o 32-64 vodicich. Jedne vodic prenasi CLK - hodinove cykly - synchronni.
Half duplex - komunikace jen jednim smerem naraz.
vodice IRDY - ready receive, TRDY - ready transmit
Muze byt vice zarizeni napojeno - musi se stridat
Vodic FRAME vysila packet
DEVSEL - pro rozpoznani adresy zarizeni

Je to ale pomalejsi a pouze half-duplex reseni, muze se objevit slabsi clanek - pomala periferie, ktera bude brzdit vsechny ostatni

Je to komunikace mezi nekolika zarizenimi naraz.

75
Q

Prenos dat PCI - write

A
  1. Iniciator pozada Arbitra sbernic o prideleni sbernice (vzdy jen jeden prenos po sbernici, musi se vybrat kdo ma pristup)
  2. Iniciator nastavi adresu cilove periferie a FRAME pro prenos bitu
  3. Periferie, ktera rozpoznala svoji adresu a ma odesilat data nastavi DevSel, cilova periferie prirpavena prijmout data - nastavi TRDY, iniciator pripravny odesilat - nastavy IRDY
76
Q

PCIe sbernice

A

seriova, Peer-to-peer, asynchronni, full-duplex sbernice (PCI expres). Je to rychlejsi provedeni CPI tim, ze vlastne paralelizujeme seriovou sbernici - tj mame NEKOLIK seriovych sbernic, ale ne paralelnich. Tj mame treba 2 seriove sbernice nezavisle.
Switch - prideluje pristup ke sbernici nejakemu vybranemu zarizeni (konfigurace slunicko, kde Switch je uprostred a prideluje pristup ke sbernici).
CPU pak se dotazuje na jednu PCIe sbernici ktera vede do Switch, a ze switch vychazi sbernice uz do konkretnich zarizeni.

PCI Bridge - slouzi k pripojeni dalsich zarizeni pripadne

Je to rychlejsi, full-duplex reseni, navic komunikujou pouze 2 zarizeni naraz

77
Q

Master sbernice

A

Ridi sbernici - tedy jedna sbernice je napojena na vsechna zarizeni a s kazdym signalem je sbernici odeslan i adresa (id), pak vsechna zarizeni si porovnaji id se svymi id a ten komu byla zprava adresovana tak ten odpovi. Je to half0dupllex - tedy komunikace jen ejdnim smerem

78
Q

Paralelni sbernice vs seriova

A
  1. Seriova sbernice - pouze jeden vodic, ktery odesila bit za bitem a tak postupne odesle 1 bajt za 8 hodinovych cyklu, velmi jednoduceh reseni
  2. Paralelni - nekolik vodicu paralelne a kazdy prenasi bit jednoho slova, tj pokud mam 8 vodicu, tak v jednom cyklu dokazu poslat cele bajtove slovo, tzn kazdy vodic posle jeden bit z dane pozice.
    - problemy: pro spravny prenos musi byt vsechny vodice dokonale stejne, dlouhe a charakterstiky, to nejde splnit v idealnim provedeni
    - vzajemna indukce magnitickym polem muze narusovat signal
79
Q

Vyjimka vs preruseni

A

Vyjimka synchronni - anomalni situace znemoznujici pokracovani behu sekvence insturkci a potrebuje zvlastni zpracovani:
- nedefinovava instrukce
- aritmeticka vyjimka
- syscall
- nedostupna data
- chyba adresy
- chyba sbernice

Vetsinou se stavaji v urcitych fazich procesoru. Musi se zpracovat okamzite, nejde oddalit

Asynchronni preruseni - nejsou primym dusledekm vykonani aktualni instrukce
- nelze urcit presnou fazi kdy k udalosti doslo
- bud jde utlumit/maskovat treba periferie, nebo jsou to poruchy hardware a nejdou zamaskovat
- kontrola, zda nastalo rperuseni se provede pouze na konci zpracovani jedne instrukce v CPU, tedy dokonci se faze WB a zkontrolujou se preruseni, pokud nejsou, tak zacni zpracovavat dalsi instrukci, muzou se zpracovat az pozdeji, nebo oddalit

Obecne druhy vyjimek:
1. Porucha hardware
2. Reset
3. Hardwarova preruseni
4. Problem vykonavane instrukce
5. Syscall

80
Q

Proces osetreni vyjimky

A
  1. Doslo k nalezeni vyjimky
  2. Adresa aktualni instrukce se ulozi (aby pak program pokracoval)
  3. PC se nastavi na obsluznou rutinu
    2.5 System se prepne do priviledge mode
  4. Provede se tato rutina
  5. Pokud je vyjimka recoverable - obnovi se registry jako pred chybou
  6. Rutina je dokoncea specialni instrukci navratu zpet - mret, ret…
    5.5 System se vrati do user mode
  7. Porkacuje normalni beh od PC…

Z pohledu kodu neni mozne, ze doslo k vyjimce, tedy instrukce kodu se pouze pozastavi, a pak pokracujou dal. Mezitim system mohl opravit spatnou insturkci nebo ji provest opakvoane a pokracoval dal v progrmau…

81
Q

Pokud uzivatelsky program pozada o cteni dat, jak o tom da vedet a co se stane?

A
  1. Program oznami ze chce data
  2. Syscall do CPU
  3. CPU pozada o data periferie a tento program dostane sleep - ceka na data
    3.5. Mezitim CPU vykonava treba jiny instrukce
  4. Periferie poslou preruseni
  5. CPU probere uspaly program a preda mu data…
82
Q

Tri druhy komunikace CPU s periferiemie

A
  1. Polling - CPU se aktivne dotazuje periferii, zda poslala data, je to pomaly a zatezujici, extremne moc casu, kdy se nic nedela
  2. Notifikace prerusenim - periferie posilaji preruseni pri nacteni 1 znaku, tedy kdykoliv se neco nacte, periferie notifikuje CPU prerusenim, ale CPU to zas musi ancist, coz je taky zpomalujici
  3. DMA - direct memory acces, tedy CPU nastavi adresu v pameti a kolik dat chce nacist/ulozit a pridelena periferie to uz dela sama. Jakmile je hotova, tak odesle preruseni ze je ready. CPU pak jen zkontroluje spravnost a zda nedoslo k chybam
83
Q

Lze pokracovat v programu preskocenim nejake instrukce?

A

Ne, musi se provest vsechno enbo nic (analogie s PDV,databaze). Neschopnost vykonat insturkci vetsinou ukonci cely program nebo cely system podle dulezitosti instrukce - chyba operacniho systemu

84
Q

Kdo resi v systemu preruseni v QtMIPS?

A

Koprocesor

85
Q

Volani funkci v MIPS

A
  1. Ulozim registry, ktere budu ve funkci potrebovat na zasobnik, tyto registry se budou v prubehu funkce menit
  2. Upravim sp - stack pointer, posunu ho - tim allokuju misto na zasobniku pro danou funkci
  3. Predam argumenty, prvni ctyri do registru, zbytek uz na zasobnik
  4. Instrukci jal func - ulozim navratovou adresu a skocim do funkce
  5. Alokuju lokalni promenne - pokud se pouzivaji ve funkci, tzn posouvam sp pokud je potreba dal
  6. Provadim vypocet funkce, ulozim vysledek do $v0
  7. Obnovim registry z kroku 1. (vratim jejich puvodni hodnoty pred funkci)
  8. Uvolnim zasobnik - posunu sp zpet
  9. Navrat z fce - jr adresa, kde adresa je ulozena z kroku 4, ret adresa
  10. Volajici ma jako vystup spocitanou hodnotu v $v0

Rekurze je pouhym vnorovanim techto operaci do sebe od kroku 6 dokud mam misto na zasobniku. Potom se postupne vynoruju (proto se pouziva zasobnik jako LIFO struktura, ktera mi chronologicky uchovava toto zanorovani)

86
Q

SISD vs SIMD

A

Single instruction single data - jedna instrukce se provede pouze na jednych datech:
add x3 x1 x2 kod assembleru

SIMD - single instruction multiple data - umoznuje paralelni/vektorove instrukce s ruznymi data najednou (ale tu samou oepraci)

vadd (x1, x2) (x3, x4), (x5, x6,)… - vector add, tedy provede operaci add pro kazdou dvojici paralelne a vysledek bude pole vyslednych hodnot - vektorova operace
- x86, MIPS, RISC-V, ARM…