La lunghezza dell'istruzione influisce sui cicli per istruzione?

0

Gli ISA definiscono cose come le lunghezze delle istruzioni e le istruzioni stesse e ci sono alcune cose che non capisco.

  • La lunghezza dell'istruzione (la quantità di bit) influisce sulla quantità di istruzioni che possono essere eseguite in un ciclo di clock?
  • Ho provato a fare qualche ricerca su cosa determina realmente la quantità di istruzioni che possono essere eseguite in un ciclo (che ha portato alla domanda precedente), ma senza fortuna. La variabile CPI sempre o esiste una quantità specifica di cicli necessari per determinate istruzioni da eseguire, come forse "un'istruzione a caricamento semplice sempre richiede un ciclo"?
posta asd 14.02.2018 - 23:16
fonte

4 risposte

4

Con i processori moderni, c'è così tanta traduzione, memorizzazione nella cache, riorganizzazione, esecuzione speculativa, ecc. che si verificano tra la lettura dei byte di istruzioni dalla memoria e le istruzioni di esecuzione, che difficilmente la tua domanda può essere risolta . Una CPU moderna non esegue i byte di istruzioni letti dalla memoria ma alcuni prodotti interni creati da trasformazioni complesse.

È paragonabile a una domanda del tipo "Quanti caratteri del codice sorgente C possono eseguire una CPU in un ciclo di clock?" Bene, i byte di istruzione macchina potrebbero essere gradualmente più vicini al motore di esecuzione della CPU rispetto al codice sorgente C, ma solo gradualmente. Hai un'idea ...

Nei vecchi anni 8080 / Z80 / 6502 era facile. Ogni istruzione è stata documentata per prendere un numero fisso di cicli della CPU (se è stata utilizzata la memoria a velocità decente). È possibile creare tempi esatti dall'esecuzione di programmi progettati in modo specifico.

Naturalmente, puoi applicare alcuni ragionamenti di buon senso. Prima di eseguire un'istruzione per la prima volta, la CPU deve averla letta dalla memoria. Quindi, un'istruzione più lunga richiede più tempo di una più breve - alla prima esecuzione.

Se si trova all'interno di un ciclo, probabilmente dalla seconda iterazione in poi, l'istruzione è già nella cache della CPU, disponibile in una frazione del tempo di accesso alla RAM. Forse la CPU si traduce dai codici op x86 alle parole di istruzioni interne, quindi la lunghezza in byte dell'istruzione originale non conta più dopo quella traduzione.

Se vuoi conoscere una determinata sequenza di istruzioni, quanto tempo ci vuole per eseguirle, o hai bisogno di un software di simulazione perfetto per la CPU e il sottosistema di memoria specifici che hai in mente (modellando tutte le cose che ho menzionato), o testarlo tramite benchmarking. Ma sappi che in entrambi i casi i risultati dipendono non solo dalle tue istruzioni, ma anche dal tipo di CPU, dalla relativa velocità della RAM, dai contenuti iniziali della cache della CPU e da molti altri fattori. Non essere sorpreso di vedere i tempi di esecuzione della vita reale che differiscono di un fattore due o più dai risultati teorici o di benchmarking.

    
risposta data 15.02.2018 - 11:32
fonte
1

La lunghezza dell'istruzione può influire sul CPI, ma di solito solo indirettamente.

In generale, una CPU moderna avrà percorsi dalla memoria alla cache e dalla cache alla ALU che gli consentiranno di recuperare un'intera istruzione alla volta, indipendentemente dalla lunghezza 1 .

In quanto tale, è abbastanza insolito per le dimensioni dell'istruzione direttamente . Allo stesso tempo, una CPU non ha mai spazio di cache illimitato. Un'istruzione più grande occupa più spazio nella cache, limitando il numero di istruzioni che possono essere contenute nella cache. Ciò, a sua volta, porta a una maggiore probabilità di errori di cache, nel qual caso la CPU può finire per attendere la memoria principale.

