Che cosa significa "emettere o iniziare un'istruzione"?

1

Dalla sezione 2.1.3 RISC vs CISC da Organizzazione di computer strutturati di Tanenbaum,

While the initial emphasis was on simple instructions that could be executed quickly, it was soon realized that designing instructions that could be issued (started) quickly was the key to good performance. How long an instruction actually took mattered less than how many could be started per second.

  • che cosa significa "emettere o iniziare un'istruzione" significa? Fa riferimento ai passaggi 1, 2, 3, 4 e 5 nel ciclo fetch-decode-execute?

  • "eseguire un'istruzione" significa solo il passaggio 6 nel ciclo fetch-decode-execute?

Grazie.

Nota:

The CPU executes each instruction in a series of small steps. Roughly speaking, the steps are as follows:

  1. Fetch the next instruction from memory into the instruction register.
  2. Change the program counter to point to the following instruction.
  3. Determine the type of instruction just fetched.
  4. If the instruction uses a word in memory, determine where it is.
  5. Fetch the word, if needed, into a CPU register.
  6. Execute the instruction.
  7. Go to step 1 to begin executing the following instruction.

This sequence of steps is frequently referred to as the fetch-decode-execute cycle.

    
posta Tim 11.02.2015 - 17:43
fonte

2 risposte

3

Probabilmente si riferisce al pipelining, cioè all'esecuzione parallela (o semi-parallela) delle istruzioni. Questo è l'unico scenario a cui riesco a pensare dove non importa quanto tempo ci vuole, purché ne abbiate abbastanza in esecuzione in parallelo.

Quindi, la CPU può recuperare una istruzione, (passo 1 nella tabella sopra,) e quindi non appena procede al passo 2 per quella istruzione, può allo stesso tempo (in parallelo) iniziare con il passo 1 per la prossima istruzione, e così via.

Chiamiamo le nostre due istruzioni consecutive A e B. Quindi, la CPU esegue il passaggio 1 (recupero) per l'istruzione A. Ora, quando la CPU procede al passaggio 2 per l'istruzione A, non può ancora iniziare con il passo 1 per l'istruzione B , perché il contatore del programma non è ancora avanzato. Quindi, deve attendere che abbia raggiunto il punto 3 per l'istruzione A prima di poter iniziare con il passo 1 per l'istruzione B. Questo è il tempo necessario per iniziare un'altra istruzione, e vogliamo mantenerlo al minimo, (iniziare istruzioni il più rapidamente possibile,) in modo che possiamo eseguire in parallelo quante più istruzioni possibili.

Le architetture CISC hanno istruzioni di lunghezza variabile: alcune istruzioni sono lunghe solo un byte, altre lunghe due byte e altre ancora lunghe diverse byte. Ciò non semplifica l'incremento del contatore del programma immediatamente dopo il recupero di un'istruzione, poiché l'istruzione deve essere decodificata in una certa misura al fine di calcolare molti byte lunghi. D'altra parte, una delle caratteristiche principali delle architetture RISC è che tutte le istruzioni hanno la stessa lunghezza, quindi il contatore del programma può essere incrementato immediatamente dopo aver recuperato l'istruzione A, il che significa che il recupero dell'istruzione B può iniziare immediatamente dopo. Questo è ciò che l'autore intende avviare le istruzioni rapidamente, ed è questo che aumenta il numero di istruzioni che possono essere eseguite al secondo.

Nella tabella sopra, il passo 2 dice "Cambia il contatore del programma in modo che punti alle seguenti istruzioni" e il punto 3 dice "Determina il tipo di istruzione appena recuperata." Questi due passaggi possono essere in questo ordine solo su macchine RISC. Sulle macchine CISC, devi determinare il tipo di istruzione appena recuperata prima di poter cambiare il contatore del programma, quindi il passaggio 2 deve attendere. Ciò significa che sulle macchine CISC non è possibile avviare la prossima istruzione con la stessa rapidità con cui può essere avviata su una macchina RISC.

    
risposta data 11.02.2015 - 20:00
fonte
1

