Caminho de dados do processador e segmentação em pipeline

Veja como um processador executa instruções. Construa um caminho de dados RISC-V de ciclo único com registradores, uma ULA, memórias e multiplexadores, projete os sinais de controle que o comandam e acompanhe instruções reais por ele com valores concretos. Depois, divida-o em um pipeline de cinco estágios, calcule a aceleração e aprenda como encaminhamento, paradas, escalonamento de código e predição de desvios mantêm o pipeline ocupado apesar dos conflitos de dados e de controle.

IntermediárioAula 4 de 6 do curso Curso de Organização e arquitetura de computadores

O que você vai aprender

  1. Identificar as unidades de hardware necessárias a um processador RISC-V, conectá-las para que instruções aritméticas, de acesso à memória e de desvio terminem em um ciclo de clock e acompanhar instruções reais pelo caminho de dados resultante.
    • Identificar os componentes de um caminho de dados e como são sincronizados pelo clock
      Distinguir elementos combinacionais de elementos de estado e descrever o que fazem o contador de programa, as memórias, o banco de registradores, a ULA, o gerador de imediatos, os somadores e os multiplexadores.
    • Interligar o caminho de dados para instruções aritméticas, de acesso à memória e de desvio
      Determinar quais unidades e conexões cada classe de instrução usa e reunir os caminhos separados em um único caminho de dados, com multiplexadores nos pontos de encontro.
    • Acompanhar instruções pelo caminho de dados de ciclo único
      Acompanhar instruções concretas com valores reais de registradores e de memória por todas as unidades, informar os valores nos fios principais e indicar o que muda na borda de clock.
  2. Determinar os sinais de controle que fazem o caminho de dados executar cada instrução, usando uma unidade de controle principal comandada pelo código de operação e uma pequena unidade de controle da ULA comandada pelos campos de função.
    • Definir os sinais de controle principais para cada instrução
      Explicar o que faz cada sinal de controle principal, construir a tabela de controle para instruções do tipo R, de carga, de armazenamento e de desvio e usar corretamente valores indiferentes.
    • Gerar o controle da ULA a partir de ALUOp e dos campos de função
      Usar a decodificação em dois níveis para transformar o ALUOp de 2 bits e os campos funct7 e funct3 da instrução no código de 4 bits que seleciona a operação da ULA.
  3. Explicar como a sobreposição de instruções aumenta a vazão, descrever o caminho de dados em pipeline de cinco estágios com seus registradores e controle e acompanhar instruções com diagramas de pipeline.
    • Explicar por que a segmentação em pipeline acelera um processador
      Determinar o período de clock de um projeto de ciclo único a partir do caminho crítico e calcular a vazão, a latência e a aceleração de uma versão em pipeline.
    • Descrever o caminho de dados em pipeline de cinco estágios e seus registradores de pipeline
      Explicar o que os registradores de pipeline armazenam, como os sinais de controle acompanham cada instrução e por que toda instrução passa pelos cinco estágios.
    • Acompanhar instruções com diagramas de pipeline
      Desenhar e ler diagramas de pipeline de múltiplos ciclos, identificar a instrução que está em cada estágio em um determinado ciclo e contar o total de ciclos com e sem paradas.
  4. Reconhecer quando instruções no pipeline entram em conflito e resolver conflitos de dados com encaminhamento, paradas e escalonamento de instruções.
    • Identificar conflitos e as dependências de dados que os causam
      Classificar conflitos como estruturais, de dados ou de controle, identificar as dependências entre instruções e determinar quais causam paradas em um pipeline sem encaminhamento.
    • Encaminhar resultados para evitar paradas do pipeline
      Explicar os caminhos de encaminhamento e as condições da unidade de encaminhamento e determinar de onde vem cada operando da ULA em uma dada sequência de instruções.
    • Inserir paradas para conflitos de carga e uso e escalonar o código para evitá-los
      Detectar conflitos de carga e uso, explicar como o pipeline insere uma bolha e reordenar instruções para eliminar paradas sem alterar o resultado do programa.
  5. Reduzir o custo dos desvios com resolução antecipada, descarte de instruções e predição estática ou dinâmica e estimar como todos os conflitos afetam em conjunto o desempenho do pipeline.
    • Reduzir o custo dos desvios no pipeline
      Explicar por que desvios causam conflitos de controle, comparar paradas, predição de desvio não tomado e resolução antecipada de desvios e tratar exceções como uma mudança relacionada no fluxo de controle.
    • Prever desvios dinamicamente com base no histórico
      Acompanhar preditores de desvio de 1 bit e 2 bits, explicar a tabela de histórico de desvios e o buffer de destinos de desvios e reconhecer onde preditores simples falham.
    • Estimar o desempenho do pipeline considerando conflitos
      Combinar paradas por carga e uso e penalidades de desvio em um CPI efetivo, calcular tempos de execução e comparar estratégias de tratamento de desvios e projetos de processadores.

Guia de estudo de Caminho de dados e pipeline

5 capítulos

1

Construir um caminho de dados de ciclo único

Um processador transforma bits de instrução em mudanças nos registradores, na memória e no endereço da próxima instrução. Acompanhe os componentes que realizam esse trabalho e depois conecte-os em caminhos para operações aritméticas, cargas, armazenamentos e desvios. Acompanhamentos concretos mostram os valores nos fios e as mudanças salvas em cada borda de clock. O projeto usa registradores RV64 e um pequeno conjunto de instruções RISC-V de 4 bytes, de modo que cada conexão tem uma função clara.

1.1 Identificar o hardware e o limite entre bordas de clock

Um caminho de dados armazena e transforma os valores de que uma instrução precisa. A unidade de controle direciona esses valores e habilita escritas. Juntos, eles executam instruções como add, sub, and, or, ld, sd e beq.

Acompanhe os valores entre bordas de clock

Um elemento de estado guarda um valor: o contador de programa, o banco de registradores e a memória de dados são exemplos. Um elemento combinacional produz uma saída a partir das entradas atuais. Somadores, multiplexadores, a ULA e o gerador de imediatos realizam esse trabalho sem armazenar o resultado de uma instrução entre ciclos.

Na borda ativa do clock, os elementos de estado capturam seus próximos valores. Entre bordas, suas saídas alimentam a lógica combinacional. O PC pode, portanto, fornecer o endereço atual durante todo um ciclo e capturar o próximo endereço ao final dele. Ler um elemento de estado não o sobrescreve por si só.

Busca e acesso aos registradores

O contador de programa (PC) armazena o endereço da instrução. A memória de instruções retorna a instrução de 32 bits nesse endereço. Neste modelo, ela é somente de leitura durante a execução do programa e funciona como uma consulta que associa endereços a instruções. Um somador separado forma PC + 4 porque as instruções desse subconjunto ocupam 4 bytes.

O banco de registradores contém x0–x31. Duas portas de leitura recebem os números de origem rs1 e rs2 e retornam os valores correspondentes. Uma porta de escrita recebe o destino rd, os dados de escrita e RegWrite. As leituras são combinacionais; uma escrita habilitada é salva na borda de clock. A leitura de x0 sempre retorna zero, e escritas nesse registrador são descartadas. Registradores RV64 armazenam 64 bits. Uma versão RV32 usa registradores de 32 bits e lw/sw, com as mesmas conexões básicas.

Calcule, selecione e acesse a memória

A unidade lógica e aritmética (ULA) soma, subtrai ou realiza uma operação bit a bit. Um código de controle de 4 bits seleciona a operação. A saída Zero da ULA vale 1 quando o resultado é zero; a subtração pode, portanto, testar se dois valores são iguais.

O gerador de imediatos, ImmGen, reconstrói o imediato de uma instrução e faz a extensão de sinal até 64 bits. Copiar o bit de sinal preserva um valor negativo. O padrão de 12 bits 1111 1111 1000 representa −8; a extensão com zeros o transformaria em 4088 e enviaria uma operação de memória ao endereço errado.

Um multiplexador, ou mux, seleciona uma entrada. Multiplexadores escolhem o segundo operando da ULA, os dados de escrita do registrador e o próximo PC. Um multiplexador muda o caminho; uma habilitação de escrita decide se um valor armazenado muda.

A memória de dados tem entradas de endereço e de dados de escrita, uma saída de dados de leitura e os controles MemRead e MemWrite. Uma carga precisa buscar a instrução e acessar dados durante o mesmo ciclo único. Memórias de instruções e de dados separadas fornecem os dois acessos. Somadores separados também permitem calcular PC + 4 e o destino do desvio enquanto a ULA realiza outro trabalho.

Saídas não usadas ainda podem mudar durante um ciclo. O controle correto garante que somente as saídas selecionadas cheguem a escritas habilitadas em elementos de estado. Um valor calculado em um fio não selecionado não tem efeito no programa.

Principais conclusões

  • O caminho de dados processa valores; os sinais de controle selecionam caminhos e habilitam escritas.
  • Elementos de estado mantêm valores entre bordas de clock; elementos combinacionais transformam as entradas atuais.
  • O banco de registradores tem duas portas de leitura e uma de escrita, e a leitura de x0 sempre retorna zero.
  • A extensão de sinal preserva o valor com sinal de um imediato.
  • Memórias e somadores separados permitem realizar trabalhos necessários simultaneamente em um único ciclo.

1.2 Conectar os caminhos de cada classe de instrução

Comece pelo que cada instrução precisa ler e pelo que deve alterar. O caminho de dados compartilhado reúne essas rotas, com um multiplexador onde valores alternativos chegam a uma mesma entrada.

Busque e decodifique os campos

A busca usa o PC para ler a memória de instruções e calcula PC + 4 em paralelo. O código de operação ocupa os bits 6–0. Quando presentes, rd fica nos bits 11–7, funct3 em 14–12, rs1 em 19–15 e rs2 em 24–20; funct7 do tipo R ocupa os bits 31–25. Posições fixas dos campos de origem permitem que as leituras dos registradores comecem enquanto o controle da instrução é decodificado. Um armazenamento ou desvio não tem campo rd: os bits 11–7 compõem parte do imediato.

Compare os caminhos de execução
InstruçãoEntradas e ação da ULAMemória de dadosResultado salvo
add x5, x6, x7x6 + x7Sem acessoSoma em x5
ld x5, 16(x6)x6 + 16Leitura no endereço efetivoDados da memória em x5
sd x5, 24(x6)x6 + 24Escrita de x5 no endereço efetivoMemória alterada
beq x8, x9, offsetx8 − x9Sem acessoSeleção do próximo PC

Para uma carga, o resultado da ULA é um endereço efetivo, o endereço dos dados a ler. A saída da memória então retorna ao banco de registradores. Um armazenamento também forma um endereço com a ULA, mas seu segundo valor de origem segue separadamente para a entrada de dados de escrita da memória. Selecionar um imediato como operando da ULA não deve descartar esse valor a ser armazenado. ImmGen reconstrói o deslocamento do formato S a partir dos dois grupos de bits.

Um desvio realiza duas operações em paralelo. A ULA subtrai os valores dos registradores comparados; Zero indica se são iguais. O somador de desvio soma o deslocamento em bytes com sinal ao próprio PC do desvio. A codificação do formato B omite o bit menos significativo, que é sempre zero. ImmGen pode reconstruir o deslocamento completo em bytes, incluindo esse zero; um diagrama que gere o deslocamento em unidades de meia palavra precisa de um deslocamento de uma posição à esquerda. Esse deslocamento deve aparecer no caminho exatamente uma vez.

Una os caminhos com multiplexadores

ALUSrc seleciona o valor de rs2 ou o imediato para a segunda entrada da ULA. MemtoReg seleciona o resultado da ULA ou a saída da memória de dados para escrita no registrador. PCSrc seleciona PC + 4 ou o destino do desvio. Dois resultados concorrentes precisam de um seletor, não de um fio que ligue diretamente suas saídas.

Esses caminhos explicam por que a carga tem a cadeia mais longa: busca, leitura de registradores, cálculo de endereço, leitura da memória e escrita de registrador contribuem para ela. A operação aritmética não passa pela memória de dados; um armazenamento não passa pela escrita do resultado no registrador.

Amplie os caminhos existentes

addi x5, x6, 3 reutiliza o caminho da ULA com entrada imediata e o caminho de escrita do resultado da ULA no registrador. Ela precisa de controle adequado, mas de nenhuma nova unidade no caminho de dados. jal tem uma exigência adicional: escreve PC + 4 em rd enquanto redireciona o PC sem um teste de igualdade. Portanto, o seletor de escrita precisa de uma entrada PC + 4, e a lógica do próximo PC deve permitir um salto incondicional.

Principais conclusões

  • Uma carga escreve dados da memória em rd; a saída da ULA é o endereço.
  • Um armazenamento envia rs2 à memória enquanto a ULA soma a base e o deslocamento.
  • Um desvio compara valores de registradores e calcula PC + deslocamento em paralelo.
  • ALUSrc, MemtoReg e PCSrc selecionam caminhos compartilhados.
  • A reconstrução do deslocamento em bytes do formato B inclui o bit zero implícito exatamente uma vez.
  • A adição com imediato reutiliza o hardware existente; o salto com enlace também precisa de um caminho para escrever PC + 4 no registrador.

1.3 Acompanhar os valores e as mudanças de estado

O acompanhamento de uma instrução relaciona a operação em linguagem de montagem a valores reais nos fios. Separe os valores calculados durante o ciclo dos valores salvos na borda de clock ao final dele.

Use uma ordem consistente de acompanhamento
  1. Busque a partir do PC atual e identifique os campos da instrução.
  2. Leia os registradores de origem e forme o imediato com sinal.
  3. Selecione os operandos da ULA e calcule o resultado.
  4. Realize o acesso solicitado à memória de dados.
  5. Selecione os dados de escrita do registrador e o próximo PC.
  6. Liste as escritas nos elementos de estado na borda de clock.
Some dois valores de registradores

No PC 400, add x5, x6, x7 tem a codificação 0x007302B3. Seus campos são opcode 0110011, rd 5, funct3 000, rs1 6, rs2 7 e funct7 0000000. Com x6 = 25 e x7 = −9, as portas de leitura fornecem 25 e −9. ALUSrc seleciona o segundo valor de registrador, e a ULA produz 16. MemtoReg seleciona 16 para escrita no registrador. Na borda, x5 passa a valer 16 e o PC passa a valer 404. MemRead e MemWrite são ambos zero.

