O que é um pipeline de instruções?

click fraud protection

Qualquer instrução do processador tem vários estágios para sua operação. Cada um desses estágios leva um único ciclo de CPU para ser concluído. Esses estágios são busca de instruções, decodificação de instruções, execução, acesso à memória e writeback. Respectivamente estes obtêm a instrução que precisa ser concluída, separam a operação dos valores que estão sendo operados on, execute o processo, abra o registrador no qual o resultado será escrito e escreva o resultado no registro.

Processadores históricos em ordem

Nos primeiros computadores, a CPU não usava um pipeline de instruções. Nessas CPUs, cada operação de ciclo único precisava acontecer para cada instrução. Isso significava que eram necessários cinco ciclos de clock para que a instrução média fosse processada inteiramente antes que a próxima pudesse ser iniciada. Algumas operações podem não precisar escrever nenhum resultado em um registrador, o que significa que os estágios de acesso à memória e writeback podem ser ignorados.

Em um processador subescalar sem pipeline, cada parte de cada instrução é executada em ordem.

Há um problema à espreita, porém, ao executar uma instrução completa em ordem antes de poder passar para a próxima instrução. O problema é a falta de cache. A CPU armazena os dados que está processando ativamente no registrador. Isso pode ser acessado com uma latência de um ciclo. O problema é que o registro é pequeno porque está embutido no núcleo do processador. A CPU deve ir para o cache L1 maior, mas mais lento, se os dados ainda não tiverem sido carregados. Se não estiver lá, ele deve ir para o cache L2 maior e mais lento novamente. A próxima etapa é o cache L3; a última opção é a RAM do sistema. Cada uma dessas opções leva mais e mais ciclos de CPU para verificar.

Agora, essa latência extra adicionada pode ser um grande problema em um sistema que deve concluir cada instrução em ordem antes de iniciar a próxima instrução. O que era um processador de 5 ciclos por instrução, pode de repente ficar preso em uma instrução por dezenas ou centenas de ciclos de clock. Durante todo o tempo, nada mais pode acontecer no computador. Tecnicamente, isso pode ser aliviado um pouco por ter dois núcleos independentes. Nada, no entanto, os impede de fazer a mesma coisa, potencialmente simultaneamente. Portanto, seguir a rota multi-core não corrige isso.

O Pipeline RISC Clássico

RISC significa Computador com Conjunto de Instruções Reduzido. É um estilo de design de processador que otimiza o desempenho, facilitando a decodificação de cada instrução. Isso é comparado ao CISC ou Complex Instruction Set Computer, que projeta conjuntos de instruções mais complexos, permitindo que menos instruções sejam necessárias para executar as mesmas tarefas.

O projeto RISC clássico inclui um pipeline de instruções. Em vez de executar qualquer um dos cinco estágios de instrução em qualquer ciclo, o pipeline permite que todos os cinco estágios sejam executados. Claro, você não pode executar todos os cinco estágios de uma instrução em um ciclo. Mas você pode enfileirar cinco instruções consecutivas com um deslocamento de um estágio cada. Desta forma, uma nova instrução pode ser completada a cada ciclo de clock. Oferecendo um aumento potencial de desempenho de 5x para um aumento relativamente baixo na complexidade do núcleo.

Em um processador de pipeline escalar, cada estágio da execução de uma instrução pode ser executado uma vez por ciclo de clock. Isso permite um rendimento máximo de uma instrução concluída por ciclo.

Processadores que não possuem pipeline só podem ser subescalares, pois não podem executar uma instrução completa por ciclo. Com esse pipeline primário de cinco estágios, você pode criar uma CPU escalar que pode concluir uma instrução para cada processo. Ao criar pipelines ainda mais abrangentes, você pode criar CPUs superescalares que podem executar mais de uma instrução por ciclo de clock. Claro, ainda existem problemas em potencial.

Ainda Sequencial

Nada disso resolve o problema de esperar muitos ciclos por uma resposta ao precisar consultar os diferentes níveis de cache e RAM. Também introduz um novo problema. E se uma instrução depende da saída da instrução anterior? Esses problemas são resolvidos de forma independente com um despachante avançado. Ele planeja cuidadosamente a ordem de execução para que nenhuma instrução que dependa da saída de outra fique muito próxima. Ele também lida com faltas de cache estacionando uma instrução e substituindo-a no pipeline por outras instruções que estão prontas para serem executadas e não requerem seu resultado, retomando a instrução quando pronto.

Essas soluções podem funcionar em processadores sem pipeline, mas são necessárias para um processador superescalar que executa mais de uma instrução por clock. Um preditor de desvio também é muito útil, pois pode tentar prever o resultado de uma instrução com mais de um resultado potencial e continuar assumindo que está correto, a menos que se prove o contrário.

Conclusão

Um pipeline permite que todos os recursos distintos do processador sejam usados ​​em cada ciclo. Ele faz isso executando diferentes estágios de diferentes instruções simultaneamente. Isso nem adiciona muita complexidade ao design da CPU. Também abre caminho para permitir que mais de uma instrução execute um único estágio por ciclo.