====== 6. Pipeline a hazardy ====== * [[..:..:internal:tutorials:05:start|pro vyučující]] ===== Osnova cvičení ===== - Fibonacciho posloupost - Přepis programu z jazyka C do assembleru - Simulace a ladění programu pro nezřetězený procesor (simulátor Mips) - Simulace a ladění programu pro zřetězený procesor (simulátor MipsPipeS) ===== Co bych si měl na cvičení zopakovat/připravit ===== - Rozumět předchozí přednášce ===== Náplň cvičení ===== Napište program pro výpočet N-tého Fibonacciho čísla pro N>2. Fibonacciho posloupost je definována nasledovně: F(n) = F(n-1) + F(n-2), pro n>2, přičemž F(0) = 0 a F(1) = 1. Prvních několik členů této posloupnosti je: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,... K vypočtenému číslu pak přičtěte konstantu 15. Hodnotu N zvolte 5. K dispozici máte tyto instrukce: * add, addi, bne, beq. \\ Bližší popis instrukcí: ^ Instrukce ^ Syntax ^ Operace ^ Význam ^ | Add | add \$d, \$s, \$t | \$d = \$s + \$t; | Sečte dva registry \$s + \$t a výsledek uloží do registru \$d | | Addi | addi \$t, \$s, imm | \$t = \$s + imm; | Sečte hodnotu v \$s a znaménkově rozšířenou přímou hodnotu, a výsledek uloží do \$t | | Bne | bne \$s, \$t, offset | if \$s != \$t go to PC+4+4*offset; else go to PC+4 | Skáče pokud si registry \$s a \$t nejsou rovny | | Beq | beq \$s, \$t, offset | if \$s == \$t go to PC+4+4*offset; else go to PC+4 | Skáče pokud si registry \$s a \$t jsou rovny | \\ \\ Možný přepis problému do jazyka C: t0 = 5; // Nastaveni hodnoty N s0 = 0; // F(0) s1 = 1; // F(1) for(t1 = 2; t1 <= t0; t1++) { t2 = s0 + s1; s0 = s1; s1 = t2; } s1 += 15; while(1) ; // Nekonečná smyčka \\ Pro přepis programu z jazyka C do assembleru můžete využít následující šablonu: #define t0 $8 #define t1 $9 #define t2 $10 #define s0 $16 #define s1 $17 #define s2 $18 .globl start .set noat .set noreorder .ent start start: // Zde je místo pro Váš vlastní kód... nop .end start \\ Pracujte nejdřív se simulátorem Mips, pak MipsPipeS. \\ \\ Všimětě si, že o standardní vyplňování delay slotů za instrukcemi skoků se stará přímo assembler. Když není před předchozí instrukcí přítomné návěští, posune ji ve výsledném binárním kódu za instrukci skoku. Jinak doplní NOP. Toto chování assembleru lze vypnout pseudoinstrukcí .set noreorder Zkuste se zamyslet nad pravidly pro kompilátor, který by připravoval kód pro procesor MipsPipeS tak, aby vykonával pro předložený kód funkci stejnou jako standardní Mips. ===== Když zůstane čas, aneb pro ty, kteří by se začínali nudit ===== Modifikujte předchozí program tak, aby se výsledek (tedy F(N)+15) zapsal do datové paměti na adresu 0x02 (instrukce sw) a následně tuto hodnotu přečtěte (instrukce lw). Vykonávání programu sledujte v simulátoru MipsPipeS, případně i v MipsPipeXL. === Kontrolní otázky: === * Jak se realizuje instrukce add? * Jak se realizuje instrukce addi? * Jak se realizuje instrukce lw? * Jak se realizuje instrukce sw? * Kolik taktů trvá než je známa adresa větvění a jak se zjišťuje? (instrukce beq a bne) \\ \\