Carregue e depois armazene uma palavra dupla

No PC 404, considere ld x5, 16(x6) com x6 = 1000 e a memória em 1016 contendo 42. ImmGen fornece 16. A ULA calcula o endereço 1016, e a memória de dados retorna 42. MemtoReg seleciona esse valor da memória, então x5 passa a valer 42 e o PC passa a valer 408 na borda. Escrever 1016 em x5 confundiria o endereço com o valor armazenado nele.

No PC 408, sd x5, 24(x6) lê x5 = 42 e x6 = 1000. A ULA calcula 1024 enquanto o caminho de rs2 fornece 42 à memória. MemWrite habilita o armazenamento; RegWrite é zero. Na borda, a palavra dupla em 1024 passa a valer 42 e o PC passa a valer 412. O endereço de memória e o valor a armazenar percorrem fios diferentes.

Os deslocamentos são medidos em bytes. Palavras duplas RV64 adjacentes começam a 8 bytes de distância: após a palavra dupla em 1016, a próxima começa em 1024. Avançar um byte não chegaria à próxima palavra dupla.

Decida um desvio

No PC 412, beq x8, x9, 12 compara x8 = 7 com x9 = 7. A ULA subtrai e obtém zero. Branch é 1, então Branch AND Zero é 1 e PCSrc seleciona o destino do desvio. O somador de desvio produz 424 ao somar 12 a 412. Somente o PC muda.

Se x9 for 8, a subtração produzirá −1 e Zero será 0. O próximo PC será então 416. O deslocamento codificado está em unidades de 2 bytes, então a quantidade com sinal armazenada para esse deslocamento de 12 bytes é 6; o deslocamento completo usado pelo somador continua sendo 12.

Leia o estado para a próxima instrução

Cada instrução de ciclo único conclui seu trabalho entre bordas de clock consecutivas. A próxima instrução lê o estado salvo na borda anterior. Assim, o armazenamento pode ler o novo valor de x5 da carga no ciclo seguinte sem encaminhamento de pipeline. Cada instrução leva um ciclo de clock, resultando em um CPI de ciclo único igual a 1, independentemente do número de unidades de hardware usadas pelo caminho.

Principais conclusões

  • Um acompanhamento fornece valores numéricos nos fios e identifica separadamente as mudanças de estado na borda de clock.
  • Uma instrução aritmética escreve um resultado da ULA; uma carga escreve a saída da memória.
  • Um armazenamento altera a memória e o PC, sem escrever no banco de registradores.
  • Para beq, a igualdade seleciona o destino calculado a partir do PC do desvio.
2

Projetar a unidade de controle do processador de ciclo único

O mesmo hardware pode somar dois registradores, calcular um endereço de memória ou comparar valores para um desvio. Os sinais de controle decidem qual ação importa em cada ciclo. Determine esses sinais a partir do trabalho que uma instrução deve realizar, incluindo as habilitações de escrita que protegem o estado armazenado. Depois, acompanhe os dois níveis de decodificação que transformam um código de operação e bits de função em uma operação específica da ULA e amplie o projeto para a adição com imediato.

2.1 Determinar a tabela de controle principal

A unidade de controle principal traduz um código de operação em sinais de seleção e permissões de escrita. Ela é uma tabela-verdade combinacional implementada com portas lógicas: controle por lógica fixa.

Atribua uma função a cada sinal

RegWrite habilita uma escrita em rd. ALUSrc seleciona a segunda entrada da ULA: 0 para rs2, 1 para um imediato. MemRead e MemWrite solicitam o acesso correspondente à memória de dados. MemtoReg seleciona os dados de escrita do registrador: 0 para o resultado da ULA, 1 para os dados da memória. Branch indica um desvio por igualdade. O ALUOp de 2 bits informa à unidade de controle da ULA, que é separada, qual classe de operação é necessária.

PCSrc é diferente: depende da instrução e dos valores comparados. O controle principal ativa Branch, e a ULA fornece Zero. A operação AND entre eles forma PCSrc, então um resultado aritmético comum igual a zero não pode, por si só, causar um desvio.

Construa a tabela a partir das ações necessárias
ClasseALUSrcMemtoRegRegWriteMemReadMemWriteBranchALUOp
Tipo R00100010
ld11110000
sd1X001000
beq0X000101

Para ld, a ULA precisa de um deslocamento imediato, então ALUSrc é 1. Os dados carregados vão para rd, fazendo MemtoReg e RegWrite valerem 1. A memória é lida, não escrita, resultando em MemRead = 1 e MemWrite = 0. Branch é 0, e ALUOp = 00 solicita a adição para formar o endereço.

Para sd, a ULA também soma um deslocamento, mas o destino é a memória. Defina MemWrite = 1 e RegWrite = 0. MemRead permanece zero: usar a memória não significa lê-la. Para beq, a ULA usa os dois valores de registrador e subtrai, enquanto a única atualização possível do estado arquitetural é a do PC.

Use valores indiferentes apenas onde os resultados são ignorados

X é um valor indiferente, o que significa que qualquer valor de seleção produz o mesmo comportamento. MemtoReg pode ser X para um armazenamento ou desvio porque RegWrite é zero. A entrada de dados de escrita do banco de registradores é ignorada, então quem projeta pode escolher o valor de seleção que simplifica o circuito.

Uma habilitação de escrita em elemento de estado não pode ser tratada dessa forma quando a escrita é proibida. Um MemWrite acidental durante uma operação aritmética pode corromper a memória, embora a instrução aritmética não precise da saída dessa memória para outra finalidade. Portanto, RegWrite e MemWrite devem ser explicitamente zero para instruções que não realizam essas escritas.

Acrescente uma linha para aritmética com imediato

addi x5, x6, 3 obtém o segundo operando de ImmGen e escreve a soma da ULA. Sua linha é ALUSrc 1, MemtoReg 0, RegWrite 1, MemRead 0, MemWrite 0, Branch 0, ALUOp 00. O código de operação 0010011 é diferente do código 0110011 do tipo R, então o controle principal precisa dessa linha extra. O suporte a andi e ori também exige a decodificação dos valores de funct3 dessas instruções para selecionar a operação.

Os nomes dos sinais dependem do projeto. RegWEn, BSel e WBSel, em diagramas de outros cursos, descrevem funções relacionadas de habilitação de escrita e seleção de entrada. Ao ler um novo diagrama, acompanhe a definição de cada sinal e as entradas do multiplexador correspondente.

Principais conclusões

  • O controle principal determina seleções de caminhos e habilitações de escrita a partir do código de operação.
  • PCSrc combina Branch com o indicador Zero da ULA.
  • Um armazenamento habilita MemWrite e desabilita RegWrite e MemRead.
  • Um seletor só é indiferente quando o valor selecionado não pode afetar o comportamento.
  • addi precisa de uma nova linha de código de operação, mas reutiliza o caminho de dados existente para adição com imediato.

2.2 Decodificar a operação da ULA em dois níveis

O código de operação sozinho não distingue add de sub: ambas pertencem à classe do tipo R. O controle em dois níveis primeiro identifica a classe e depois usa os bits de função quando necessário.

De ALUOp à operação

O controle principal fornece um ALUOp de 2 bits entre suas demais saídas. O controle da ULA combina ALUOp com funct3 e o bit 30 da instrução, parte de funct7, para produzir quatro bits de controle da operação.

ALUOpInformação adicionalControle da ULAOperação
00Bits de função ignorados0010Adição
01Bits de função ignorados0110Subtração
10funct3 000, bit 30 = 00010Adição
10funct3 000, bit 30 = 10110Subtração
10funct3 1110000AND
10funct3 1100001OR

Esses códigos descrevem esta implementação da ULA, não codificações de instruções RISC-V. Cargas e armazenamentos usam ALUOp 00 porque somam uma base e um deslocamento. Desvios por igualdade usam ALUOp 01 porque a subtração produz Zero quando os operandos são iguais. Instruções do tipo R usam ALUOp 10 e precisam de mais decodificação.

Acompanhe uma subtração codificada

sub x5, x6, x7 tem a codificação 0x407302B3. O código de operação 0110011 identifica o tipo R e seleciona ALUOp 10. Seu funct3 é 000, o que deixa adição e subtração como possibilidades. O bit 30 é 1, de funct7 0100000, então o controle da ULA fornece 0110 para subtração.

Mudar esse bit de função para zero produz a codificação de adição correspondente 0x007302B3, com funct7 0000000 e controle da ULA 0010. A linha do controle principal permanece a mesma porque ambas as instruções usam duas entradas de registrador, escrevem um resultado da ULA e não acessam a memória de dados.

Reutilize o somador para subtração

Na ULA clássica, as linhas de controle representam Ainvert, Bnegate e um seletor de operação de 2 bits. A subtração usa o somador após inverter o segundo operando e fornecer um vai-um de entrada igual a 1:

a−b=a+b‾+1

Essa identidade de complemento de dois permite que adição e subtração compartilhem hardware. A diferença em Bnegate explica os códigos 0010 e 0110; ela não exige um caminho aritmético separado para cada instrução.

Decodifique os bits apenas no formato adequado

Para ALUOp 00 ou 01, as posições dos campos de função não selecionam a operação da ULA. O funct3 011 de uma carga descreve um acesso a uma palavra dupla. Os bits mais significativos de armazenamento e desvio incluem bits de imediato. Tratar essas posições como campos de função do tipo R confundiria a formação de endereços com a decodificação aritmética.

Para uma verificação rápida do tipo R, ALUOp 10 com funct3 110 seleciona 0001, a operação OR. Acrescentar outra operação sob o mesmo código de operação pode exigir apenas uma mudança no controle da ULA se ela já oferecer suporte à operação. Uma nova classe de instrução também pode exigir mudanças no controle principal, como ocorre com a aritmética com imediato.

Principais conclusões

  • ALUOp seleciona uma classe de operação; os bits de função do tipo R completam a decodificação.
  • ALUOp 00 solicita adição e 01 solicita subtração sem decodificação de função.
  • Neste projeto, 0010 seleciona adição e 0110 seleciona subtração.
  • O bit 30 distingue add de sub quando funct3 é 000.
  • Os significados dos campos de função dependem do formato da instrução.
  • A subtração em complemento de dois reutiliza a adição com o segundo operando invertido e vai-um de entrada igual a 1.
3

Segmentar o caminho de dados em pipeline

Um período de clock longo em um processador de ciclo único deve acomodar uma carga mesmo quando a instrução atual exige menos trabalho. A segmentação em pipeline divide esse trabalho em estágios e sobrepõe instruções. Compare o período de clock, a vazão e a latência resultantes e acompanhe os dados e controles armazenados entre os estágios. Diagramas de pipeline tornam a sobreposição visível e oferecem uma maneira direta de contar o enchimento, a operação em regime e a conclusão de uma sequência curta de instruções.

3.1 Calcular período de clock, latência e vazão

Um processador de ciclo único deve terminar sua instrução mais lenta antes da próxima borda. Instruções mais rápidas ainda esperam pelo mesmo clock fixo. A segmentação em pipeline muda a quantidade de trabalho que cada período de clock deve conter.

Determine o limite do ciclo único

Use estes atrasos dos componentes, desconsiderando multiplexadores e pequenos somadores: busca 250 ps, leitura de registradores 150 ps, ULA 200 ps, memória de dados 250 ps e escrita de registrador 150 ps.

InstruçãoAtraso do caminho
Tipo R250 + 150 + 200 + 150 = 750 ps
ld250 + 150 + 200 + 250 + 150 = 1000 ps
sd250 + 150 + 200 + 250 = 850 ps
beq250 + 150 + 200 = 600 ps

A carga determina o caminho crítico, fixando o período em 1000 ps, ou 1 ns. Isso corresponde a um clock de 1 GHz. Uma distribuição de 25% de cargas, 10% de armazenamentos, 50% de instruções do tipo R e 15% de desvios tem um atraso ponderado de caminho de 800 ps. Mesmo assim, cada instrução recebe 1000 ps, o que equivale a 1,25 vez essa média. Um atraso médio não pode definir um clock que também deve acomodar a instrução mais longa.

Sobreponha cinco estágios

O pipeline divide a execução em IF (busca), ID (decodificação e leitura de registradores), EX (execução ou cálculo de endereço), MEM (acesso à memória de dados) e WB (escrita em um registrador). Instruções diferentes ocupam estágios diferentes simultaneamente.

A vazão conta as instruções concluídas por unidade de tempo. A latência mede o tempo que uma instrução leva da entrada até a conclusão. Uma linha de montagem pode concluir um item por intervalo mesmo que cada item precise de vários intervalos para percorrê-la. A mesma distinção se aplica aqui.

O estágio mais lento leva 250 ps. Com 20 ps de sobrecarga dos registradores de pipeline, o período de clock é de 270 ps, cerca de 3,70 GHz. Uma instrução percorre cinco períodos, levando 1350 ps. Isso supera sua latência no ciclo único, mas um pipeline cheio pode concluir uma instrução a cada 270 ps.

Inclua o tempo de enchimento e conclusão

Sem paradas, um pipeline de k estágios executa n instruções em k + n − 1 ciclos. Para cinco estágios, são n + 4. Quatro instruções precisam de oito ciclos, levando 2160 ps, em comparação com 4000 ps no processador de ciclo único. A aceleração é de cerca de 1,85.

Para 1.000.000 de instruções, o pipeline precisa de 1.000.004 ciclos, aproximadamente 270,0 μs. O projeto de ciclo único precisa de 1000 μs. A aceleração se aproxima da razão 1000/270, cerca de 3,70, à medida que o custo fixo de enchimento e esvaziamento se torna pequeno.

Uma aceleração perfeita de cinco vezes exigiria cinco estágios igualmente lentos de 200 ps, sem sobrecarga de registradores ou atrasos por conflitos. Estágios desiguais fazem os mais rápidos esperar pelo mais lento. Mais estágios também acrescentam sobrecarga e podem aumentar os custos dos conflitos.

Instruções fixas de 32 bits nesse subconjunto simplificam a busca. Campos de registrador em posições fixas ajudam ID, e a restrição do acesso à memória de dados a cargas e armazenamentos se ajusta ao cálculo de endereço em EX seguido por MEM. Essas propriedades da ISA tornam práticos os limites entre estágios.