Se CPI è sempre variabile: sì, almeno quasi sempre. In particolare, le dipendenze delle risorse tra le istruzioni possono limitare la quantità che può essere eseguita in un dato ciclo. Considerare un'attività completamente serializzata, in cui ogni fase dell'attività dipende dal passaggio precedente.

In tal caso, è praticamente impossibile eseguire più di una istruzione per clock (a meno di ristrutturare il problema, che è generalmente al di là di quanto tenterà qualsiasi CPU).

Allo stesso tempo, una CPU moderna e ad alte prestazioni avrà quasi sempre almeno la capacità di eseguire più di una istruzione per ciclo se non ci sono dipendenze tra di loro. In quanto tale, qualcosa come:

OR r0, r1, r2
OR r3, r4, r5

... può normalmente essere eseguito in parallelo, se il processore ha risorse disponibili per farlo. Abbiamo bisogno di sapere di più sulle istruzioni precedenti prima di poter dire quanto ci vorrà per eseguire tali istruzioni. Con istruzioni più complesse che implicano l'accesso a dati che potrebbero (o potrebbero non essere) in una cache, ecc., L'immagine diventa ancora più complessa.

  1. Anche se questo non è sempre garantito. Ad esempio, un x86 supporta istruzioni con un massimo di 16 byte di prefissi (più l'istruzione stessa), quindi, sebbene in pratica sia raro, una singola istruzione può essere troppo grande per essere trasferita in un singolo ciclo, almeno su un determinato hardware. Anche in questo caso, una grande istruzione non riduce necessariamente il CPI: con una cache di trace, ciò che viene memorizzato non è l'istruzione raw.
risposta data 14.02.2018 - 23:41
fonte
0

Bene, se il collo di bottiglia è il throughput della memoria, una più piccola lunghezza dell'istruzione consente più istruzioni per byte. Tuttavia, l'utilizzo di una lunghezza variabile per una maggiore densità o estendibilità potrebbe contrastare tale vantaggio a causa della complessità.

A parte questo, dipende.

Nelle architetture cpu più semplici, c'è spesso un conteggio di clock specifico per ogni istruzione di progettazione, che potrebbe dipendere dai dati per qualche sottoinsieme.
Tuttavia, gli interrupt possono influenzare i tempi.

Nelle architetture complesse, specialmente quelle ad alte prestazioni, a causa del pipelining, dell'esecuzione fuori servizio, della condivisione di un bus con periferiche e altre considerazioni, le cose sono più difficili.
Mentre ci sono probabilmente unità di esecuzione di alcuni tipi che alcune sottoinsiemi di istruzioni non dovranno condividere, e che non accedono all'esterno (memoria, dispositivi), molte altre sono influenzate da ciò che è stato fatto prima e potrebbero ancora essere in esecuzione.

    
risposta data 14.02.2018 - 23:37
fonte
0

Su un processore PowerPC, ogni istruzione è sempre di quattro byte, quindi la dimensione dell'istruzione non può influire su nulla.

Su un processore x86 o ia64, le istruzioni sono tra 1 e 15 byte (potrebbe essere 16). Poiché i processori più recenti possono eseguire più di una istruzione per ciclo, devono decodificare più di una istruzione per ciclo. Ciò richiede due cose: le istruzioni di decodifica e la ricerca dell'inizio dell'istruzione successiva. Puoi decodificare più istruzioni contemporaneamente disponendo di più di un decodificatore. Ma trovare dove iniziano le istruzioni (veloce) è difficile.

Per istruzioni semplici, è possibile determinare la lunghezza e con quella l'inizio dell'istruzione successiva molto rapidamente. Per istruzioni complesse, la lunghezza dell'istruzione impiega troppo tempo per iniziare a decodificare l'istruzione successiva. Il risultato è che in un ciclo, questi processori possono decodificare più istruzioni, ma solo fino a raggiungere un'istruzione complessa.

    
risposta data 14.02.2018 - 23:53
fonte

Leggi altre domande sui tag