Architettura funzionale Pentium Pro 256 KB integrata 4 cicli per operazione L2 Cache System Bus Bus Interface Unit 8 KB integrata 1 ciclo per operazione 3 istruz. per ciclo L1 I-Cache Fetch/Decode unit in-order L1 D-Cache 5 istruz. per ciclo Dispatch/Execute unit out-of-order Instruction Pool 8 KB integrata 1 ciclo per operazione Retire unit 3 istruz. per ciclo in-order ARCHITETTURA CPU L2 ext. BUS MOB BIU DCU IFU MIU AGU BTB RS ID FEU MIS ROB RRF RAT front end in-order IEU core out-of-order back end in-order Legenda schema Pentium pro BIU Bus Interface Unit IFU Instruction Fetch Unit ID Instruction Decoder BTB Branch Target Buffer MIS Microcode Instruction Sequencer RAT Register Alias Table ROB ReOrder Buffer RRF Retirement Register File RS Reservation Station FEU Floating point Execute Unit IEU Integer Execute Unit AGU Address Generation Unit MIU Memory Interface Unit DCU Data Cache Unit MOB Memory Order Buffer pipeline Pentium Pro 1 2 3 4 5 6 31 32 33 34 35 36 7 8 9 10 11 1 2 3 4 5 Cicli di clock = 0 6 7 8 9 10 11 12 Istruzioni completate = 0 pipeline Pentium Pro Il pipeline esegue il prefetch di tutte le istruzioni disponibili, e ne determina le dipendenze. Nell’esempio: prima la #1 e poi la #3 prima la #4 e poi la #5 prima la #32 e poi la #33 prima la #34 e poi la #35 prima la #7 e poi la #8 prima la #9 e poi la #11 : istruzione eseguibile 1 immediatamente : istruzione sospesa 3 in attesa di dati 1 2 3 4 5 6 31 32 33 34 35 36 7 8 9 10 11 1 2 3 4 5 Cicli di clock = 0 6 7 8 9 10 11 12 Istruzioni completate = 0 pipeline Pentium Pro 1 2 Il Pentium Pro ha un pipeline superscalare a tre livelli con esecuzione outof-order, preceduto da un modulo di prefetch e seguito da un modulo di writeback per aggiornare lo stato della CPU in-order. Manda quindi in esecuzione le prime tre istruzioni pronte, cioè #1, #2 e #4. La #3 viene accantonata perché non è pronta. Al termine le modifiche apportate dalle istruzioni #1 e #2 vengono registrate nello stato della CPU. 1 aggiornamento in-order dello stato della CPU 2 3 4 4 istruzione da 2 cicli 5 6 31 32 33 34 35 36 7 8 9 10 11 1 2 3 4 5 Cicli di clock = 1 6 7 8 9 10 11 12 Istruzioni completate = 2 pipeline Pentium Pro 1 1 2 2 3 4 3 L1 miss 4 5 6 6 31 31 32 33 34 35 36 7 8 9 10 11 1 2 3 4 5 Cicli di clock = 2 6 7 8 9 10 11 12 L’istruzione #4 si conclude, ma le sue modifiche non vengono ancora registrate perché l’istruzione che la precede non è ancora terminata (writeback inorder). L’istruzione #5 non è ancora pronta, quindi il pipeline carica altre tre istruzioni, la #3 (che nel frattempo è diventata pronta), la #6 e la #31. La ricerca delle dipendenze segue anche i salti. La #3 determina un miss in L1, e quindi durerà 4 cicli. Tuttavia il pipeline non si blocca. Istruzioni completate = 2 pipeline Pentium Pro 1 1 2 2 3 4 3 L’istruzione #3 resta sempre in attesa. Il termine interno della #4 permette l’esecuzione della #5. Le altre due nuove istruzioni eseguibili da immettere nel pipeline sono la #32 e la #34, anche se quest’ultima causa un miss su L1 della durata di 4 cicli. La gestione degli accessi esterni (L2) è composto da un altro pipeline a 4 livelli, cioè si possono accodare fino a 4 richieste di dati in parallelo. L1 miss 4 5 5 6 6 31 31 32 32 33 34 34 L1 miss 35 36 7 8 9 10 11 1 2 3 4 5 Cicli di clock = 3 6 7 8 9 10 11 12 Istruzioni completate = 2 pipeline Pentium Pro 1 1 2 2 3 4 3 Le istruzioni #3 e #34 restano sempre in attesa. Le modifiche apportate dalle istruzioni #4, #5, #6, #31, #32 non vengono ancora registrate. L1 miss 4 5 5 6 6 31 31 32 32 33 33 34 34 L1 miss 35 36 36 7 7 istruzione lunga due cicli 8 9 10 11 1 2 3 4 5 Cicli di clock = 4 6 7 8 9 10 11 12 Istruzioni completate = 2 pipeline Pentium Pro 1 1 2 2 3 4 3 Vengono immesse nel pipeline le istruzioni #9 e #10, e l’ipotetica istruzione #12. L’istruzione #3 finalmente termina e svincola anche le modifiche delle istruzioni #4 e #5 che aggiornano nella giusta sequenza lo stato della CPU. Il modulo di Writeback può aggiornare al massimo tre istruzioni per volta, e quindi le modifiche apportate dalle istruzioni #6, #31, #32, #33, #36, #7 e #10 non vengono ancora registrate. L1 miss L2 hit 4 5 5 6 6 31 31 32 32 33 33 L1 miss 34 34 35 36 36 7 7 8 9 9 10 10 L1 miss 11 1 2 3 4 5 6 7 8 9 10 11 12 12 Cicli di clock = 5 Istruzioni completate = 5 pipeline Pentium Pro 1 1 2 2 3 4 Vengono immesse nel pipeline l’istruzione #8, finalmente pronta, e le ipotetiche istruzioni #13 e #14. Le istruzioni #34 ed #8 terminano ed escono dal pipeline, la #9 resta sempre in attesa. Le modifiche apportate dalle istruzioni #6, #31 e #32 vengono registrate in-order nel registro di stato della CPU. 3 4 5 5 6 6 31 31 32 32 33 33 34 34 L1 miss L2 hit 35 36 36 7 7 8 8 9 9 10 10 L1 miss 11 1 2 3 4 5 6 12 13 7 8 9 10 11 12 14 Cicli di clock = 6 Istruzioni completate = 8 pipeline Pentium Pro 1 1 2 2 3 4 Vengono immesse nel pipeline l’istruzione #35, finalmente pronta, e le ipotetiche istruzioni #15 e #16. L’istruzione #9 resta sempre in attesa. Le modifiche apportate dalle istruzioni #36, #7, #8 e #10 non vengono ancora registrate. 3 4 5 5 6 6 31 31 32 32 33 33 34 34 35 35 36 36 7 7 8 8 9 9 10 10 L1 miss 11 1 2 3 4 5 6 7 12 13 15 14 16 Cicli di clock = 7 8 9 10 11 12 Istruzioni completate = 11 pipeline Pentium Pro 1 1 2 2 3 4 Vengono immesse nel pipeline le ipotetiche istruzioni #17, #18 e #19. L’istruzione #9 termina ma le sue modifiche non vengono registrate. Le modifiche apportate dalle istruzioni #36, #7 e #8 vengono registrate in-order nel registro di stato della CPU. 3 4 5 5 6 6 31 31 32 32 33 33 34 34 35 35 36 36 7 7 8 8 9 9 10 10 L1 miss L2 hit 11 1 2 3 4 5 6 7 8 12 13 15 17 14 16 18 9 10 11 12 19 Cicli di clock = 8 Istruzioni completate = 14 pipeline Pentium Pro 1 1 2 2 3 4 3 4 5 5 6 6 31 31 32 32 33 33 34 34 35 35 36 36 7 7 8 8 9 9 10 10 11 11 1 2 3 4 5 6 7 8 9 12 13 15 17 20 14 16 18 21 10 11 12 Vengono immesse nel pipeline l’istruzione #11 finalmente pronta, e le ipotetiche istruzioni #20 e #21. Al fine del ciclo le modifiche apportate dalle istruzioni #9, #10 e #11 vengono registrate in-order nel registro di stato della CPU. Globalmente dopo 9 cicli di clock sono state eseguite in ordine 17 istruzioni, e sono state immesse nel pipeline e potenzialmente pronte per essere terminate altre 10 istruzioni. A regime si può arrivare a 3 istruzioni per ciclo. 19 Cicli di clock = 9 Istruzioni completate = 17 pipeline Pentium Pro I principi dell’esecuzione dinamica sono: •Multiple branch predition •DataFlow analysis •Speculative execution Acquisizione delle istruzioni e loro completamento secondo l’ordine voluto dal programmatore. Esecuzioni interna out-of-order, per ottimizzare l’occupazione del pipeline interno, secondo modalità data-flow. Quando si verificano interrupt, predizioni errate di salti, miss anche a livello L2 o eccezioni interne, il pipeline deve essere in grado di annullare il lavoro di esecuzione preventiva svolto in precedenza . Speculative execution (esecuzione preventiva o esecuzione anticipata?)