In primo luogo, come sottolinea il commento di Keelan e la risposta di Turbo J , la misurazione era di 113,093 MIPS Dhrystone e non MIPS nativi .
La microarchitettura Ivy Bridge dell'i7 3630QM può eseguire solo il commit di 4 µops fusi per ciclo, sebbene possa iniziare l'esecuzione di 6 µops per ciclo. (Il numero di µops fusi in una traccia di codice è approssimativamente uguale al numero di istruzioni; alcune istruzioni complesse vengono decodificate in più µops che non sono fuse e alcune coppie di istruzioni possono essere fuse in un singolo µop, ad esempio un confronto immediato seguito da un salto condizionale.)
Due delle tue speculazioni su come eseguire più istruzioni in un singolo ciclo sono abbastanza valide e sono state utilizzate in processori reali. La tua prima ipotesi, che viene utilizzato un orologio interno più veloce, è stata utilizzata negli ALU "fireball" originali del Pentium 4. Questi ALU erano sincronizzati al doppio della frequenza del resto del core, che era già relativamente alto.
(Ciò è stato realizzato utilizzando una ALU sfalsata in cui la metà inferiore di un'aggiunta è stata eseguita in un ciclo, consentendo a un'operazione dipendente di utilizzare la metà inferiore del risultato nel ciclo successivo. Per operazioni come aggiungi, xor o spostamento a sinistra che richiedono solo la metà inferiore degli operandi per produrre la metà inferiore completa del risultato, tale sfalsamento, noto anche come pipeline di larghezza, consente la latenza dei risultati a ciclo singolo e la produttività a ciclo singolo).
HyperSPARC utilizzava una tecnica in qualche modo correlata, ALU in cascata. HyperSPARC ha fornito i risultati di due ALU in una terza ALU. Ciò ha permesso di eseguire due operazioni indipendenti e una terza dipendente in un singolo ciclo.
La tua ipotesi che "ci sono più condutture simultanee per core" è l'altra tecnica che è stata utilizzata. Questo tipo di design è chiamato superscalar ed è di gran lunga il mezzo più comune per aumentare il numero di operazioni eseguite in un singolo ciclo.
Ci sono anche alcune altre probabilità e fini dell'esecuzione delle istruzioni che potrebbero essere degne di nota. Alcune operazioni possono essere eseguite in modo più efficiente al di fuori delle normali unità di esecuzione. La tecnica di eliminazione degli spostamenti sfrutta l'uso della ridenominazione dei registri nei processori fuori servizio per eseguire operazioni di spostamento durante la ridenominazione dei registri; lo spostamento semplicemente copia il numero di registro fisico da una posizione nella tabella di ridenominazione (chiamata tabella di alias del registro) in un'altra. Questo non solo aumenta efficacemente la larghezza di esecuzione, ma rimuove anche una dipendenza. Questa tecnica è stata utilizzata all'inizio con lo x87 basato su stack, ma ora è ampiamente utilizzata nei processori x86 ad alte prestazioni di Intel. (L'uso di istruzioni distruttive a due operandi in x86 rende l'eliminazione delle mosse più utile di quanto sarebbe in un tipico RISC.)
Una tecnica simile all'eliminazione degli spostamenti è la gestione delle istruzioni di azzeramento del registro durante la ridenominazione. Fornendo un nome di registro che fornisce il valore zero, un'istruzione di cancellazione del registro (come xor o sottrazione con entrambi gli operandi essendo lo stesso registro) può semplicemente inserire quel nome nella tabella di ridenominazione (RAT).
Un'altra tecnica utilizzata da alcuni processori x86 riduce il costo delle operazioni push e pop. Di solito un'istruzione che utilizza il puntatore dello stack dovrebbe attendere un ciclo completo per un push o pop precedente per aggiornare il valore del puntatore dello stack. Riconoscendo che push and pop aggiunge o sottrae solo un piccolo valore al puntatore dello stack, è possibile calcolare in parallelo i risultati di più aggiunte / sottotazioni. Il ritardo principale per l'addizione è la propagazione del carry, ma con valori piccoli i bit più significativi del valore base - in questo caso il puntatore dello stack - avranno al massimo un carry-in. Ciò consente di applicare un'ottimizzazione simile a quella di un sommatore carry-select a più aggiunte di valori piccoli. Inoltre, poiché il puntatore dello stack viene in genere aggiornato solo da costanti,
È anche possibile unire le istruzioni in un'unica operazione più complessa. Mentre il processo inverso di suddivisione delle istruzioni in più operazioni più semplici è una vecchia tecnica, la fusione delle istruzioni (che Intel definisce fusione macro-op) può consentire all'implementazione di supportare operazioni più complesse di quelle esposte nel set di istruzioni.
Sul lato teorico, sono state proposte altre tecniche. Costanti di piccole dimensioni diverse da zero potrebbero essere supportate nel RAT e alcune semplici operazioni che utilizzano o producono in modo affidabile valori così piccoli potrebbero essere gestite in anticipo. ("Physical Register Inlining", Mikko H. Lipasti et al., 2004, ha suggerito di utilizzare il RAT come mezzo per ridurre il conteggio dei registri, ma l'idea potrebbe essere estesa per supportare il caricamento di piccoli immediati e semplici operazioni su piccoli numeri.)
Per le cache di traccia (che memorizzano sequenze di istruzioni sotto particolari presupposti del flusso di controllo), possono esserci opportunità di unire le operazioni separate da rami e rimuovere le operazioni che producono risultati inutilizzati nella traccia. La memorizzazione nella cache delle ottimizzazioni in una cache di traccia può anche incoraggiare l'esecuzione di ottimizzazioni come l'unione di istruzioni che potrebbe non essere utile se dovessero essere eseguite ogni volta che il flusso di istruzioni veniva recuperato.
La previsione del valore può essere utilizzata per aumentare il numero di operazioni che possono essere eseguite in parallelo rimuovendo le dipendenze. Un predittore di valore basato sul passo è simile all'ottimizzazione pop / push di un motore di stack specializzato menzionato in precedenza. Può calcolare più aggiunte principalmente in parallelo, rimuovendo la serializzazione. L'idea generale di previsione del valore è che con un valore previsto, le operazioni dipendenti possono procedere senza indugio. (La direzione della diramazione e la previsione del bersaglio sono in realtà solo una forma molto limitata di previsione del valore, che consente di recuperare le seguenti istruzioni che dipendono dal "valore" della diramazione, presa o meno, e dall'indirizzo di istruzione successivo, un altro valore.)