Como um processador pode executar mais IPS do que sua frequência? [duplicado]

14

Isso tem sido algo que eu não consigo entender. Praticamente todos os processadores modernos são capazes de executar mais instruções por segundo do que sua frequência.

Entendo por que os processadores de classe baixa podem executar menos IPS do que sua frequência. Por exemplo, o ATmega328 executa cerca de 16 MIPS a 16 MHZ (ou pelo menos foi o que me disseram), e o Z80 executa 0,5 MIPS a 4 MHz. Mas o Pentium 4 Extreme pode executar mais de 9 GIPS em apenas 3,2 GHz. São cerca de três instruções por ciclo de relógio!

Como isso é feito e por que isso não é implementado em processadores menores, como os microcontroladores AVR ?

Encontrei todas as minhas informações, exceto o ATmega328, daqui .

Jaca
fonte
3
Dê uma olhada na Wikipedia para palavras-chave como pipeline, arquitetura super escalar, execução fora de ordem, multithreading simultâneo, multicore, extensão vetorial (SSE, ..., AVX), cache e assim por diante. Ao todo, o valor do CPI pode ser menor que 1,0.
Paebbels 15/07/2015
7
Você quis dizer 9 GIPS para o Pentium 4, não MIPS, não foi?
Calimo
5
Autopromoção: como uma CPU pode fornecer mais de uma instrução por ciclo? foi perguntado no Exchange Engineering Stack Exchange (minha resposta foi aceita e talvez com muito voto positivo).
Paul A. Clayton
Eu sempre me perguntei, não devo votar em algo se já é tão alto quanto eu acho que deveria ser? Ou sempre voto a favor se eu acho que o esforço e a qualidade de um post merecem uma recompensa?
Peter Cordes
@ PeterCordes Existem diferentes filosofias de votação. Alguns afirmam que "útil" é o único critério, outros consideram mérito relativo (para respostas). Eu costumo considerar a contagem absoluta de votos ("nice", "good", "great" pós crachás implicam que isso deva ser considerado), bem como a contagem relativa de votos (que ajuda a responder à classificação). Surpreendentemente, o Meta.SE parece não ter muito a ver com esse tópico e " Como devo votar? " Nem sequer tem uma resposta!
Paul A. Clayton

Respostas:

23

Isso ocorre devido a uma combinação de recursos dos processadores modernos.

A primeira coisa que contribui para um alto IPS é o fato de os processadores modernos terem várias unidades de execução que podem operar de forma independente. Na imagem abaixo (emprestada da Wikipedia: Microarquitetura Intel Core ), você pode ver na parte inferior que existem oito unidades de execução (mostradas em amarelo) que podem executar instruções simultaneamente. Nem todas essas unidades podem proteger os mesmos tipos de instrução, mas pelo menos cinco delas podem executar uma operação de ALU e há três unidades compatíveis com SSE.

insira a descrição da imagem aqui

Combine isso com um longo pipeline de instruções que pode empilhar com eficiência instruções prontas para essas unidades executarem instruções ( fora de ordem , se necessário) significa que um processador moderno pode ter um grande número de instruções em tempo real a qualquer momento.

Cada instrução pode levar alguns ciclos de clock para ser executada, mas se você puder efetivamente paralelizar sua execução, poderá dar um impulso maciço ao IPS com o custo da complexidade do processador e da saída térmica.

Manter esses pipelines grandes cheios de instruções também precisa de um cache grande que possa ser preenchido com instruções e dados. Isso contribui para o tamanho da matriz e também a quantidade de calor que o processador produz.

O motivo para isso não ser feito em processadores menores é porque aumenta substancialmente a quantidade de lógica de controle necessária em torno dos núcleos de processamento, bem como a quantidade de espaço necessário e também o calor gerado. Se você deseja um processador pequeno, de baixa potência e altamente responsivo, deseja um pipeline curto sem muita coisa "extra" ao redor dos núcleos funcionais reais. Normalmente, eles minimizam o cache, restringem-no a apenas um de cada tipo de unidade necessária para processar instruções e reduzem a complexidade de cada peça.

