This shows you the differences between two versions of the page.
cn1:laboratoare:10 [2020/04/27 01:08] adina.smeu [2. Taskuri] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 10 - Recapitulare ===== | ||
- | |||
- | ==== 1. Obiective ==== | ||
- | |||
- | {{page>cn1:laboratoare:10:goals&nofooter}} | ||
- | |||
- | ==== 2. Taskuri ==== | ||
- | |||
- | {{page>cn1:laboratoare:10:tasks&nofooter}} | ||
- | |||
- | ==== 3. Problemă examen ==== | ||
- | |||
- | {{page>cn1:laboratoare:10:exam&nofooter}} | ||
- | |||
- | În vederea pregătirii problemei pentru examen (a.k.a proba numita “problema”), trebuie să aveți în vedere cele 2 mari tipuri de probleme prezentate la curs: | ||
- | * BRANCH PREDICTOR | ||
- | * DATA HAZARDS IN PIPELINE | ||
- | |||
- | Pentru ambele tipuri de probleme, găsiți teoria necesara în cursul de CN de pe moodle. | ||
- | *Pentru primul tip de problema, pe lângă exemplele din curs, atașăm mai jos un model complet de redactare a acestui subiect. | ||
- | *Pentru tipul al doilea, aveți numeroase exemple (figuri) în curs care ilustrează cum sunt rezolvate aceste tipuri de hazarde. | ||
- | In plus, puteți consulta următoarele link-uri: | ||
- | * [[https://en.wikipedia.org/wiki/Branch_predictor#One-level_branch_prediction|Branch predictor]] | ||
- | * [[http://web.cs.iastate.edu/~prabhu/Tutorial/PIPELINE/hazards.html|Hazard in pipeline]] | ||
- | * [[http://web.cs.iastate.edu/~prabhu/Tutorial/PIPELINE/dataHaz.html|Data hazards in pipeline]] | ||
- | * [[https://en.wikipedia.org/wiki/Amdahl%27s_law|Amdahl's law]] | ||
- | * [[https://en.wikipedia.org/wiki/Speedup|Speedup]] | ||
- | |||
- | <note tip> | ||
- | **ATENȚIE!** Vă rugăm ca în redactarea problemelor să folositi notațiile/convențiile prezentate la curs și la laborator. | ||
- | </note> | ||
- | |||
- | == Exemplu problemă BRANCH PREDICTOR == | ||
- | |||
- | Fie următorul cod în assembly (simplificat): | ||
- | <code asm> | ||
- | mov ax, $a | ||
- | mov bx, $b | ||
- | |||
- | _while: | ||
- | cmp ax, bx ; ax ? bx | ||
- | |||
- | jg _greater ; ax > bx ? | ||
- | jl _less ; ax < bx ? | ||
- | je _pwp ; ax == bx ? | ||
- | |||
- | jmp _while | ||
- | |||
- | _greater: | ||
- | sub ax, bx ; ax = ax - bx | ||
- | jmp _while | ||
- | |||
- | _less: | ||
- | sub bx, ax ; bx = bx - ax | ||
- | jmp _while | ||
- | |||
- | _pwp: ;se afiseaza conținutul lui ax | ||
- | |||
- | </code> | ||
- | |||
- | <note tip> | ||
- | **Observații** | ||
- | - Recapitulare assembly | ||
- | * ''jmp'' este instrucțiune ce implementează un salt necondiționat | ||
- | * ''jg'', ''jl'', ''je'' sunt instrucțiuni ce implementează salturi CONDITIONATE (doar pentru acestea Branch Predictorul poate optimiza lucruri) | ||
- | * ''add''/''sub'', ''cmp'' sunt folosite pentru adunare/scadere și comparare | ||
- | * ''mov'' este instrucțiunea care copiază în destinație (primul operand), conținutul sursei (al doilea operand) | ||
- | - În acest exemplu, instrucțiunile au fost explicate, atat în această secțiune cat și în cod (prin comentarii). Ne așteptăm ca la examen să știți ce fac instrucțiunile: ''add''/''sub'', ''je''/''jg''/''jl''/''jmp'', ''cmp'', ''inc'', load (''ld'') /store (''st'')/''mov''. De asemenea, ce este un registru (ex. ''ax''/''eax'', ''bx''/''ebx'', ''cx''/''ecx'', ''dx''/''edx'' sau ''r1'', ''r2'', ''r3'' …), cum luăm valoarea de la o adresa (''b''), sintaxa pentru instrucțiuni (ex. ''mov reg destinație reg_sursa''). | ||
- | </note> | ||
- | |||
- | Avem 2 procesoare, fiecare având frecvența de 1Ghz, care execută acest cod, procesoarele A și B. Metoda de branch prediction folosită de fiecare este: | ||
- | |||
- | **A.** 1-bit counter (taken/not taken) | ||
- | |||
- | **B.** 2-bit counter (strongly taken/weak taken/weak not taken/strongly not taken) | ||
- | |||
- | Ambele pornesc cu o abordare pesimistă, counterul/state machine-ul fiecăreia având starea inițială pentru procesorul A not taken și pentru B strongly not taken. De altfel, ambele implementează un branch predictor global, astfel că există un singur counter/state machine global, pentru toate branch-urile. Se știu numărul de cicli de ceas pentru fiecare tip de instrucțiune: mov - 1 ciclu, cmp - 1 ciclu, sub - 1 ciclu, branch - 20 cicli (dacă nu a fost prezis corect) sau 2 cicli (dacă a fost prezis corect). | ||
- | |||
- | Se cer următoarele: | ||
- | |||
- | **1.** Pentru input-ul a=26 și b=34 să se evidențieze prin ce stări trec branch-predictor-ele celor 2 procesoare, semnalându-se și care branch-uri au fost prezise corect, respectiv incorect. (4p) | ||
- | |||
- | **2.** Să se calculeze timpul de rulare al programului pe cele 2 procesoare, pentru input-ul de la punctul 1. (3p) | ||
- | |||
- | **3.** FIe un procesor C, cu frecvență de 1Ghz, care are aceeași metoda de branch prediction pe 2 biți ca procesorul B, implementând însă un branch predictor local (câte un counter/state machine pentru fiecare branch). Execută procesorul C codul dat mai repede decât procesorul A sau B, pentru input-ul de la punctul 1? Argumentați. Care este speed-up față de B? (3p) | ||
- | |||
- | <spoiler Rezolvare> | ||
- | [[https://docs.google.com/spreadsheets/d/1VR7XeqPSfzxMAJiE3ClhReDBkI_NgrWj0_gOplrMnFU/edit#gid=0|Rezolvare problema]] | ||
- | </spoiler> | ||
- | |||
- | ==== 4. Model colocviu ==== | ||
- | |||
- | {{page>cn1:laboratoare:10:test&nofooter}} | ||
- | |||
- | Colocviul va fi scris (nu există probă practică pe calculator). Acesta este closed book. Regulamentul se află [[https://ocw.cs.pub.ro/courses/cn1/regulament|aici]]. | ||
- | |||
- | Formatul acestuia va fi următorul: | ||
- | * 4 subiecte de câte 2.5 puncte | ||
- | * Timp de lucru 50 min. Fără documentații. Totul se redactează pe foaie. | ||
- | * Colocviul verifică toate cunoștințele din materia predată la laborator, printre care și noțiuni de Verilog (veți scrie cod pe foaie). | ||
- | |||
- | Exemple de subiecte: | ||
- | * Subiectul 1 va fi o întrebare de teorie/o comparație/o definiție/un algoritm/o idee/un principiu/etc din materia de laborator. | ||
- | * Subiectul 2 poate sa ceară corectarea unui cod Verilog dat, menționarea unor concepte + exemplificare prin cod Verilog (ex. semnătură module, instanțiere module), etc. | ||
- | * Subiectul 3 va presupune scrierea unui modul/o secvență de cod Verilog. Acesta va fi asemănător cu exercițiile deja codate în laboratoare. | ||
- | * Subiectul 3 va presupune scrierea unui modul/o secvență de cod Verilog. Acesta va fi asemănător cu exercițiile deja codate în laboratoare. | ||
- | * Indicii 1, 2, 3, 4 sunt orientativi. (Ex. Subiectul 1 poate sa fie FSM Moore, iar subiectul 4 poate sa fie o întrebare. Ați prins ideea. :D) | ||
- | |||
- | Mai jos puteți consulta un model. | ||
- | |||
- | <code verilog> | ||
- | Vineri 10-12 26.05.2017 | ||
- | Colocviu CN1 | ||
- | (2.5p) Care este diferența dintre un half adder și un full adder? De ce avem nevoie de ambele? | ||
- | |||
- | |||
- | (2.5p) Implementați în Verilog un sumator pe 2 biți. Sumatorul NU are intrare de carry. NU puteți folosi | ||
- | operatorul +. | ||
- | |||
- | (2.5p) Pornind de la următoarea descriere la nivel procedural al unui modul în Verilog scrieți descrierea | ||
- | la nivel structural al aceluiași modul. | ||
- | module foo(input a, input b, input c, output reg out); | ||
- | always @(*) begin | ||
- | case (b) | ||
- | 1’b0: begin | ||
- | out <= a | c; | ||
- | end | ||
- | 1’b1: begin | ||
- | out <= 0; | ||
- | end | ||
- | endcase | ||
- | end | ||
- | endmodule | ||
- | |||
- | (2.5p) Creați diagrama pentru un automat cu stări de tip Moore care primește intrările '1' și '0' și are ca | ||
- | ieșire "da" sau "nu". Automatul trebuie să recunoască secvențe care conțin subsecvența "1010". | ||
- | Exemplu: intrare "1010" => ieșire "da"; intrare "111010" => ieșire "da"; intrare "101001" => ieșire "da"; | ||
- | intrare "1111" => ieșire "nu"; intrare "1011" => ieșire "nu"; intrare "10010" => ieșire "nu". | ||
- | </code> | ||
- | |||
- | |||
- | ==== 5. Linkuri utile ==== | ||
- | |||
- | {{page>cn1:laboratoare:10:links&nofooter}} | ||
- | |||
- | [[https://ocw.cs.pub.ro/courses/cn1]] | ||