Principais conclusões

  • A instrução completa mais lenta determina o período de clock do ciclo único.
  • O estágio mais lento somado à sobrecarga dos registradores determina o período do pipeline.
  • A segmentação em pipeline aumenta a vazão; a latência de uma instrução pode aumentar.
  • Uma sequência sem conflitos de n instruções em um pipeline de cinco estágios leva n + 4 ciclos.
  • Estágios desiguais, sobrecarga de registradores, sequências curtas e conflitos reduzem a aceleração.

3.2 Transportar cada instrução pelos registradores de pipeline

Várias instruções compartilham o caminho de dados ao mesmo tempo, então cada estágio precisa dos valores da instrução que está nele. Registradores de pipeline preservam esses valores e seus sinais de controle em cada borda de clock.

Relacione o conteúdo ao trabalho posterior
RegistradorInformação transportada adiante
IF/IDInstrução e seu PC
ID/EXValores de origem, imediato, PC, rs1, rs2, rd, bits de função, controles de EX/MEM/WB
EX/MEMResultado da ULA, Zero, destino do desvio, valor a armazenar, rd, controles de MEM/WB
MEM/WBDados da memória, resultado da ULA, rd, controles de WB

Cada registrador recebe o nome dos estágios adjacentes. Ele captura as saídas do primeiro estágio para uso no segundo. Não há registrador de pipeline extra após WB; WB escreve no estado arquitetural. O PC fornece o estado na entrada da busca.

O conteúdo de EX/MEM apresentado acima atende a um projeto que usa as informações de desvio em MEM. Um projeto que resolve desvios em EX retorna essas informações à busca mais cedo. O estágio de resolução determina a penalidade por conflito de controle.

Mantenha o destino e os dados juntos

Uma carga é decodificada em ID, mas escreve em rd três ciclos depois, em WB. Nesse momento, IF/ID contém uma instrução mais recente. Se a porta de escrita usasse o rd dessa instrução mais recente, o valor carregado iria para o registrador errado. Portanto, o número do destino da carga deve passar por ID/EX, EX/MEM e MEM/WB junto com o resultado.

Um armazenamento também transporta seu valor de rs2 por ID/EX e EX/MEM. O endereço e os dados devem corresponder ao mesmo armazenamento quando chegam à memória de dados. Os registradores de pipeline preservam a identidade de uma instrução por meio desses valores associados, embora várias outras instruções estejam ativas ao mesmo tempo.

Mova o controle com a instrução

O controle é gerado em ID. EX usa ALUSrc e ALUOp; MEM usa Branch, MemRead e MemWrite; WB usa MemtoReg e RegWrite. Cada estágio passa os controles necessários posteriormente junto com os dados.

Se o controle da ULA for decodificado em EX, ID/EX deverá transportar o bit 30 e funct3, além de ALUOp. As operações do tipo R compartilham ALUOp 10, então esse valor sozinho não distingue add, sub, AND e OR. Outro projeto válido decodifica a operação completa de 4 bits em ID e transporta esse código.

Mantenha regular a passagem pelos estágios

Uma instrução do tipo R passa por MEM sem usar a memória de dados. Um armazenamento passa por WB sem escrever em um registrador. Manter todas as instruções na mesma sequência de cinco estágios preserva a ordem das escritas nos registradores. Se uma instrução do tipo R pulasse MEM, ela poderia chegar à única porta de escrita de registrador no mesmo ciclo que a carga imediatamente anterior.

O banco de registradores atende a WB e ID em um ciclo escrevendo na primeira metade e lendo na segunda. ID pode então ver um valor escrito por uma instrução anterior naquele ciclo. Memórias de instruções e de dados separadas permitem que IF e MEM operem simultaneamente.

A maior parte das informações avança pelo pipeline. A escrita do resultado retorna um valor ao banco de registradores, e o controle de desvio retorna à busca uma decisão sobre o próximo PC. Esses caminhos longos de retorno explicam por que instruções posteriores podem precisar de ajuda antes que uma instrução anterior termine.

Principais conclusões

  • Registradores de pipeline preservam os dados e os controles pendentes de cada instrução.
  • rd segue até WB junto com o resultado que deve ser escrito nele.
  • EX precisa dos bits de função ou de um código de controle da ULA já decodificado.
  • Todas as instruções mantêm a sequência de cinco estágios, mesmo quando um estágio não realiza trabalho.
  • A escrita na primeira metade e a leitura na segunda permitem que WB forneça um valor a ID no mesmo ciclo.
  • Memórias separadas permitem a busca simultânea de instruções e o acesso a dados.

3.3 Ler diagramas de pipeline e contar ciclos

Um diagrama de pipeline mostra explicitamente a sobreposição. As linhas mostram as instruções em ordem de programa, e as colunas mostram os ciclos de clock. Cada célula indica o estágio ocupado pela instrução naquele ciclo.

Construa uma escada

Para cinco instruções independentes, registre IF para I1 no ciclo 1, depois ID, EX, MEM e WB nos ciclos 2–5. Inicie I2 um ciclo depois e repita. Os nomes dos estágios formam uma escada diagonal.

Instrução123456789
I1IFIDEXMEMWB
I2IFIDEXMEMWB
I3IFIDEXMEMWB
I4IFIDEXMEMWB
I5IFIDEXMEMWB

No ciclo 5, I1 está em WB, I2 em MEM, I3 em EX, I4 em ID e I5 em IF. Ler uma coluna de cima a baixo fornece um retrato de um único ciclo. Acompanhar uma linha fornece o histórico de uma instrução.

Numere os estágios de IF = 1 a WB = 5. Sem paradas, a instrução i chega ao estágio s no ciclo i + s − 1. Portanto, I3 chega a MEM no ciclo 6. A última célula WB indica o ciclo de conclusão: cinco instruções terminam no ciclo 9.

Insira valores em um retrato

Considere I1 como ld x5, 16(x6), com x6 = 1000 e a memória em 1016 contendo 42. Considere I2 uma adição independente, I3 uma subtração independente e I4 uma operação OR independente. No ciclo 4, a carga lê a memória em 1016, I2 usa a ULA, I3 lê registradores e I4 é buscada. No ciclo 5, a carga escreve 42 em x5. Uma coluna contém trabalho de várias instruções, não vários estágios da carga.

Mostre uma parada sem interromper o trabalho anterior

Agora use ld x10, 0(x20) seguida por add x11, x10, x12 e depois por uma instrução independente. Com encaminhamento, a consumidora imediata ainda precisa de uma parada:

  • A carga ocupa IF 1, ID 2, EX 3, MEM 4, WB 5.
  • A add ocupa IF 2, ID 3, novamente ID 4, EX 5, MEM 6, WB 7.
  • A terceira instrução ocupa IF 3, novamente IF 4, ID 5, EX 6, MEM 7, WB 8.

A add espera em ID enquanto uma bolha passa por EX. A carga continua normalmente; congelá-la adiaria justamente o valor de que a add precisa. Toda instrução posterior é atrasada junto com a add.

Conte a sequência uma única vez

Um pipeline de cinco estágios precisa de n + 4 ciclos sem paradas. Cada parada inserida acrescenta um ciclo, resultando em n + 4 + paradas quando não há outras perdas. O exemplo de três instruções termina no ciclo 8: três instruções, quatro intervalos extras de estágio e uma parada.

Os primeiros quatro ciclos enchem o pipeline, e os últimos quatro o esvaziam. São maneiras de observar a mesma sequência de n + 4 ciclos, não duas cobranças separadas de quatro ciclos. Em uma sequência longa, a contribuição fixa é pequena; em uma sequência curta, ela pode dominar a aceleração.

Principais conclusões

  • As linhas acompanham uma instrução; as colunas mostram trabalho simultâneo.
  • Sem paradas, a instrução i ocupa o estágio s no ciclo i + s − 1.
  • Uma parada repete ID e retém a busca de instruções posteriores enquanto as anteriores avançam.
  • O total é n + 4 + paradas para a sequência de cinco estágios sem outras perdas.
4

Detectar e resolver conflitos de dados

A sobreposição de instruções pode fazer um valor ser necessário antes que a instrução que o produz o tenha escrito no banco de registradores. Identifique a produtora real de cada operando de origem e acompanhe os caminhos de encaminhamento que entregam novos resultados às instruções posteriores. As cargas revelam o limite temporal do encaminhamento: seus dados chegam tarde demais para uma consumidora imediata. Acompanhe a parada necessária e veja como mover trabalho independente pode eliminar o atraso e preservar o resultado do programa.

4.1 Identificar as dependências que podem atrasar a execução

Um conflito impede que a próxima instrução seja executada no ciclo planejado. Para identificá-lo, determine o recurso ou valor necessário, o ciclo em que ele é necessário e o ciclo em que fica disponível.

Distinga três tipos de conflito
TipoConflitoExemplo
EstruturalDemanda simultânea por um recursoIF e MEM precisam de uma única memória com uma porta
DadosUm valor necessário não está prontoUma subtração precisa do resultado da adição anterior
ControleO endereço correto seguinte ainda não foi determinadoA busca continua antes da decisão de um desvio

Memórias de instruções e de dados separadas eliminam o conflito estrutural entre IF e MEM. Escrever no banco de registradores na primeira metade de um ciclo e lê-lo na segunda também permite que WB e ID o compartilhem. Com essas disposições, não há conflito estrutural neste modelo de cinco estágios.

Identifique a produtora real

Uma dependência de leitura após escrita (RAW) existe quando uma instrução posterior lê um valor escrito por uma anterior. Em add x1, x2, x3 seguida por sub x4, x1, x5, a add produz x1 e a subtração o consome. Sem ajuda, a subtração lê x1 em ID durante o ciclo 3, antes que a add o escreva em WB durante o ciclo 5.

Uma dependência de escrita após leitura (WAR) reutiliza um registrador depois que uma instrução anterior o leu. Uma dependência de escrita após escrita (WAW) dá a duas instruções o mesmo destino. Essas dependências de nome não causam conflitos no projeto de cinco estágios com execução em ordem: as leituras ocorrem em ID e as escritas ocorrem em WB, em ordem de programa. Elas importam ao decidir se o software pode reordenar instruções.

Acompanhe uma sequência com destinos repetidos

Considere:

ld  x5, 0(x10)
add x6, x5, x7
sub x5, x8, x9
or  x9, x6, x5

As ligações RAW são carga → adição por x5, adição → OR por x6 e subtração → OR por x5. A OR precisa do novo x5 da subtração, não do valor carregado anteriormente. Procurar apenas nomes de registrador iguais pode deixar passar essa mudança de produtora.

A subtração escreve x5 após a adição ler x5, uma dependência WAR. A carga e a subtração também têm uma dependência WAW em x5. A OR escreve x9 após a subtração lê-lo, outra dependência WAR. Nenhuma delas cria um conflito de hardware WAR ou WAW nesse pipeline com execução em ordem.

Conte as esperas sem encaminhamento

Com apenas o banco de registradores que escreve antes de ler, uma consumidora imediata precisa de dois ciclos de parada. Ela deve adiar sua leitura em ID do ciclo 3 para o ciclo 5. Uma instrução independente entre a produtora e a consumidora reduz isso a uma parada. Duas instruções independentes permitem que a consumidora chegue a ID no ciclo WB da produtora, sem precisar de parada.

Uma dependência é uma propriedade do programa; se ela cria uma parada depende da temporização e dos caminhos disponíveis. Uma dependência RAW distante pode não exigir nenhuma ação. O registrador x0 nunca fornece um resultado pendente porque sua leitura sempre retorna zero e ele ignora escritas.

O software pode inserir instruções nop ou mover trabalho independente para os intervalos de espera. O hardware pode encaminhar resultados ou inserir paradas automaticamente. Ambas as abordagens devem manter cada consumidora ligada ao valor escrito por sua produtora na ordem do programa.

Principais conclusões

  • Conflitos estruturais, de dados e de controle envolvem diferentes tipos de problema.
  • RAW identifica uma produtora cujo valor é lido por uma instrução posterior.
  • Somente dependências RAW criam conflitos de dados neste projeto de cinco estágios com execução em ordem.
  • A instrução anterior mais próxima que escreve em um registrador de origem fornece o valor necessário.
  • Sem encaminhamento, uma consumidora adjacente espera dois ciclos; uma instrução intermediária reduz a espera a um.
  • WAR e WAW ainda restringem a reordenação válida pelo software.

4.2 Selecionar o valor mais recente disponível com encaminhamento

Um resultado da ULA existe antes de chegar à escrita no registrador. O encaminhamento, também chamado de bypass, envia esse resultado diretamente à entrada de uma instrução posterior, evitando a espera pelo banco de registradores.

Selecione a origem de cada operando

Dois multiplexadores alimentam os caminhos de execução. ForwardA atende a rs1 e ForwardB atende a rs2. Cada operando é verificado independentemente.

Código de seleçãoOrigem do valor
00Valor do registrador transportado em ID/EX
10Resultado da ULA transportado em EX/MEM
01Valor de escrita no registrador transportado em MEM/WB

O caminho EX/MEM alcança a instrução imediatamente seguinte. O caminho MEM/WB alcança uma instrução duas posições atrás e pode transportar um resultado da ULA ou dados carregados. ForwardB também alimenta o caminho de dados de armazenamento antes que ALUSrc escolha entre esse valor e um imediato.

Verifique permissão, destino e correspondência

Para ForwardA = 10, a instrução em EX/MEM deve ter RegWrite = 1, rd diferente de zero e rd igual a ID/EX.rs1. Substitua rs1 por rs2 no teste de ForwardB. Um armazenamento ou desvio não deve ser tratado como produtor apenas porque seus bits de instrução se parecem com um número de destino. Escritas em x0 também não devem se tornar valores encaminhados.

Para ForwardA = 01, faça em MEM/WB as verificações correspondentes de RegWrite, rd diferente de zero e correspondência de registrador. Use esse resultado mais antigo somente quando EX/MEM ainda não fornecer o operando necessário. ForwardB segue a mesma regra de prioridade independentemente.

Acompanhe um resultado em consumidoras posteriores

Comece com add x1, x2, x3, em que x2 = 10 e x3 = 5. Ela produz 15 ao final de EX no ciclo 3.

  • A próxima instrução, sub x4, x1, x5, chega a EX no ciclo 4. Com x5 = 3, ForwardA = 10 fornece 15 e a subtração resulta em 12.
  • and x6, x7, x1 chega a EX no ciclo 5. ForwardB = 01 obtém x1 de MEM/WB.
  • or x8, x1, x9 lê registradores em ID durante o ciclo 5, após a escrita da add na primeira metade. Ela não precisa de encaminhamento em EX.