What does "issue or start an instruction" mean?

Nel contesto di ciò che è scritto, dovrebbe significare la quantità di tempo tra quando la CPU può avviare il processo di gestione di una istruzione e quando può fare lo stesso per quella successiva. Se questa spiegazione sembra vaga, la ragione è che cambierà molto per architettura.

Supponiamo di avere alcune istruzioni da eseguire su una CPU fittizia con registri numerati in cui il recupero e la decodifica (F & D) richiede sempre tre unità di tempo e l'esecuzione richiede dieci:

ADD  R1, R2    ; R1 ← R1 + R2
LOAD R3, 0     ; R3 ← 0
LSR  R4, 3     ; R4 ← R4 shifted 3 bits to the right

Su un design semplicistico che non parallelizza nulla, il tempo totale per eseguire questo snippet di codice è 39 unità: 3 + 10 (F & D più esecuzione) per ADD , 3 + 10 per LOAD e 3 + 10 per LSR .

Ad un certo punto, i progettisti di CPU hanno notato che i loro chip avevano un hardware che restava inattivo mentre le istruzioni venivano eseguite e capiva che nulla poteva fermarsi dall'usarlo per eseguire istruzioni successive che non dipendevano dal risultato di quelle precedenti. Nell'esempio sopra, nessuna delle istruzioni ha qualcosa in comune con le altre. Tutti i registri coinvolti sono unici, così come lo sono le istruzioni. (Per semplicità, diciamo ADD , LOAD e LSR utilizzano tutti hardware diversi da eseguire.) Ciò significa che tutti possono passare attraverso la fase di esecuzione in parallelo senza produrre risultati errati.

Tre istruzioni in esecuzione in parallelo perfetto, non-del-mondo richiederebbero un totale di 13 unità di tempo, un risparmio di tempo del 66% rispetto alla CPU non parallelizzata. Questo è un bel miglioramento finché il mondo reale non si intromette e ti rendi conto che non puoi eseguire tutta la fase F & D in parallelo perché non hai idea se l'istruzione LOAD utilizzerà gli stessi registri della ADD sopra di esso. Per evitare ciò, F & D deve essere fatto in serie. Una volta stabilito che non dipende da nulla, puoi inviarlo per l'esecuzione e passare a F & D il prossimo.

La prima istruzione prende tre unità per F & D e quindi viene inviata da qualche altra parte nel processore per essere eseguita. Quindi il secondo F & D può andare avanti per altre tre unità di tempo e poi il terzo per lo stesso. A quel punto, abbiamo speso nove unità di tempo su F & D. Poiché la terza istruzione è stata l'ultima a essere decodificata, dobbiamo attendere altre dieci unità dopo di essa per eseguirla. Ciò significa che l'ultima istruzione finirà di eseguire 19 unità di tempo dopo che F & D inizia sul primo. Questo è ancora un risparmio non troppo modesto del 51% sul fare tutto in serie.

Quando sei in grado di eseguire molte istruzioni in parallelo, quanto tempo impiegano le istruzioni per eseguire diventa un po 'meno rilevante di quanto tempo ci vuole per avviarle (emetterle). L'ora di inizio è diventata più critica perché ogni unità di tempo spesa per valutare se un'istruzione può essere eseguita o meno è tempo in cui l'hardware di esecuzione non sarà occupato. Se i progettisti della nostra CPU fittizia trovano un modo per tagliare un'unità di tempo fuori da quella fase, il tempo totale per le tre istruzioni nell'esempio scende da 19 a 16, il che non è nulla da starnutire. Taglia un altro e sei giù a 13.

Does "execute an instruction" mean only step 6 in the fetch-decode-execute cycle ?

Ai fini di questa discussione, sarebbe ragionevole dire che significa utilizzare l'hardware nella CPU per eseguire i desideri dell'istruzione.

    
risposta data 11.02.2015 - 23:35
fonte

Leggi altre domande sui tag