Primeiro, como apontam o comentário de Keelan e a resposta de Turbo J , a medição foi de 113.093 MIPS Dhrystone e não MIPS nativo .
A microarquitetura Ivy Bridge do i7 3630QM pode confirmar apenas 4 µops fundidos por ciclo, embora possa começar a execução de 6 µops por ciclo. (O número de µops fundidos em um traço de código é aproximadamente igual ao número de instruções; algumas instruções complexas são decodificadas em vários µops que não são fundidos e alguns pares de instruções podem ser fundidos em um único µop, por exemplo, uma comparação imediata seguido de um salto condicional.)
Duas de suas especulações sobre como várias instruções podem ser executadas em um único ciclo são bastante válidas e foram usadas em processadores reais. Sua primeira especulação, de que um relógio interno mais rápido é usado, foi usada nas ALUs originais de "bola de fogo" do Pentium 4. Essas ULAs tinham frequência de clock duas vezes maior que a do resto do núcleo, que já era relativamente alto.
(Isso foi realizado usando uma ULA escalonada na qual a metade inferior de uma adição foi feita em um ciclo, permitindo que uma operação dependente use a metade inferior do resultado no próximo ciclo. Para operações como adição, xor ou deslocamento à esquerda que apenas precisam da metade inferior dos operandos para produzir a metade inferior completa do resultado, esse escalonamento - também conhecido como pipelining de largura - permite latência de resultado de ciclo único e taxa de transferência de ciclo único).
Uma técnica um pouco relacionada, ALUs em cascata, foi usada pelo HyperSPARC. O HyperSPARC alimentou os resultados de duas ALUs em uma terceira ALU. Isso permitiu que duas operações independentes e uma terceira dependente fossem executadas em um único ciclo.
Sua especulação de que "existem vários pipelines simultâneos por núcleo" é a outra técnica usada. Esse tipo de design é chamado superescalar e é de longe o meio mais comum de aumentar o número de operações executadas em um único ciclo.
Existem também algumas outras probabilidades e fins de execução de instruções que podem ser dignos de nota. Algumas operações podem ser executadas com mais eficiência fora das unidades de execução comuns. A técnica de eliminação de movimentação explora o uso da renomeação de registradores em processadores fora de ordem para executar operações de movimentação durante a renomeação de registradores; a movimentação simplesmente copia o número do registro físico de uma posição na tabela de renomeação (chamada tabela de alias de registro) para outra. Isso não apenas aumenta efetivamente a largura de execução, mas também remove uma dependência. Essa técnica foi usada no início com o x87 baseado em pilha, mas agora é amplamente usada nos processadores x86 de alto desempenho da Intel. (O uso de instruções destrutivas de dois operandos no x86 torna a eliminação de movimentos mais útil do que seria em um RISC típico.)
Uma técnica semelhante à eliminação de movimentação é a manipulação das instruções de zerar o registro durante a renomeação. Ao fornecer um nome de registro que forneça o valor zero, uma instrução de limpeza de registro (como xor ou subtrair com os dois operandos sendo o mesmo registro) pode simplesmente inserir esse nome na tabela de renomeação (RAT).
Outra técnica usada por alguns processadores x86 reduz o custo de operações push e pop. Normalmente, uma instrução usando o ponteiro da pilha teria que esperar um ciclo completo por um push ou pop anterior para atualizar o valor do ponteiro da pilha. Ao reconhecer que push e pop apenas adicionam ou subtraem um pequeno valor ao ponteiro da pilha, é possível calcular os resultados de várias adições / subações em paralelo. O principal atraso da adição é a propagação de transporte, mas com valores pequenos, os bits mais significativos do valor base - nesse caso, o ponteiro da pilha - terão apenas no máximo um transporte. Isso permite que uma otimização semelhante à de um somador carry-select seja aplicada a várias adições de pequenos valores. Além disso, como o ponteiro da pilha geralmente é atualizado apenas por constantes,
Também é possível mesclar instruções em uma operação única e mais complexa. Embora o processo inverso de dividir as instruções em várias operações mais simples seja uma técnica antiga, as instruções de mesclagem (que a Intel chama de fusão de macro-operações) podem permitir que a implementação ofereça suporte a operações mais complexas do que as expostas no conjunto de instruções.
Do lado teórico, outras técnicas foram propostas. Pequenas constantes diferentes de zero podem ser suportadas no RAT e algumas operações simples que usam ou produzem valores pequenos e confiáveis podem ser tratadas antecipadamente. ("Physical Register Inlining", Mikko H. Lipasti et al., 2004, sugeriu o uso do RAT como um meio de reduzir a contagem de registros, mas a idéia poderia ser estendida para suportar o carregamento de pequenos imediatos e operações simples em pequenos números.)
Para caches de rastreio (que armazenam sequências de instruções sob premissas específicas do fluxo de controle), pode haver oportunidades para mesclar operações separadas por ramificações e remover operações que produzam resultados não utilizados no rastreio. O armazenamento em cache das otimizações em um cache de rastreamento também pode incentivar a execução de otimizações, como a mesclagem de instruções, que pode não valer a pena se elas precisassem ser feitas sempre que o fluxo de instruções fosse buscado.
A previsão de valor pode ser usada para aumentar o número de operações que podem ser executadas em paralelo, removendo dependências. Um preditor de valor baseado em passada é semelhante à otimização pop / push de um mecanismo de pilha especializado mencionado anteriormente. Ele pode calcular várias adições principalmente em paralelo, removendo a serialização. A idéia geral de previsão de valor é que, com um valor previsto, as operações dependentes podem prosseguir sem demora. (A direção da ramificação e a previsão do alvo são efetivamente apenas uma forma muito limitada de previsão de valor, permitindo a busca das instruções a seguir, que dependem do "valor" da ramificação - obtida ou não - e do endereço da instrução seguinte, outro valor.)