Nenhuma parada é necessária para essas dependências de resultados da ULA. A consumidora recebe o valor quando usa a ULA, mesmo que sua leitura anterior em ID tenha obtido um valor antigo.

Resolva duas escritas correspondentes

Em três instruções consecutivas add x1, x1, x2, add x1, x1, x3 e add x1, x1, x4, tanto EX/MEM quanto MEM/WB correspondem ao rs1 da terceira instrução. EX/MEM contém o resultado da segunda add, o x1 mais recente. MEM/WB contém o resultado da primeira add e deve perder a prioridade.

Os mesmos caminhos permitem que add x5, x6, x7 forneça dados a sd x5, 0(x8) sem parada. O x5 encaminhado chega ao caminho de dados de escrita da memória enquanto a ULA do armazenamento usa o deslocamento imediato.

O encaminhamento não pode fornecer dados antes que existam. EX/MEM para uma carga contém o endereço dela, não o valor carregado. A consumidora imediata deve esperar até que a carga termine MEM; encaminhar o endereço faria o cálculo usar a quantidade errada sem aviso.

Principais conclusões

  • O encaminhamento entrega um resultado diretamente a uma instrução posterior antes da escrita no registrador.
  • 00 seleciona ID/EX, 10 seleciona EX/MEM e 01 seleciona MEM/WB.
  • Cada correspondência para encaminhamento exige RegWrite, rd diferente de zero e um número de origem correspondente.
  • EX/MEM tem prioridade sobre MEM/WB para o mesmo operando.
  • ForwardB pode fornecer dados de armazenamento e também um operando de registrador para a ULA.
  • Uma consumidora imediatamente após uma carga ainda precisa de uma parada porque os dados ainda não estão prontos.

4.3 Inserir uma bolha ou preencher o intervalo com trabalho útil

Uma carga produz dados ao final de MEM. A instrução imediatamente seguinte precisaria desses dados no início de EX no mesmo ciclo. Uma parada move o estágio EX da consumidora para o ciclo seguinte, quando MEM/WB pode fornecer o valor.

Detecte o valor indisponível em ID

A unidade de detecção de conflitos examina a instrução em EX e a instrução que está sendo decodificada. O teste básico é ID/EX.MemRead = 1 e uma correspondência entre ID/EX.rd e qualquer um dos campos de número de origem em IF/ID. Um teste refinado exclui rd = x0 e verifica quais campos de origem a instrução decodificada realmente lê.

Essa última verificação evita uma parada desnecessária em uma instrução do tipo I cujos bits imediatos ocupam a posição usual de rs2. Comparar as posições dos campos sem interpretá-los é seguro, mas pode atrasar uma instrução que não lê o registrador.

Retenha o trabalho posterior e avance a carga

A parada realiza três ações coordenadas:

  1. Defina como zero os controles que entram em ID/EX, inserindo uma bolha.
  2. Defina PCWrite = 0 para manter inalterado o endereço de busca.
  3. Defina IF/IDWrite = 0 para manter a instrução que espera em ID.

A carga e as instruções anteriores continuam avançando. A bolha passa pelos estágios posteriores sem escrever em registradores ou na memória. Congelar ID/EX com a carga ainda nele repetiria a carga em vez de inserir uma operação vazia.

Para ld x10, 0(x20) seguida por add x11, x10, x12, a carga está em EX e a add em ID durante o ciclo 3. No ciclo 4, a carga está em MEM, a bolha em EX e a add ainda em ID. No ciclo 5, a carga está em WB e a add chega a EX com ForwardA = 01.

Escalone instruções independentes

Considere:

ld  x10, 0(x20)
ld  x11, 8(x20)
add x12, x10, x11
sd  x12, 24(x20)
ld  x13, 16(x20)
add x14, x10, x13
sd  x14, 32(x20)

Os usos de x11 e x13 vêm imediatamente após suas cargas. Com encaminhamento, eles causam duas paradas, resultando em 7 + 4 + 2 = 13 ciclos. Mova ld x13, 16(x20) para a terceira posição, antes da primeira add. Isso separa a carga de x11 da consumidora e coloca x13 suficientemente antes da instrução que o consome. A sequência passa a levar 7 + 4 = 11 ciclos.

O movimento é válido porque a carga lê x20, que as instruções ultrapassadas não alteram. Seu destino x13 não afeta essas instruções. Seu endereço x20 + 16 é diferente de x20 + 24, endereço do armazenamento ultrapassado. Uma carga não pode passar por um armazenamento que possa escrever nos bytes que ela lê. A reordenação deve preservar as dependências RAW, WAR, WAW e de memória.

Combine paradas e encaminhamento

Para ld x5, 0(x10), add x6, x5, x7, sub x5, x8, x9 e or x9, x6, x5, somente o par imediato de carga e uso sofre uma parada. Quando OR chega a EX, ForwardA = 01 fornece o x6 da add e ForwardB = 10 fornece o x5 da subtração. O total é 4 + 4 + 1 = 9 ciclos.

Principais conclusões

  • Um par de carga e uso precisa de uma parada quando há encaminhamento.
  • Uma parada zera os controles que entram em ID/EX e congela PC e IF/ID.
  • A carga continua por MEM enquanto a consumidora espera em ID.
  • Escalonar trabalho independente pode separar cargas de suas consumidoras.
  • Uma reordenação válida preserva as dependências de registradores e de memória.
  • Após uma parada, selecione cada operando encaminhado de sua própria produtora real.
  • Nessas sequências de cinco estágios, ciclos = instruções + 4 + paradas.
5

Tratar conflitos de controle e prever desvios

Um desvio faz o endereço da próxima instrução depender de trabalho ainda em andamento no pipeline. Acompanhe o que acontece quando a busca espera, prevê o próximo endereço ou se recupera de uma previsão errada. Acompanhe preditores baseados em histórico e distinga suas previsões de direção dos destinos de desvio armazenados. Por fim, combine atrasos de carga e uso e penalidades de desvio com o período de clock para comparar tempos de execução, incluindo os compromissos de projeto introduzidos por pipelines mais profundos.

5.1 Recuperar-se de desvios e exceções

A busca precisa de um novo endereço a cada ciclo. Um desvio condicional fornece a escolha correta somente após a comparação e o cálculo do destino. Essa lacuna cria um conflito de controle.

Relacione o estágio de resolução à penalidade

Em um pipeline de cinco estágios com redirecionamento após o estágio de resolução, um resultado conhecido ao final de ID perde uma posição de busca em caso de previsão errada. A resolução ao final de EX perde duas; ao final de MEM, perde três. Instruções posteriores já entraram durante essas posições.

Uma estratégia interrompe a busca até que cada desvio seja decidido. É simples, mas desvios tomados e não tomados pagam a espera completa. A estratégia de prever que o desvio não será tomado continua em PC + 4. Uma previsão correta não precisa de recuperação. Um desvio tomado redireciona a busca e descarta as instruções posteriores do caminho sequencial.

Acompanhe um desvio tomado

Busque beq x1, x2, 16 no endereço 100 no ciclo 1 e resolva o desvio ao final de EX no ciclo 3. A predição de desvio não tomado busca os endereços 104 e 108 nos ciclos 2 e 3. Se o desvio for tomado, ambas são instruções do caminho errado. A busca começa em 116 no ciclo 4, após uma penalidade de dois ciclos.

Um descarte de instruções do pipeline impede que essas entradas posteriores alterem o estado arquitetural ou gerem exceções. A implementação pode invalidar entradas ou suprimir seus controles e efeitos de exceção. Um armazenamento do caminho errado nunca deve resultar em uma escrita efetiva na memória.

Uma bolha não é igual a uma instrução RISC-V composta apenas por zeros. A codificação composta apenas por zeros é ilegal. Se uma codificação de instrução real for inserida, a nop canônica será addi x0, x0, 0, codificada como 0x00000013. Uma entrada de pipeline descartada, por sua vez, não representa nenhuma instrução executada.

Resolva mais cedo, mas obtenha operandos mais cedo

Mover o comparador e o somador do destino do desvio para ID reduz a penalidade de redirecionamento a um ciclo. A comparação passa a precisar dos valores de origem em ID, então o encaminhamento usual apenas para EX é insuficiente. Com encaminhamento adequado para ID, um desvio imediatamente após a instrução da ULA que produz seu operando espera um ciclo. Imediatamente após uma carga produtora, ele espera dois. A resolução antecipada troca menos posições de busca perdidas por uma entrega de operandos mais exigente.

A predição estática fixa uma regra antecipadamente. Regras comuns são sempre não tomado, sempre tomado e tomado para trás/não tomado para a frente. Um desvio para trás no fim de um laço frequentemente repete o laço, o que torna essa direção uma pista útil.

RISC-V não tem posição de atraso de desvio. Se um desvio for tomado, sua sucessora sequencial não será executada apenas por ter sido buscada. Alguns projetos MIPS mais antigos faziam essa sucessora executar como uma instrução definida na posição de atraso; essa é uma regra diferente da ISA.

Preserve um limite de exceção precisa

Uma instrução ilegal ou ecall transfere o controle para uma rotina de tratamento. As instruções anteriores terminam; a instrução que causou a exceção e as posteriores não efetivam seus efeitos normais. O processador registra o PC da instrução causadora e a causa, usando registradores como sepc/scause no modo supervisor ou mepc/mcause no modo de máquina, e depois busca a partir da rotina de tratamento. Essa exceção precisa apresenta o estado como um limite entre instruções anteriores concluídas e trabalho posterior não concluído.

Principais conclusões

  • A resolução mais tardia de um desvio deixa mais instruções posteriores para descartar.
  • A predição de desvio não tomado paga uma penalidade de recuperação somente quando erra.
  • O descarte suprime alterações de estado e exceções do caminho errado.
  • Bits de instrução todos iguais a zero são ilegais; a nop canônica é 0x00000013.
  • A resolução antecipada em ID também exige operandos mais cedo e encaminhamento adequado.
  • RISC-V não tem posição arquitetural de atraso de desvio.
  • Exceções precisas preservam o trabalho anterior concluído e descartam os efeitos da instrução causadora e das posteriores.

5.2 Acompanhar predições de desvio baseadas em histórico

A predição dinâmica aprende com os resultados observados durante a execução de um programa. Uma tabela de histórico de desvios (BHT) armazena pequenas entradas de estado selecionadas por bits de um endereço de desvio. Primeiro faça a previsão, depois compare-a com o resultado real e então atualize a entrada.

Veja por que um bit erra duas vezes em um laço

Um preditor de 1 bit armazena o resultado anterior. Se o último desvio foi tomado, ele prevê tomado na próxima vez; caso contrário, prevê não tomado. Em um laço executado repetidamente cujo desvio é tomado nove vezes e depois não é tomado uma vez, a saída deixa o bit em não tomado.

Na próxima execução, o primeiro desvio tomado é previsto incorretamente. Os desvios tomados intermediários ajustam o bit para tomado, então a saída final não tomada também é prevista incorretamente. Em regime permanente, são dois erros em dez resultados, ou precisão de 80%.

Acrescente um segundo bit para persistência

Um contador de saturação de 2 bits tem estados de 0 a 3. Os estados 0 e 1 preveem não tomado; 2 e 3 preveem tomado. Um resultado tomado incrementa o contador, e um resultado não tomado o decrementa. Os valores param em 0 e 3.

EstadoNomePrevisão
0Fortemente não tomadoNão tomado
1Fracamente não tomadoNão tomado
2Fracamente tomadoTomado
3Fortemente tomadoTomado

A partir do estado 3, uma saída não tomada move o estado para 2, que ainda prevê tomado. Portanto, a próxima entrada no laço é prevista corretamente. O mesmo laço de dez resultados tem um erro por execução em regime permanente, ou precisão de 90%. São necessários dois resultados contrários consecutivos para inverter uma previsão a partir de um estado forte.

Acompanhe antes de atualizar

Comece no estado 1 e observe tomado, tomado, não tomado, tomado:

  1. O estado 1 prevê não tomado: errado. Incremente para 2.
  2. O estado 2 prevê tomado: correto. Incremente para 3.
  3. O estado 3 prevê tomado: errado. Decremente para 2.
  4. O estado 2 prevê tomado: correto. Incremente para 3.

Há dois erros e o estado final é 3. Atualizar antes de prever daria incorretamente ao preditor acesso ao resultado que ele deve prever.

Distinga direção, destino e interferência

Dois endereços de desvio podem indexar a mesma entrada da BHT. Essa colisão de entradas permite que seus resultados interfiram entre si. Uma previsão errada custa ciclos, mas a recuperação verifica o resultado real e preserva a correção.

Um buffer de destinos de desvios (BTB) fornece um endereço, não apenas um bit de direção. Consultado pelo PC durante IF, ele pode fornecer o destino previsto para um desvio tomado no próximo ciclo de busca, antes da decodificação. A predição de direção decide se esse destino será usado.

Um histórico simples tem limites. Em um padrão que alterna estritamente entre tomado e não tomado, um preditor de 1 bit continua errando depois que passa a acompanhar o padrão. Um contador de 2 bits acerta no máximo metade das vezes; começar no estado 1 antes de um resultado tomado faz com que erre todas as vezes. Preditores por correlação acrescentam o histórico recente de desvios, preditores por torneio selecionam entre preditores e uma pilha de endereços de retorno prevê destinos de retorno de procedimentos. Pipelines mais profundos tornam a recuperação mais cara porque mais trabalho posterior se acumula antes da resolução.

Principais conclusões

  • Um preditor de 1 bit repete o último resultado.
  • Um contador de 2 bits prevê tomado nos estados 2 e 3 e satura em 0 e 3.
  • A previsão usa o estado antigo; a atualização ocorre após o resultado real.
  • Dois bits evitam o erro na entrada do laço causado por uma única saída.
  • A colisão de entradas na BHT permite que desvios diferentes interfiram em uma mesma entrada de histórico.
  • Um BTB fornece um destino previsto; a predição de direção escolhe se ele será usado.

5.3 Transformar taxas de conflito em tempo de execução

A velocidade do pipeline depende tanto do período de clock quanto dos ciclos gastos em espera ou recuperação. O CPI efetivo mede a média desses ciclos extras ao longo da sequência de instruções.