Eles poderiam tornar um processador pequeno tão complexo quanto um processador maior e obter um desempenho semelhante, mas os requisitos de consumo de energia e refrigeração seriam aumentados exponencialmente.

Mokubai
fonte
Eu nunca soube que havia unidades especializadas de execução e mais de uma delas. Mas ainda assim, seria bom ter um Arduino superescalar. Eu não me importaria com os requisitos de energia e refrigeração se isso significasse mais rendimento. Obrigado pela resposta.
Jaca
1
Se você deseja um processador superescalar, use um. Mas os Arduinos ocupam um nicho para pessoas que se preocupam com os requisitos de energia e refrigeração (e custo e complexidade) dos processadores superescalares.
David Schwartz
4

Não é difícil de imaginar. Basta um ciclo para trocar muitos milhares de transistores. Desde que as instruções sejam alinhadas em paralelo, um ciclo pode ser suficiente para executá-las todas.

Melhor do que tentar explicar sozinho, aqui está um bom ponto de partida .

misha256
fonte
3

Para ser um pouco mais fundamental do que a resposta de Mokubai:

CPUs superescalares analisam o fluxo de instruções em busca de dependências de dados (e outras) entre as instruções. Instruções que não dependem uma da outra podem ser executadas em paralelo.

As CPUs de desktop x86 típicas buscam 16 ou 32B de instruções a cada ciclo de clock. Os projetos da Intel, desde o Core2, podem emitir até 4 instruções por ciclo. (Ou 5, se houver uma comparação e ramificação que possa se fundir em macro).

Veja a boa resposta de Mobukai para obter links e detalhes sobre como as CPUs na prática executam a tarefa de extrair tanto paralelismo no nível de instrução quanto no código que executam.

Consulte também http://www.realworldtech.com/sandy-bridge/ e artigos semelhantes para outras arquiteturas de CPU para obter uma explicação detalhada do que está por trás.

Peter Cordes
fonte
-2

As respostas anteriores mostram como se obtém mais instruções executadas pela definição de "instrução" do processador e se imagina que é realmente a intenção do questionador.

Mas outra fonte disso pode ser que cada "instrução" seja na verdade uma certa quantidade de dados tratados como entrada de instrução pelo processador. Se a contagem de sua fonte conta apenas o que o processador considera como instruções, o seguinte não adiciona nada. Mas se sua fonte conta tudo o que um humano chamaria de "instrução", então: Acrescente que nem toda instrução é tão fisicamente longa quanto qualquer outra instrução (uma pode ter 12 bytes, outra pode ter 56 bytes etc.). Portanto, se ele carrega 64 bytes de material a cada ciclo como "uma instrução" (ou tantas instruções completas quanto possível antes de atingir 64 bytes) e uma possui seis instruções nesses 64 bytes, seis instruções (como você e eu podemos considerá-las ) será concluído nesse ciclo.

Como muitas instruções muito básicas (nossa definição "sensata") são sobras desde os primeiros dias com comprimentos de instrução de 8 bytes, e instruções muito básicas são, por definição, talvez usadas desproporcionalmente, apenas isso ajudaria muito a realizar mais "instruções" que a frequência parece permitir.

Roy
fonte
Isso é um pouco parecido com o que as CPUs realmente funcionam, mas buscar vários insns de máquina por ciclo é apenas parte de como uma CPU superescalar funciona. (e os comprimentos médios de insns são mais parecidos com 4 bytes, para x86.) Pipelines profundos significam que as instruções que estão sendo buscadas agora podem não concluir a execução por 15 ciclos (ou muito mais, se mantidas por uma falta de cache, mas instruções não dependentes podem continue executando.) Sua explicação não descreve um design em pipeline. Também não está claro qual é a diferença entre um 886 8086 add al, ble um 80386 add eax, ebx.
22615 Peter Cordes