Istruzione per ciclo vs aumento del numero di loops

Aumentando entrambe le istruzioni per ciclo o aumentando il numero di loops sono entrambi una valida scelta di progettazione per i produttori di processri. Capisco la teoria, ma sarebbe molto più chiaro se avessi un esempio di vita reale.

Quindi, può qualcuno mi dà un esempio che può trarre beneficio sia di questa scelta di design? Come quale applicazione / tipo di applicazione / process sfrutta il count IPC più elevato e che sfrutta il count più elevato del ciclo.

L'architetto del calcolatore

Ci vuole molto più ingegnerizzazione per aumentare l'IPC, piuttosto che aumentare semplicemente la frequenza di clock. Ad es. Pipelineing, cache, nuclei multipli – introdotti per aumentare IPC – diventano molto complessi e richiedono molti transistor.

Anche se la frequenza massima dell'orologio è limitata dalla lunghezza del path critico di un determinato disegno, se sei fortunato, puoi aumentare la frequenza dell'orologio senza alcun refactoring. E anche se wherete ridurre le lunghezze del path, le modifiche non sono così profonde come quelle che le tecniche di cui sopra richiedono.

Con i processri correnti, tuttavia, le frequenze di clock sono già spinte ai limiti economici. Qui, i guadagni di velocità derivano solamente dall'aumento del IPC.

Il programmatore

Dal punto di vista del programmatore, è finora un problema, in quanto deve adattare il suo stile di programmazione ai nuovi sisthemes creati da architetti di computer. Ad esempio, la programmazione concorrente diventa sempre più inevitabile per sfruttare i valori IPC elevati.

Ho realmente progettato un paio di processri (molti anni fa) e ho un po 'di esperienza nei compromessi.

Per aumentare le istruzioni per ciclo (o, più probabilmente, ridurre i loops per istruzione ) è necessario generalmente "buttare hardware" al problema – aggiungere più cancelli e blocchi e multiplexer. Al di là di un certo punto (passato circa un decennio fa) devi "pipeline" e lavorare contemporaneamente su diverse istruzioni. Questo aumento della complessità non solo aumenta i costi di base (dal momento che il costo di un chip è correlato all'area occupata), aumenta anche la probabilità che un errore lo farà attraverso la revisione iniziale del progetto e si traduca in un chip difettoso che deve essere "respun" – un grande costo e pianificazione hit. Inoltre, l'aumento della complessità aumenta i carichi in modo tale che, in assenza di hardware ancora maggiore, la durata di un ciclo aumenta in realtà. Si potrebbe incontrare la situazione in cui l'aggiunta di hardware ha rallentato le cose. (In realtà, ho visto questo accadere in un caso.)

Inoltre, la "pipelining" può incontrare condizioni in cui la pipeline "è rotta" a causa di rami frequenti (e non previsti) e di altri simili problemi, causando che il processre si rallenta in una striscia di scansione. Quindi c'è un limite a quanto può essere fatto in modo produttivo.

Per accelerare i loops individuali è necessario fare una delle tre cose:

  1. Utilizza una tecnologia più veloce (un "no-brainer" se la tecnologia è disponibile, ma le nuove tecnologie più veloci non vengono visualizzate con la frequenza più frequente)
  2. Rimuovere in qualche modo la logica dal "path critico" (forse eliminando istruzioni complesse dal set di istruzioni o aggiungendo altre limitazioni a livello di software).
  3. Ridurre il ritardo di propagazione attraverso i routes di dati più lenti (che di solito significa "lanciare hardware" al problema ancora – e ancora una volta con la possibilità che questo avrebbe arretrato e rallentato le cose).

Quindi è un sacco di compromessi, e un po 'di danza di tappeto attraverso un field minato.