Pondere cada custo pelas instruções afetadas

Para uma longa sequência de emissão única, comece com CPI ideal 1. Acrescente cada fonte distinta e não sobreposta de ciclos perdidos como a fração de instruções afetadas multiplicada pelos ciclos perdidos por ocorrência. Uma taxa condicional também precisa da fração à qual ela se refere.

Suponha que 25% das instruções sejam cargas e que 40% dessas cargas tenham uma consumidora imediata. Cada par desse tipo sofre uma parada, então a contribuição de carga e uso é 0,25 × 0,40 × 1 = 0,10 ciclos por instrução. Suponha que 15% sejam desvios, que 10% deles sejam previstos incorretamente e que a recuperação custe dois ciclos. A contribuição dos desvios é 0,15 × 0,10 × 2 = 0,03.

Somar os custos independentes resulta em CPI = 1 + 0,10 + 0,03 = 1,13. Atribuir uma parada a toda carga produziria 0,25 em vez de 0,10. Aplicar a taxa de erro de desvio de 10% a toda instrução também resultaria em uma contagem excessiva.

Inclua o período de clock e a contagem de instruções

Tempo de execução é igual a contagem de instruções × CPI × período de clock. Um clock de 4 GHz tem período de 0,25 ns. Para 10⁹ instruções com CPI de 1,13, a execução leva 10⁹ × 1,13 × 0,25 ns = 0,2825 s. O tempo médio por instrução é de 0,2825 ns.

Para uma sequência curta, conte explicitamente os ciclos de enchimento, esvaziamento e conflito. O CPI básico ideal de 1 descreve a vazão em regime permanente; um pipeline de cinco estágios que executa apenas algumas instruções também tem sua contribuição de quatro ciclos para enchimento e conclusão.

Compare estratégias de desvio em condições iguais

Mantenha o custo de carga e uso de 0,10, a fração de desvios de 0,15 e a penalidade de dois ciclos:

Estratégia de desvioCusto dos desviosCPI efetivo
Esperar em todo desvio0,15 × 2 = 0,301,40
Prever não tomado, 60% tomados0,15 × 0,60 × 2 = 0,181,28
Dinâmica, precisão de 90%0,15 × 0,10 × 2 = 0,031,13

Com o mesmo período de clock e a mesma contagem de instruções, a predição dinâmica é cerca de 1,24 vez mais rápida que a espera, pois 1,40/1,13 ≈ 1,24.

Entre processadores diferentes, compare CPI × período. Um projeto de ciclo único com período de 1000 ps leva 1000 ps por instrução. Um pipeline com período de 270 ps e CPI de 1,13 leva 305,1 ps por instrução, uma aceleração de cerca de 3,28. Comparar apenas o CPI favoreceria o CPI 1 do ciclo único e levaria à conclusão errada.

Entenda o próximo compromisso de projeto

Mais estágios de pipeline podem reduzir o trabalho combinacional por ciclo. Eles também introduzem sobrecarga de registradores e podem aumentar as penalidades por carga e uso e por previsões erradas. A frequência de clock sozinha não determina se o projeto mais profundo é melhor.

A emissão múltipla inicia várias instruções por ciclo, permitindo CPI abaixo de 1 e instruções por ciclo (IPC) acima de 1. Grupos de emissão estática são escolhidos pelo compilador; a emissão dinâmica, ou execução superescalar, é escolhida pelo hardware e frequentemente usa especulação e execução fora de ordem. Dependências de dados e predição de desvios ainda limitam a sobreposição útil.

Principais conclusões

  • Calcule a média de cada custo de conflito sobre todas as instruções, incluindo a fração à qual uma taxa condicional se refere.
  • Some as contribuições distintas de ciclos perdidos ao CPI ideal 1 para sequências longas de emissão única.
  • Tempo de execução é contagem de instruções × CPI × período de clock.
  • Compare processadores diferentes usando CPI × período, não apenas CPI.
  • Pipelines mais profundos trocam estágios mais curtos por mais sobrecarga e maior custo de conflitos.
  • A emissão múltipla pode alcançar IPC acima de 1 e CPI abaixo de 1.

Exercícios resolvidos de Caminho de dados e pipeline

5 Lições Interativas

1

Acompanhar uma instrução da busca ao resultado salvo

14 passos
Construir os caminhos compartilhados de ciclo único e acompanhar uma operação aritmética, uma carga, um armazenamento e um desvio com valores concretos.
  1. 1
    IntroduçãoTransforme bits de instrução em valores salvos

    Uma instrução indica um trabalho, como somar valores de registradores ou carregar dados. O processador precisa de hardware que realize esse trabalho e de sinais de controle que selecionem os caminhos corretos.

    Acompanhe o caminho de dados de ciclo único dos elementos de armazenamento até suas saídas. Depois, acompanhe uma sequência curta e identifique exatamente o que muda em cada borda de clock ao final do ciclo. Cada instrução nesse subconjunto ocupa 4 bytes.

  2. 2
    ExplicaçãoComece pelo endereço de instrução armazenado

    O PC armazena o endereço da instrução atual. A memória de instruções retorna a instrução nesse endereço, e um somador separado calcula PC + 4 ao mesmo tempo.

    O PC é um elemento de estado: ele mantém seu valor durante o ciclo. O somador é combinacional: sua saída acompanha as entradas. Na borda de clock ao final do ciclo, o PC captura o próximo endereço escolhido pelo multiplexador de entrada.

  3. 3
    ExplicaçãoLeia os operandos e forme o imediato

    O banco de registradores lê rs1 e rs2 por duas portas. Sua porta de escrita altera rd somente quando RegWrite habilita a escrita na borda de clock; a leitura de x0 sempre retorna zero.

    ImmGen reconstrói um imediato e faz a extensão de sinal até 64 bits. Copiar o bit de sinal mantém negativo um deslocamento negativo. Para o valor de 12 bits 1111 1111 1000, o resultado é −8, não o valor 4088 obtido por extensão com zeros.

  4. 4
    Ideia-chaveSepare um resultado calculado de um resultado armazenado

    A ULA soma, subtrai ou executa AND ou OR conforme sua entrada de controle. Seu indicador Zero informa se o resultado é zero. Multiplexadores selecionam entre entradas candidatas, e habilitações de escrita determinam quais valores selecionados passam a compor o estado armazenado.

    Uma unidade pode calcular uma saída não usada sem alterar o programa. Uma habilitação de escrita na memória é diferente: ativá-la pode salvar um valor mesmo quando essa escrita não era pretendida.

  5. 5
    DesafioQual componente guarda o valor?

    Um somador de destino de desvio calcula 740 enquanto o PC ainda contém 720. Antes da borda ativa, qual unidade mantém o endereço da instrução atual, e o próprio destino calculado altera esse endereço?

    ---reveal---

    O PC mantém 720. O somador apenas calcula um possível destino. O PC muda quando o próximo valor selecionado é capturado na borda; um valor candidato em uma entrada não selecionada não o sobrescreve.

  6. 6
    ExplicaçãoDirecione operações aritméticas e de memória

    Uma operação do tipo R lê dois valores de registradores, envia-os pela ULA e retorna o resultado a rd. Uma carga, por sua vez, precisa de um endereço formado por base mais deslocamento e depois do valor da memória nesse endereço.

    Um armazenamento calcula um endereço da mesma forma, mas rs2 fornece os dados a escrever. O caminho de dados até a memória deve permanecer disponível mesmo enquanto ALUSrc seleciona um imediato para a segunda entrada da ULA.

  7. 7
    ExplicaçãoEscolha as conexões compartilhadas

    Três seletores unem os caminhos:

    • ALUSrc escolhe rs2 ou o imediato para a ULA.
    • MemtoReg escolhe o resultado da ULA ou os dados da memória para rd.
    • PCSrc escolhe PC + 4 ou o destino do desvio.

    Uma carga define ALUSrc como 1 e MemtoReg como 1. Um armazenamento também usa o caminho de endereço com imediato, mas desabilita a escrita no registrador e habilita a escrita na memória.

  8. 8
    DicaCalcule um destino de desvio uma única vez

    Para beq, a subtração testa a igualdade enquanto um somador separado forma PC do desvio + deslocamento em bytes com sinal. Esses cálculos podem ocorrer em paralelo.

    A codificação do formato B omite o bit zero menos significativo do deslocamento. ImmGen pode reconstruir o deslocamento completo em bytes, ou um deslocamento de bits externo pode fornecer esse bit. Quando o deslocamento completo em bytes já existe, deslocá-lo novamente dobraria seu valor.

  9. 9
    DesafioSepare o endereço de armazenamento dos dados

    Para sd x11, 32(x18), x18 contém 2400 e x11 contém 55. Quais são o resultado da ULA e os dados de escrita na memória?

    ---reveal---

    A ULA calcula o endereço 2432 a partir de 2400 + 32. Os dados de escrita na memória são 55, fornecidos por x11. Enviar 55 à ULA no lugar do deslocamento calcularia um endereço sem relação com o pretendido; selecionar o imediato deve deixar intacto o caminho dos dados de armazenamento.

  10. 10
    ExemploAcompanhe uma adição na borda de clock

    No PC 400, add x5, x6, x7 lê x6 = 25 e x7 = −9. ALUSrc seleciona o segundo valor de registrador, a ULA soma e MemtoReg seleciona o resultado 16.

    Na borda, RegWrite salva 16 em x5, e o PC passa a valer 404. A memória de dados não é lida nem escrita.

  11. 11
    ExemploAcompanhe uma carga e depois um armazenamento

    No PC 404, ld x5, 16(x6) usa x6 = 1000 e lê o endereço 1016, cuja palavra dupla contém 42. A ULA fornece 1016; a memória fornece 42, que MemtoReg seleciona para x5. O PC avança para 408.

    A próxima instrução, sd x5, 24(x6), calcula o endereço 1024 e escreve o valor atualizado de x5, 42. Ela avança o PC para 412 sem escrever em nenhum registrador.

  12. 12
    ExemploDecida o endereço da próxima instrução

    No PC 412, beq x8, x9, 12 lê dois valores iguais a 7. A subtração resulta em zero e o somador de destino fornece 424. Branch AND Zero seleciona 424 como o próximo PC.

    Se x9 fosse 8, a subtração resultaria em −1 e o PC avançaria para 416. Nenhum dos casos escreve em um registrador de uso geral ou na memória de dados. A comparação controla qual endereço candidato é salvo.

  13. 13
    DesafioIdentifique a causa do valor incorreto no destino

    Uma ld x10, 8(x20) correta com x20 = 3200 lê a palavra dupla 91 em 3208. Um multiplexador de escrita defeituoso, porém, deixa x10 = 3208. O que o multiplexador selecionou e o que deveria selecionar?

    ---reveal---

    Ele selecionou o resultado da ULA, o endereço 3208. Deveria selecionar a saída da memória de dados, 91. O cálculo do endereço pode estar correto enquanto o estado final está errado porque a escrita no registrador escolheu a fonte errada.

  14. 14
    RecapitulaçãoRelacione cada escrita de estado ao caminho correspondente

    Para um acompanhamento completo de ciclo único, distinga o resultado aritmético, o endereço efetivo, os dados da memória e o próximo PC. Cargas e operações aritméticas escrevem em rd por entradas diferentes do multiplexador; armazenamentos usam um caminho de dados separado; desvios selecionam apenas o endereço da próxima instrução.

    Todos usam o mesmo limite de borda: o trabalho combinacional produz valores candidatos durante o ciclo, e as escritas de estado habilitadas capturam os valores selecionados ao final dele.

2

Determinar o controle a partir do trabalho exigido por uma instrução

11 passos
Construir uma linha de controle para carga, justificar valores indiferentes e decodificar operações aritméticas do tipo R com ALUOp e bits de função.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoFaça o caminho de dados compartilhado obedecer à instrução
  2. 2
    ExemploDetermine uma linha de carga a partir do caminho dos dados
  3. 3
    ExplicaçãoProteja o estado com habilitações de escrita definidas
  4. 4
    Ideia-chaveDeixe os dados completarem a decisão de desvio
  5. 5
    DesafioEscolha a configuração não especificada que não causa efeito
  6. 6
    ExplicaçãoUse ALUOp para selecionar uma classe de operação
  7. 7
    ExemploAcompanhe os bits de função da subtração
  8. 8
    ConexãoReutilize o somador para subtração
  9. 9
    DesafioMantenha os bits de uma carga em sua função adequada
  10. 10
    DesafioAmplie o controle sem acrescentar um caminho de endereço
  11. 11
    RecapitulaçãoRelacione permissões e decodificação
3

Observe a sobreposição de instruções independentes

15 passos
Calcular o clock de um pipeline, acompanhar valores pelos registradores de estágio e ler tempos de conclusão na sequência de cinco estágios.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoSepare uma instrução da sequência de instruções
  2. 2
    ExemploIdentifique a instrução completa mais lenta
  3. 3
    ExemploDefina o clock do pipeline pelo estágio mais lento
  4. 4
    AnalogiaCompare vazão e latência
  5. 5
    DesafioCalcule uma sequência curta
  6. 6
    ExplicaçãoTransporte a instrução, não apenas seu resultado
  7. 7
    ExemploMantenha o destino junto a uma carga
  8. 8
    ExplicaçãoTransporte os controles até que seu estágio os use
  9. 9
    DesafioPor que manter a posição MEM não usada?
  10. 10
    ExemploConstrua uma escada de estágios
  11. 11
    DicaLocalize um estágio sem desenhar todas as células
  12. 12
    ExemploInsira uma espera sem repetir o trabalho anterior
  13. 13
    DesafioDetermine a conclusão após o atraso
  14. 14
    DesafioCombine armazenamento com um retrato do ciclo
  15. 15
    RecapitulaçãoLeia o desempenho a partir da sequência
4

Acompanhar o valor mais recente em um pipeline com parada

17 passos
Identificar produtoras, selecionar fontes de encaminhamento, inserir uma bolha por carga e uso e verificar um movimento de escalonamento.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoIdentifique onde está o valor necessário
  2. 2
    ExplicaçãoSepare os conflitos por sua causa
  3. 3
    ExemploIdentifique a produtora de cada leitura
  4. 4
    DesafioA reutilização de registrador cria um conflito de hardware?
  5. 5
    ExplicaçãoEntregue um resultado da ULA antes da escrita no registrador
  6. 6
    DicaVerifique cada correspondência de encaminhamento
  7. 7
    ExemploResolva duas escritas correspondentes
  8. 8
    DesafioEncaminhe dois operandos independentemente
  9. 9
    ConexãoPreserve o caminho separado dos dados de armazenamento
  10. 10
    ExplicaçãoVeja o limite temporal do encaminhamento
  11. 11
    ExplicaçãoRetenha a consumidora e insira uma bolha
  12. 12
    ExemploAcompanhe a espera ao longo de três ciclos
  13. 13
    DicaFaça o detector verificar as origens reais
  14. 14
    ExemploMova trabalho útil para o intervalo
  15. 15
    DesafioVerifique o movimento antes de contar o ganho
  16. 16
    DesafioCombine a bolha com o encaminhamento posterior
  17. 17
    RecapitulaçãoEscolha a solução conforme o momento de produção
5

Recuperar a sequência de instruções e medir o custo

19 passos
Acompanhar um desvio tomado, comparar estados de predição e combinar taxas de conflito com o período de clock para estimar o tempo de execução.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoMantenha o trabalho útil no caminho correto
  2. 2
    ExplicaçãoConte as posições de busca posteriores
  3. 3
    ExemploAcompanhe um desvio tomado com predição de não tomado
  4. 4
    DicaDescarte trabalho sem executar uma instrução ilegal
  5. 5
    ExplicaçãoTroque a resolução antecipada pela necessidade de operandos mais cedo
  6. 6
    DesafioProteja o estado após uma previsão errada
  7. 7
    ConexãoPreserve o limite da exceção
  8. 8
    ExplicaçãoUse o histórico para prever a direção
  9. 9
    ExplicaçãoDeixe dois bits manterem a confiança
  10. 10
    ExemploAcompanhe a previsão antes da atualização
  11. 11
    DesafioTeste um par de resultados contrários
  12. 12
    ExplicaçãoSepare direção de destino
  13. 13
    Ideia-chaveReconheça interferências e limites dos padrões
  14. 14
    ExemploConverta taxas condicionais em custo por instrução
  15. 15
    ExemploInclua a duração de um ciclo
  16. 16
    ExemploCompare estratégias de predição
  17. 17
    DesafioRecupere a fração de desvios omitida
  18. 18
    DesafioAvalie um pipeline mais profundo
  19. 19
    RecapitulaçãoMeça a sobreposição útil após os custos de recuperação

Questões de Caminho de dados e pipeline

50 Questões de Prática em 5 conjuntos

Conjunto 1: Acompanhe valores e sinais de controle10 Questões de Prática

Questão 1 de 10

Qual circuito mantém o endereço da instrução entre ciclos de clock?
  1. O gerador de imediatos
  2. O somador do destino do desvio
  3. O contador de programa
  4. O multiplexador da ULA
Mostrar respostaOcultar resposta
Resposta: C
O contador de programa é um elemento de estado, então mantém o endereço da instrução entre ciclos. Um somador de destino de desvio pode calcular um possível próximo endereço, mas não armazena esse endereço. O PC captura o próximo valor selecionado na borda ativa do clock.

Questão 2 de 10

Para sd x14, 40(x9), de onde vem o valor escrito na memória?
  1. Do valor em x14
  2. Do valor em x9
  3. Do imediato 40
  4. Da saída de endereço da ULA
Mostrar respostaOcultar resposta
Resposta: A
O armazenamento escreve o valor lido de rs2, que é x14. O registrador x9 fornece a base para o cálculo do endereço, e 40 é o deslocamento em bytes. A ULA soma a base e o deslocamento para localizar o destino; esse endereço é separado do valor enviado à memória.

Questão 3 de 10

No PC 640, ld x12, -16(x8) é executada com x8 = 2080 e uma palavra dupla de valor −6 no endereço 2064. Quais são os valores de x12 e do PC após a conclusão?
  1. x12 = 2064; PC = 644
  2. x12 = −6; PC = 624
  3. x12 = 2080; PC = 644
  4. x12 = −6; PC = 644
Mostrar respostaOcultar resposta
Resposta: D
A ULA forma o endereço 2064 somando −16 a 2080. A carga escreve o valor da memória, −6, em x12 e avança o PC da instrução em 4 para 644. Escrever 2064 em x12 confundiria o endereço calculado com os dados retornados desse endereço.

Questão 4 de 10

Uma beq x16, x17, -24 no endereço 880 compara dois registradores que contêm 11. Qual endereço é buscado em seguida?
  1. 860
  2. 856
  3. 884
  4. 904
Mostrar respostaOcultar resposta
Resposta: B
Os valores dos registradores são iguais, então o desvio é tomado. Some o deslocamento em bytes com sinal ao PC do desvio: 880 − 24 resulta em 856. Começar por PC + 4 resultaria em 860, mas o deslocamento do desvio é medido a partir da própria instrução de desvio.

Questão 5 de 10

Por que MemtoReg pode ser um valor indiferente para beq?
  1. MemRead é 0, então todo valor de controle é ignorado.
  2. RegWrite é 0, então o valor selecionado é ignorado.
  3. Branch é 1, então o banco de registradores é sobrescrito.
  4. Zero é 1, então as duas entradas de escrita são idênticas.
Mostrar respostaOcultar resposta
Resposta: B
MemtoReg apenas seleciona dados de escrita do registrador, e RegWrite = 0 impede que um desvio escreva em um registrador. Portanto, a seleção não tem efeito. MemRead = 0 não torna todos os controles irrelevantes: uma habilitação de escrita incorreta ainda poderia alterar o estado armazenado.

Questão 6 de 10

Uma instrução tem o código de operação do tipo R, funct3 000 e bit 30 = 1. Quais valores de ALUOp e controle da ULA esse projeto produz?
  1. ALUOp 01; controle da ULA 0110
  2. ALUOp 10; controle da ULA 0010
  3. ALUOp 00; controle da ULA 0010
  4. ALUOp 10; controle da ULA 0110
Mostrar respostaOcultar resposta
Resposta: D
O código de operação do tipo R primeiro produz ALUOp 10. A decodificação de função usa então funct3 000 e bit 30 = 1 para selecionar subtração, código 0110. ALUOp 01 também solicita subtração, mas é a configuração da classe de desvio e não é gerada por esse código do tipo R.

Questão 7 de 10

Um imediato de 12 bits contém 1111 1111 0000. Qual valor com sinal ImmGen deve fornecer ao caminho de dados de 64 bits?
  1. −16
  2. 4080
  3. −15
  4. 240
Mostrar respostaOcultar resposta
Resposta: A
O bit de sinal mais significativo é 1, então este é um imediato negativo em complemento de dois. Seu valor sem sinal de 12 bits é 4080; subtrair 4096 resulta em −16, que a extensão de sinal preserva. A extensão com zeros preservaria incorretamente o valor sem sinal 4080.

Questão 8 de 10

Uma ld x15, 32(x18) de ciclo único tem x18 = 3000 e a memória em 3032 contém 77. Uma falha de controle muda apenas MemtoReg de 1 para 0. A próxima instrução é sd x15, 48(x18). Qual valor esse armazenamento escreve e onde?
  1. 77 no endereço 3048
  2. 3032 no endereço 3032
  3. 3032 no endereço 3048
  4. 77 no endereço 3080
Mostrar respostaOcultar resposta
Resposta: C
A carga defeituosa seleciona seu endereço calculado pela ULA, 3032, como dados de escrita, então x15 passa a valer 3032. O armazenamento seguinte calcula seu próprio endereço como 3000 + 48 = 3048 e escreve ali esse valor de x15. Armazenar 77 exigiria que a carga selecionasse corretamente os dados da memória.

Questão 9 de 10

Um desvio no PC 1200 compara registradores iguais. Seu deslocamento em bytes com sinal reconstruído é −32, mas um caminho de desvio defeituoso desloca esse valor completo mais uma vez à esquerda antes da soma. Qual é o próximo PC resultante e qual deveria ser?
  1. 1168 em vez de 1136
  2. 1136 em vez de 1168
  3. 1140 em vez de 1172
  4. 1264 em vez de 1232
Mostrar respostaOcultar resposta
Resposta: B
O deslocamento reconstruído já inclui o bit zero menos significativo implícito. O deslocamento de bits extra dobra incorretamente −32 para −64, produzindo 1136; o destino correto é 1200 − 32 = 1168. Somar a partir de PC + 4 introduziria um erro separado que o enunciado não descreve.

Questão 10 de 10

Uma pessoa projetista acrescenta uma operação bit a bit do tipo R sob o código de operação do tipo R existente. Seus caminhos de dados e escritas de estado correspondem aos de outras operações do tipo R, e a ULA já a implementa. Que mudança de decodificação é necessária?
  1. Ampliar a decodificação de função da ULA.
  2. Adicionar uma linha de controle para um código de operação.
  3. Reutilizar a linha de controle de carga.
  4. Definir MemtoReg para selecionar a memória.
Mostrar respostaOcultar resposta
Resposta: A
A nova operação compartilha a linha existente do controle principal para o tipo R, pois ainda lê registradores e escreve um resultado da ULA. Seus bits de função precisam de uma entrada de decodificação que selecione a operação existente da ULA. Uma nova linha de código de operação seria necessária para uma nova classe de instrução, que essa extensão não introduz.
Conjunto 2: Leia a sequência de cinco estágios10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Qual medida de desempenho conta as instruções concluídas por unidade de tempo?
  1. Latência de instrução
  2. Vazão
  3. Latência de ciclo de clock
  4. Profundidade do pipeline
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Por que o campo rd de uma carga deve ser transportado até MEM/WB?
  1. WB deve decodificar o imediato do próximo desvio.
  2. MEM deve reler o registrador base dessa carga.
  3. IF deve selecionar o operando de origem dessa carga.
  4. WB deve identificar o destino dessa carga.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Em um pipeline de cinco estágios sem conflitos, a instrução I6 começa IF no ciclo 6. Em qual ciclo ela chega a MEM?
  1. 9
  2. 8
  3. 10
  4. 11
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Os atrasos lógicos dos estágios são 180, 120, 210, 160 e 130 ps. A sobrecarga dos registradores de pipeline é de 15 ps. Qual período de clock é necessário?
  1. 800 ps
  2. 210 ps
  3. 225 ps
  4. 175 ps
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

A instrução em EX é uma operação do tipo R com ALUOp 10. ID/EX não transporta nem seus bits de função nem um código de operação decodificado previamente. Qual informação está faltando?
  1. A identificação da operação específica da ULA do tipo R.
  2. A informação de que sua classe de instrução é do tipo R.
  3. A quantidade de estágios de pipeline no projeto.
  4. O endereço da próxima instrução sequencial.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Um pipeline de cinco estágios executa oito instruções com três ciclos de parada inseridos e sem perdas por desvios. Ao final de qual ciclo a última instrução termina WB?
  1. 11
  2. 15
  3. 12
  4. 19
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Um pipeline de cinco estágios não tem encaminhamento e escreve no banco de registradores antes de lê-lo em cada ciclo. Execute add x13, x2, x3; or x20, x4, x5; sub x14, x13, x6. A instrução intermediária é independente. Quantas paradas e quantos ciclos no total são necessários?
  1. 2 paradas; 9 ciclos
  2. 0 paradas; 7 ciclos
  3. 1 parada; 9 ciclos
  4. 1 parada; 8 ciclos
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um processador de ciclo único leva 900 ps por instrução. Uma versão de cinco estágios tem atrasos lógicos de 180, 120, 210, 160, 130 ps e sobrecarga de registradores de 15 ps. Ambos executam seis instruções independentes. Qual é a aceleração do pipeline?
  1. 4,00 vezes
  2. 2,57 vezes
  3. 2,40 vezes
  4. 5,00 vezes
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma carga entra em IF um ciclo antes de uma instrução do tipo R. Se apenas a instrução do tipo R pulasse MEM e entrasse em WB diretamente de EX, qual conflito ocorreria?
  1. Ambas precisariam da memória de dados no mesmo ciclo.
  2. A carga chegaria a EX depois da instrução do tipo R.
  3. A instrução do tipo R leria registradores antes da decodificação.
  4. Ambas as instruções usariam WB no mesmo ciclo.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Com encaminhamento completo para EX, execute ld x21, 0(x25); add x22, x21, x3; or x24, x6, x7; sub x23, x22, x4. A OR é independente, e não há conflitos de desvio ou estruturais. Em qual ciclo a subtração final entra em EX?
  1. 6
  2. 7
  3. 8
  4. 9
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 3: Escolha operandos e escalone em torno de cargas10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Qual dependência liga sub x11, x2, x3 à instrução posterior and x12, x11, x4?
  1. WAR por x11
  2. WAW por x11
  3. RAW por x12
  4. RAW por x11
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Tanto EX/MEM quanto MEM/WB contêm resultados prontos que serão escritos no mesmo registrador de origem diferente de zero. Qual resultado a unidade de encaminhamento deve selecionar?
  1. MEM/WB
  2. EX/MEM
  3. O valor antigo de ID/EX
  4. O valor do gerador de imediatos
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma carga em EX produz x19 e a instrução em ID lê x19. Quais ações implementam a parada necessária por carga e uso?
  1. Manter PC e IF/ID; zerar os controles que entram em ID/EX.
  2. Manter ID/EX e EX/MEM; avançar PC e IF/ID.
  3. Limpar IF/ID e manter todos os registradores anteriores do pipeline.
  4. Avançar PC; duplicar os controles da carga em ID/EX.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma instrução escreveria em x0 e é seguida imediatamente por add x18, x0, x7. O resultado anterior da ULA é diferente de zero. Qual valor a add deve usar como primeiro operando?
  1. Resultado da ULA
  2. O número 18
  3. Zero de x0
  4. Valor antigo de x18
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Com encaminhamento completo, execute add x9, x1, x2; add x9, x9, x3; sub x11, x9, x4 com x1 = 6, x2 = 7, x3 = 9 e x4 = 5. Qual valor a subtração produz e qual registrador de pipeline fornece seu x9?
  1. 8; x9 de MEM/WB
  2. 17; x9 de MEM/WB
  3. 17; x9 de EX/MEM
  4. 26; x9 de EX/MEM
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma add x16, x5, x6 é seguida imediatamente por sd x16, 56(x20). O pipeline encaminha os dados de armazenamento antes da seleção de ALUSrc. Como o armazenamento obtém seus dados?
  1. ForwardB fornece o resultado da add; ALUSrc ainda seleciona 56.
  2. ALUSrc deve selecionar x16, então o endereço omite o deslocamento.
  3. O armazenamento deve esperar até a escrita de x16 no registrador.
  4. ForwardA fornece x16 como base do endereço em vez de x20.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Considere ld x6, 0(x20); add x7, x6, x8; ld x9, 16(x20); sub x10, x9, x11. Nenhuma outra instrução altera x20, x8 ou x11, e ambas as leituras são válidas. Qual ordenação elimina as duas paradas por carga e uso e preserva os resultados?
  1. add x7; ld x6; ld x9; sub x10
  2. ld x6; ld x9; add x7; sub x10
  3. ld x6; add x7; sub x10; ld x9
  4. ld x9; sub x10; ld x6; add x7
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

A sequência é ld x5, 0(x20); add x6, x5, x7; sd x6, 8(x20); ld x8, 8(x20). Por que mover a carga final para a segunda posição é inválido, mesmo que preencha o intervalo de carga e uso?
  1. Isso criaria um conflito WAR de hardware em x8.
  2. Isso faria as duas cargas escreverem no mesmo registrador.
  3. Isso alteraria o deslocamento em bytes da primeira carga.
  4. Isso leria a memória antes de o armazenamento atualizá-la.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Em add x5, x6, x7; sub x6, x8, x9, qual dependência de registrador restringe a troca de ordem das instruções?
  1. WAR por x6
  2. RAW por x6
  3. WAW por x5
  4. RAW por x8
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Com encaminhamento completo, execute ld x12, 0(x26); add x13, x12, x2; ld x14, 8(x26); sub x15, x14, x13; sd x15, 24(x26). Os dados de armazenamento são encaminhados antes de ALUSrc e não há outros conflitos. Quantos ciclos são necessários até a posição WB final?
  1. 9
  2. 10
  3. 11
  4. 12
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 4: Recupere a busca e acompanhe o histórico de desvios10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Por que uma instrução RISC-V composta apenas por zeros não funciona como nop substituta?
  1. É uma codificação de instrução ilegal.
  2. É a codificação de um desvio tomado.
  3. É a codificação de um armazenamento no endereço zero.
  4. É uma instrução legal que escreve um valor não nulo em x0.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um contador de saturação de desvio de 2 bits está no estado 0. Qual estado resulta de mais um resultado não tomado?
  1. 1
  2. 2
  3. 0
  4. 3
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Um desvio tomado no PC 960 tem deslocamento de −40 bytes. Ele é buscado no ciclo 1 e resolvido ao final de EX, com predição de não tomado. Quais endereços são descartados antes da busca do destino?
  1. 920 e 924
  2. 964 e 968
  3. 960 e 964
  4. 968 e 972
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Um contador de saturação de 2 bits começa no estado 2 e recebe os resultados não tomado, não tomado, tomado, tomado, não tomado. Quantas previsões estão erradas e qual é o estado final?
  1. 3 erradas; estado final 1
  2. 4 erradas; estado final 2
  3. 2 erradas; estado final 0
  4. 4 erradas; estado final 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

A busca prevê que um desvio será tomado, mas nenhum endereço de destino está disponível até a decodificação. Que estrutura adicional pode fornecer durante IF um destino visto anteriormente?
  1. Um bit de histórico de direção
  2. Uma unidade de detecção de conflitos
  3. Um buffer de destinos de desvios
  4. Um multiplexador de escrita no registrador
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Com encaminhamento adequado para ID, ld x18, 0(x22) é seguida imediatamente por um desvio que compara x18. O desvio é resolvido em ID. Em relação a uma execução sem espera por operando, quantos ciclos a comparação deve esperar e por quê?
  1. 1 ciclo; o encaminhamento comum para EX chega à comparação a tempo.
  2. 2 ciclos; os dados carregados devem chegar à comparação antecipada em ID.
  3. 0 ciclos; a leitura de registradores em ID dispensa o acesso à memória.
  4. 3 ciclos; uma carga deve terminar um ciclo separado após WB.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Um desvio de laço executado repetidamente tem cinco resultados tomados seguidos de uma saída não tomada por execução. Sem colisão de entradas e com treinamento em regime permanente, como se comparam as precisões dos preditores de um bit e de dois bits?
  1. Um bit: 4/6; dois bits: 5/6
  2. Um bit: 5/6; dois bits: 5/6
  3. Um bit: 4/6; dois bits: 4/6
  4. Um bit: 5/6; dois bits: 6/6
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Uma instrução ilegal é seguida por um armazenamento posterior enquanto duas instruções aritméticas anteriores ainda estão terminando. Qual estado uma exceção precisa deve apresentar à rotina de tratamento?
  1. Nenhum resultado anterior presente; armazenamento posterior ausente.
  2. Ambos os resultados anteriores presentes; armazenamento posterior presente.
  3. Apenas o armazenamento posterior presente; resultados anteriores ausentes.
  4. Ambos os resultados anteriores presentes; armazenamento posterior ausente.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um contador de 2 bits começa no estado 1 antes de um padrão estritamente alternado de tomado e não tomado. Qual precisão de predição ele alcança nos primeiros seis resultados?
  1. 50%
  2. 0%
  3. 67%
  4. 100%
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Dois desvios compartilham um contador de 2 bits inicialmente no estado 3. O desvio A é tomado, B não é tomado, A é tomado e B não é tomado. Quantos erros ocorrem e qual desvio os causa?
  1. 2 erros, ambos em B
  2. 1 erro, apenas em B
  3. 2 erros, um em cada desvio
  4. 3 erros, dois em B
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 5: Combine a temporização do pipeline e os custos de conflitos10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Para a mesma contagem de instruções, qual grandeza compara o tempo de execução por instrução entre processadores com clocks diferentes?
  1. CPI ÷ período de clock
  2. CPI × período de clock
  3. Frequência de clock × CPI
  4. Contagem de instruções ÷ CPI
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Em uma longa sequência de instruções, 30% são cargas e 20% delas têm uma consumidora imediata que precisa de uma parada. Qual é a contribuição de carga e uso para o CPI?
  1. 0,06
  2. 0,20
  3. 0,30
  4. 0,50
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma sequência longa tem 30% de cargas, com consumidoras imediatas após 20% das cargas, e 20% de desvios, dos quais 15% são previstos incorretamente. Cada evento de carga e uso custa um ciclo e cada erro custa três. Os custos não se sobrepõem. A 2 GHz, quanto tempo levam 400 milhões de instruções?
  1. 0,212 s
  2. 0,290 s
  3. 0,460 s
  4. 0,230 s
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Dois processadores executam o mesmo programa longo. A tem período de 300 ps, custo de carga e uso de 0,08 ciclos/instrução, fração de desvios de 0,20, 10% de erros de desvio e recuperação de dois ciclos. B tem período de 240 ps, os mesmos custo de carga e uso e fração de desvios, 20% de erros de desvio e recuperação de quatro ciclos. Os custos não se sobrepõem. Qual é mais rápido e aproximadamente quanto?
  1. A, cerca de 1,13 vez
  2. B, cerca de 1,25 vez
  3. B, cerca de 1,13 vez
  4. A, cerca de 1,11 vez
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Um projeto de ciclo único usa 800 ps por instrução. Uma versão de cinco estágios usa 200 ps por ciclo e executa uma sequência curta com duas paradas e sem perdas por desvios. Qual é a menor contagem positiva de instruções para a qual o pipeline é estritamente mais rápido?
  1. 3 instruções
  2. 2 instruções
  3. 4 instruções
  4. 6 instruções
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma sequência longa tem 25% de desvios e um custo de parada não relacionado de 0,05 ciclos/instrução. Um novo preditor aumenta a precisão de desvios de 80% para 92%, com a mesma recuperação de três ciclos e o mesmo período de clock. Qual é a aceleração da execução?
  1. 1,120 vez
  2. 1,136 vez
  3. 1,081 vez
  4. 1,250 vez
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma mudança válida de escalonamento elimina duas paradas por carga e uso de uma sequência de seis instruções em cinco estágios, sem outras perdas. Como o tempo total muda com um período de 250 ps?
  1. 2000 ps passam a 1500 ps
  2. 2500 ps passam a 2000 ps
  3. 3500 ps passam a 3000 ps
  4. 3000 ps passam a 2500 ps
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Dois projetos executam uma sequência longa com muitos desvios, sendo 30% de desvios e nenhum outro conflito. A predição de não tomado tem precisão de 60%. X resolve ao final de EX com período de 200 ps; Y resolve ao final de ID com período de 220 ps e sem paradas por operandos. Qual tem menor tempo por instrução?
  1. X com 248 ps
  2. Y com 246,4 ps
  3. X com 224 ps
  4. Y com 272,8 ps
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um processador de emissão múltipla mantém IPC 2. Qual CPI médio corresponde a essa taxa?
  1. 1
  2. 2
  3. 0,5
  4. 4
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Um processador de cinco estágios tem custo básico de carga e uso de 0,09 ciclos/instrução e 18% de desvios. Seu CPI medido no longo prazo é 1,18. Todos os demais ciclos perdidos são erros de predição de desvio com recuperação de três ciclos. Qual precisão de predição de desvios está implícita?
  1. Cerca de 95,0%
  2. Cerca de 66,7%
  3. Cerca de 50,0%
  4. Cerca de 83,3%
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

72 Termos-Chave, cada um com sua definição

A

ALUOp
ALUOp é um sinal de classe de instrução de dois bits que informa ao controle da ULA se deve somar, subtrair ou decodificar os campos de função do tipo R.
ALUOp 00 seleciona a adição de endereço mesmo que o funct3 de uma carga descreva o tamanho do acesso à memória.
ALUSrc
ALUSrc é o sinal de controle que seleciona o segundo operando da ULA, escolhendo um valor de registrador em 0 ou um imediato em 1 neste projeto.
Um armazenamento define ALUSrc como 1 enquanto seu valor de rs2 segue separadamente para a memória.

B

Banco de registradores
Um banco de registradores é a coleção de registradores arquiteturais, com portas de leitura e escrita que acessam os registradores por seus números.
As duas portas de leitura podem fornecer os valores de x6 e x7 a uma instrução aritmética.
Bolha
Uma bolha é uma posição inativa do pipeline que avança sem realizar o trabalho de alteração de estado de uma instrução.
Uma parada por carga e uso coloca uma bolha em EX enquanto a carga passa por MEM.
Borda de clock
Uma borda de clock é a transição ativa do clock na qual um elemento de estado acionado por borda captura um próximo valor cuja escrita está habilitada.
Na borda final de uma add, rd recebe a soma e o PC recebe seu próximo endereço.
Buffer de destinos de desvios
Um buffer de destinos de desvios armazena endereços de destino e fornece um destino previsto durante a busca, antes de o desvio ser decodificado.
Uma previsão de direção tomada pode usar um acerto no BTB para buscar a partir do destino previsto no próximo ciclo.

C

Caminho crítico
Um caminho crítico é o caminho combinacional necessário mais longo entre limites de estado, que limita o quanto o período de clock pode ser reduzido.
Em um projeto de ciclo único, o caminho de carga define o clock mesmo quando uma add mais curta é executada.
Caminho de dados
Um caminho de dados é o hardware que armazena e transforma valores durante a busca de instruções, o acesso a registradores, os cálculos e o acesso à memória.
Uma instrução aritmética envia dois valores de registradores pelo caminho de dados e retorna um resultado da ULA.
Campo de função
Um campo de função fornece bits de instrução que distinguem operações que compartilham um código de operação, como funct3 e funct7 em instruções do tipo R.
Para add e sub com funct3 000, o bit 30 da instrução seleciona qual operação aritmética é executada.
Colisão de entradas
Uma colisão de entradas ocorre quando endereços de desvio diferentes selecionam a mesma entrada da tabela de predição e suas atualizações interferem entre si.
Um desvio geralmente tomado pode interferir na entrada compartilhada usada por um desvio geralmente não tomado.
Conflito de carga e uso
Um conflito de carga e uso ocorre quando uma instrução imediatamente após uma carga precisa do resultado dela antes que a carga termine de ler a memória de dados.
A consumidora espera um ciclo com encaminhamento para EX e depois obtém os dados de MEM/WB.
Conflito de controle
Um conflito de controle surge quando a busca precisa do endereço da próxima instrução antes que um desvio ou outra transferência de controle o tenha determinado.
A predição de não tomado continua a busca sequencial enquanto uma comparação de desvio ainda está em um estágio posterior.
Conflito de dados
Um conflito de dados ocorre quando uma instrução chega a um ponto que exige um valor antes de uma instrução anterior disponibilizá-lo.
Sem encaminhamento, uma consumidora em ID pode ler um valor antigo antes que sua produtora chegue a WB.
Conflito estrutural
Um conflito estrutural ocorre quando instruções precisam do mesmo recurso limitado de hardware durante o mesmo ciclo de clock.
Uma memória com uma única porta não pode atender simultaneamente ao acesso MEM de uma carga e à busca de outra instrução.
Contador de programa
O contador de programa é um registrador de estado que contém o endereço usado para buscar a instrução atual na memória de instruções.
Após uma instrução comum de 4 bytes no endereço 720, o contador de programa avança para 724.
Contador de saturação
Um contador de saturação muda em direção ao limite superior ou inferior sem retornar ao outro extremo, mantendo a confiança da predição.
Um resultado tomado mantém um contador de 2 bits em 3 quando ele já está fortemente tomado.
Controle da ULA
O controle da ULA é o código de quatro bits que seleciona a operação aritmética ou bit a bit específica realizada pela ULA nesta implementação.
O código 0110 seleciona subtração, enquanto o código relacionado 0010 seleciona adição.
Controle por lógica fixa
O controle por lógica fixa é uma implementação com lógica combinacional que traduz bits de instrução em seleções do caminho de dados e habilitações de escrita.
O código de operação de carga produz uma linha de controle que seleciona um imediato e habilita a leitura da memória e a escrita no registrador.
CPI efetivo
O CPI efetivo é a média de ciclos por instrução, incluindo os ciclos adicionais perdidos com conflitos e recuperação de desvios.
Uma sequência longa de emissão única com 0,12 ciclos perdidos por instrução tem CPI efetivo de 1,12.

D

Decodificação em dois níveis
A decodificação em dois níveis separa o controle principal da classe de instrução do decodificador menor que seleciona a operação específica da ULA.
O controle principal fornece ALUOp 10 para add e sub; a decodificação dos bits de função então as distingue.
Dependência de escrita após escrita
Uma dependência de escrita após escrita ocorre quando duas instruções escrevem no mesmo registrador, tornando significativa a ordem dessas escritas no programa.
Trocar duas escritas em x12 pode alterar o valor observado pelas instruções seguintes.
Dependência de escrita após leitura
Uma dependência de escrita após leitura ocorre quando uma instrução posterior escreve em um registrador que uma instrução anterior deve ler primeiro.
Mover a instrução que escreve para antes da que lê pode alterar o programa, mesmo que o pipeline execute em ordem.
Dependência de leitura após escrita
Uma dependência de leitura após escrita liga uma leitura posterior de registrador a uma escrita anterior que produz o valor exigido por essa leitura.
Em uma add seguida por uma subtração que lê seu resultado, a subtração depende da add.
Dependência de memória
Uma dependência de memória liga acessos cuja ordem importa porque eles podem acessar bytes sobrepostos e pelo menos um dos acessos escreve nesses bytes.
Uma carga não pode ser movida para antes de um armazenamento que possa fornecer os bytes que ela deve ler.
Descarte de instruções do pipeline
O descarte de instruções do pipeline invalida trabalho no pipeline para que instruções do caminho errado ou descartadas por outro motivo não possam alterar o estado arquitetural nem gerar exceções.
Um armazenamento descartado não pode realizar sua escrita na memória após um desvio tomado redirecionar a busca.
Destino do desvio
Um destino do desvio é o endereço de instrução alcançado quando um desvio é tomado, calculado a partir do PC do desvio e do deslocamento em bytes com sinal.
Um desvio tomado no endereço 600 com deslocamento −20 transfere a busca de instruções para o endereço 580.
Diagrama de pipeline de múltiplos ciclos
Um diagrama de pipeline de múltiplos ciclos mostra instruções em linhas e ciclos em colunas, indicando o estágio de cada instrução ao longo do tempo.
Ler a coluna do ciclo 5 pode mostrar uma instrução em cada um dos cinco estágios do pipeline.

E

Elemento combinacional
Um elemento combinacional é um circuito cuja saída depende de suas entradas atuais, sem manter um valor entre ciclos de clock.
Um somador recalcula sua saída quando uma entrada muda, antes que um registrador capture a soma.
Elemento de estado
Um elemento de estado é um componente de hardware que mantém um valor entre ciclos e o atualiza por meio de uma escrita controlada.
O PC mantém o endereço da instrução atual enquanto o próximo endereço é calculado.
Emissão múltipla
A emissão múltipla inicia mais de uma instrução em um ciclo de clock, usando escolhas do compilador ou do hardware para encontrar trabalho que possa se sobrepor.
A emissão múltipla estática depende de grupos definidos pelo compilador; a emissão dinâmica permite que o hardware selecione instruções.
Encaminhamento
O encaminhamento envia um valor produzido de um registrador de pipeline diretamente à entrada de uma instrução posterior antes da escrita no estado arquitetural.
Uma subtração adjacente pode receber o novo resultado de uma add de EX/MEM sem parada.
Enchimento do pipeline
O enchimento do pipeline é o intervalo inicial durante o qual instruções sucessivas entram e nem todos os estágios ainda contêm trabalho útil.
A primeira instrução chega a WB no ciclo 5, após os estágios iniciais terem sido preenchidos.
Endereço efetivo
Um endereço efetivo é o endereço de memória calculado para uma carga ou armazenamento pela soma do valor do registrador base e do deslocamento em bytes com sinal.
Para ld x4, 24(x8) com x8 = 2000, o endereço efetivo é 2024.
Escalonamento de código
O escalonamento de código reordena instruções preservando os resultados do programa e coloca trabalho independente em intervalos que, de outra forma, teriam paradas.
Mover uma carga independente para entre outra carga e sua consumidora pode eliminar um atraso de carga e uso.
Escrita do resultado no registrador
A escrita do resultado no registrador é a transferência do resultado selecionado de uma instrução para seu registrador de destino quando a escrita está habilitada.
Uma carga escreve no registrador o valor da memória, enquanto uma add escreve seu resultado da ULA.
Esvaziamento do pipeline
O esvaziamento do pipeline é o intervalo final no qual instruções buscadas anteriormente terminam depois que a última instrução da sequência entra.
A última instrução ainda precisa de ID, EX, MEM e WB após seu ciclo de busca.
EX/MEM
EX/MEM é o registrador de pipeline que transporta o resultado da execução, os dados de armazenamento, o número de destino e os controles pendentes de memória e de escrita no registrador.
Um resultado aritmético em EX/MEM pode ser encaminhado às entradas EX da próxima instrução.
Exceção precisa
Uma exceção precisa deixa todas as instruções anteriores concluídas e exclui os efeitos normais da instrução causadora e todos os efeitos das posteriores.
A rotina de tratamento recebe o PC salvo da instrução causadora e a causa, juntamente com o estado no limite definido pela ordem do programa.
Extensão de sinal
A extensão de sinal amplia um valor binário com sinal copiando seu bit de sinal para as posições mais significativas acrescentadas, preservando seu valor.
Um deslocamento negativo de carga de 12 bits permanece negativo após ImmGen ampliá-lo até a largura do registrador RV64.

F

ForwardA
ForwardA controla o multiplexador de encaminhamento de rs1: 00 escolhe ID/EX, 10 escolhe EX/MEM e 01 escolhe MEM/WB neste projeto.
Uma atualização recente do registrador base de uma carga pode ser encaminhada para o cálculo de seu endereço.
ForwardB
ForwardB controla o multiplexador de encaminhamento de rs2, fornecendo um operando de registrador e alimentando o caminho de dados de armazenamento antes da seleção de ALUSrc.
Um armazenamento pode receber seus dados por encaminhamento mesmo enquanto ALUSrc seleciona um imediato para o cálculo do endereço.

G

Gerador de imediatos
Um gerador de imediatos reconstrói os bits imediatos de um formato de instrução e estende o valor com sinal até a largura do registrador.
Para um armazenamento, ImmGen combina bits de duas partes da instrução para recuperar o deslocamento.

I

ID/EX
ID/EX é o registrador que transporta operandos decodificados, números de registrador, imediato, informações de função e controles para a execução.
EX combina o ALUOp transportado com os bits de função transportados para selecionar uma operação do tipo R.
IF/ID
IF/ID é o registrador de pipeline entre a busca e a decodificação, que mantém a instrução buscada e seu PC associado.
Durante uma parada por carga e uso, manter IF/ID permite que a consumidora em espera seja decodificada novamente.
Indicador de zero
O indicador de zero é uma saída da ULA que vale 1 quando o resultado calculado é zero, permitindo que a subtração teste a igualdade de registradores.
Operandos iguais fazem a subtração de um desvio produzir Zero = 1, permitindo que o destino seja selecionado quando Branch está ativo.
IPC
IPC, ou instruções por ciclo, mede a média de instruções concluídas por ciclo de clock e é o inverso do CPI médio.
A emissão múltipla pode concluir trabalho independente suficiente para alcançar IPC maior que um.

L

Latência
A latência é o tempo decorrido para uma instrução passar da entrada à conclusão, incluindo todos os estágios que ela atravessa.
Cinco intervalos de estágio de 270 ps dão a uma instrução uma latência de pipeline de 1350 ps.

M

MEM/WB
MEM/WB é o registrador de pipeline que mantém dados da memória, o resultado da ULA, o número de destino e os controles necessários para escrever no registrador.
Uma consumidora de carga que sofreu parada pode obter seu operando do valor carregado mantido em MEM/WB.
MemRead
MemRead é o sinal de controle que solicita acesso de leitura à memória de dados, permitindo que uma carga recupere dados de seu endereço efetivo.
A busca na memória de instruções é separada do acesso à memória de dados controlado por MemRead.
MemtoReg
MemtoReg seleciona o valor enviado para escrita no registrador: o resultado da ULA em 0 ou a saída da memória de dados em 1 neste projeto.
Uma carga com MemtoReg definido incorretamente como 0 escreveria seu endereço em vez dos dados carregados.
MemWrite
MemWrite é o sinal de controle que habilita uma escrita na memória de dados, de modo que o valor a armazenar seja salvo no endereço efetivo na borda de clock.
Uma instrução aritmética deve manter MemWrite em 0 para impedir alterações não intencionais na memória.
Multiplexador
Um multiplexador é um circuito que encaminha uma de várias entradas de dados para uma saída conforme um sinal de seleção.
O multiplexador de escrita no registrador seleciona dados da memória para uma carga e o resultado da ULA para uma operação aritmética.

P

Palavra dupla
Uma palavra dupla é uma quantidade de dados de 64 bits, que ocupa 8 bytes e é transferida pelas instruções RV64 ld e sd.
Palavras duplas em endereços alinhados consecutivos podem começar em 2048, 2056 e 2064.
Parada do pipeline
Uma parada do pipeline atrasa por um ciclo uma parte selecionada do trabalho no pipeline para que uma instrução possa esperar por um operando ou outra condição necessária.
Durante uma parada por carga e uso, o trabalho posterior espera enquanto a carga avança para produzir o valor.
PCSrc
PCSrc seleciona o próximo PC; no projeto de ciclo único com desvio por igualdade, ele é o AND lógico de Branch com o indicador Zero da ULA.
Uma add que produz zero ainda segue o caminho sequencial porque seu sinal Branch é 0.
Penalidade de desvio
Uma penalidade de desvio é o custo em ciclos perdidos para esperar por um desvio ou recuperar-se dele, determinado pelo momento em que a busca correta pode ser retomada.
Em um pipeline de cinco estágios, a resolução ao final de EX perde duas posições de busca em uma previsão errada.
Pilha de endereços de retorno
Uma pilha de endereços de retorno acompanha endereços de retorno de procedimentos para que a busca possa prever o destino de um retorno antes que a execução normal o determine.
Chamadas aninhadas associam naturalmente os destinos de retorno à ordem inversa das chamadas.
Predição dinâmica de desvios
A predição dinâmica de desvios usa resultados de desvios observados durante a execução para atualizar o estado usado em futuras previsões de direção.
Os resultados tomados repetidos de um laço treinam o preditor antes da saída incomum não tomada.
Predição estática
A predição estática prevê a direção de um desvio usando uma regra fixa que não aprende com resultados durante a execução do programa.
A regra de tomado para trás e não tomado para a frente usa a direção do deslocamento do desvio como pista.
Preditor por correlação
Um preditor por correlação usa resultados recentes de desvios além do histórico local de um único desvio para ajudar a prever uma direção.
Uma decisão pode se tornar mais fácil de prever quando o resultado de um desvio anterior revela qual caminho foi tomado.
Preditor por torneio
Um preditor por torneio escolhe entre mecanismos de predição, usando o sucesso observado de cada um para decidir em qual confiar para um desvio.
Um preditor pode se adequar a um padrão de desvio enquanto outro apresenta desempenho melhor para um padrão diferente.
Processador superescalar
Um processador superescalar usa hardware para selecionar e emitir várias instruções em um ciclo, sujeito aos recursos disponíveis e às dependências.
Erros de predição de desvio e cadeias de valores dependentes limitam a quantidade de trabalho paralelo de instruções que permanece útil.

R

Registrador de pipeline
Um registrador de pipeline captura os dados e controles de que uma instrução precisa após um estágio, mantendo-os disponíveis durante o ciclo seguinte.
ID/EX mantém os operandos de uma instrução decodificada enquanto IF/ID recebe uma instrução posterior.
RegWrite
RegWrite é o sinal de habilitação que permite armazenar o resultado selecionado de uma instrução no banco de registradores na borda de clock.
Um armazenamento mantém RegWrite em 0, embora leia valores de registradores para seu endereço e seus dados.

S

Segmentação em pipeline
A segmentação em pipeline sobrepõe instruções ao dividir sua execução em estágios, permitindo que instruções diferentes ocupem estágios diferentes ao mesmo tempo.
Enquanto uma instrução acessa a memória de dados, uma instrução posterior pode calcular na ULA.
Sobrecarga temporal dos registradores de pipeline
A sobrecarga temporal dos registradores de pipeline é o custo de tempo para armazenar e fornecer valores de estágio, acrescentado ao atraso lógico do estágio mais lento.
Um estágio limitante de 250 ps com 20 ps de sobrecarga de registradores exige um período de 270 ps.

T

Tabela de histórico de desvios
Uma tabela de histórico de desvios armazena pequenas entradas de estado de predição selecionadas por bits do endereço de desvio, permitindo que o comportamento recente oriente a busca.
Dois endereços de desvio podem selecionar uma mesma entrada, então o estado armazenado não pertence necessariamente a um único desvio.
Tempo de execução
O tempo de execução é o tempo decorrido de um programa, calculado a partir da contagem de instruções, do CPI médio e do período de clock do processador.
A mesma contagem de instruções pode terminar mais rápido com CPI maior se o período de clock for suficientemente menor.

U

Unidade de detecção de conflitos
Uma unidade de detecção de conflitos identifica casos que precisam de parada, incluindo uma carga em EX cujo destino é lido pela instrução em ID.
Uma verificação precisa das origens usadas evita tratar bits de imediato do tipo I como um segundo registrador de origem.
Unidade de encaminhamento
Uma unidade de encaminhamento compara números de origem e destino e verifica a permissão de escrita para selecionar a fonte correta de um operando pronto.
Ela exclui rd = x0 porque um resultado calculado não pode alterar o valor zero desse registrador.

V

Valor indiferente
Um valor indiferente é um valor da tabela de controle que pode ser 0 ou 1 porque a configuração selecionada não pode afetar o comportamento da instrução.
MemtoReg pode ser um valor indiferente para beq porque nenhuma escrita em registrador ocorre.
Vazão
A vazão é o número de instruções concluídas por unidade de tempo, que aumenta quando trabalhos úteis de instruções se sobrepõem.
Um pipeline cheio e sem conflitos pode concluir uma instrução por ciclo após seu enchimento inicial.

Sobre esta aula

Por StudeliRelatar um erro

Crie seus próprios Materiais de Estudo

Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.

Começar