Pipeline Visão Geral de Pipelining Instruções MIPS têm mesmo tamanho Mais fácil buscar instruções no primeiro estágio e decodificar no segundo estágio IA-32 Instruções variam de 1 byte a 17 bytes Instruções traduzidas em microoperações Pentium-4 usa pipeline de microoperações MIPS tem poucos formatos de instrução Registrador origem na mesma posição Segundo estágio pode ler banco de registradores ao mesmo tempo em que hardware está determinando que tipo de instrução foi lida Hazards Hazards: situação em que próxima instrução não pode ser executada no ciclo de clock seguinte. Três tipos: Hazards estruturais Hazards de dados Hazards de controle Hazards Hazards Estruturais Hardware não pode admitir a combinação de instruções que queremos executar no mesmo ciclo de clock Hazards de Dados Pipeline precisa ser interrompido porque os dados para executar a instrução ainda não estão disponíveis Ex.: add $s0, $t0, $t1 sub $t2, $s0, $t3 add não escreve resultado até o quinto estágio Acontecem com muita frequência Hazards Solução Não precisamos esperar instrução terminar Hardware adicionado para ter o item que falta antes do previsto: forwarding ou bypassing Tempo add $s0, $t0, $t1 IF 600 400 200 0 ID EX 800 MEM 1000 WB IF: Busca instrução, ID: decodifica/lê registrador, EX: execução, MEM: memória WB: Escreve resultado. Sombreado lado direito: Leitura, esquerdo: escrita. Sem Sombreado: não usado Hazards Tempo add $s0, $t0, $t1 sub $t2, $s0, $t3 Ordem de execução do programa (em instruções) IF 600 400 200 0 ID EX IF ID 800 MEM EX 1000 WB MEM WB Hazards Forwarding só válido se estágio destino estiver mais adiante no tempo Não pode impedir todos os stalls no pipeline Ex: load de $s0 ao invés de add Hazards Tempo lw $s0, 20($t1) IF ID Bolha sub $t2, $s0, $t3 Ordem de execução do programa (em instruções) 600 400 200 0 800 1000 EX MEM WB Bolha Bolha Bolha IF ID EX Bolha MEM WB Hazards Hazard de Controle (ou desvio): necessidade de tomar decisão baseado nos resultados de uma instrução enquanto outras então sendo executadas Ex: operação de desvio Três opções Hazards Primeira Opção: Causar stall no pipeline imediatamente após buscarmos um desvio Esperar até que o pipeline determine resultado do desvio Endereço então disponível para determinar próxima instrução Supondo hardware extra para testar registradores, calcular endereço do destino e atualizar PC no segundo estágio... Hazards Tempo 0 add $4, $5, $6 beq $1, $2, 40 200 Busca instrução 200 600 400 Reg ALU Busca instrução 200 or $7, $8, $9 Ordem de execução do programa (em instruções) Reg Bolha 400 800 1200 1000 1400 Acesso Reg à dados ALU Acesso Reg à dados Bolha Bolha Busca instrução Reg Bolha ALU Bolha Acesso Reg à dados Hazards Segunda Opção: Previsão para tratar desvios Técnica simples: prever que os desvios não serão tomados Hazards Versão mais sofisticada: alguns desvios previstos como tomados e outros como não tomados Ex.: Assumir que loop sempre volta para trás Duas versões anteriores estáticas / estereotipadas Previsores dinâmicos Escolhas dependem do comportamento de cada desvio Podem ser alteradas durante a vida de um programa Mantém histórico, usando comportamento passado para prever futuro Previsão pode ser superior a 90% Hazards Quando pipeline erra, controle terá de garantir que as instruções após o desvio errado não tenham efeito Pipeline reiniciado a partir do endereço de desvio apropriado Pipelines mais longos aumentam o problema (aumentam o custo do erro de previsão) Hazards Terceira opção: Desvio adiado Sempre executa a próxima instrução sequencial, com desvio ocorrendo após esse atraso de uma instrução Instrução não afetada pelo desvio add $4, $5, $6 beq $1, $2, 40 Útil quando desvios são curtos Hazards Harzards estruturais: Unidade de ponto flutuante Harzard de controle: Programas de inteiros Mais desvios, além de desvios menos previsíveis Harzard de dados: inteiros e ponto flutuante Inteiros Escalonamento de instruções mais complexo Acesso menos regular e maior uso de ponteiros Ponto flutuante Menor frequência de desvios Padrão de acesso mais regular Caminho de Dados Usando Pipeline Para passar algo de um estágio anterior do pipeline para um posterior, informação precisa ser colocada em um registrador Caso contrário, informação é perdida quando próxima instrução entrar nesse estágio Cada componente lógico do caminho de dados só pode ser usado dentro de um único ciclo do pipeline Caso contrário, hazard estrutural Controle de um Pipeline OrigPC ID/EX IF/ID MEM/WB EX/MEM Add Add 4 Branch Deslocamento de 2 à Esq. EscreveReg 0 M U 1 X PC Endereço de Leitura Registrador de Leitura 1 Registrador de Leitura 2 Dados de leitura 1 EscreveMem OrigALU ALU Instrução Memória de instruções Registrador para escrita Dados de leitura 2 Registradores Dados para escrita 0 Resultado da ALU M U 1 X MemParaReg Zero Endereço Dados de leitura Memória de dados Dados para Escrita 16 Instrução[15:0] Extensão 32 de sinal 6 Controle Da ALU 0 Instrução[20:16] Instrução[15:11] M 1 U X RegDst OpALU LeMem 0 M U 1 X Controle de um Pipeline WB M Instrução Controle WB EX IF/ID ID/EX M WB EX/MEM MEM/WB Hazards de dados e forwarding ID/EX MEM/WB EX/MEM M U X ALU Registradores M U X ForwardA Memória de dados ForwardB Rd Rt Rt Rs M U X EX/MEM.RegistradorRd Unidade de Forward MEM/WB.RegistradorRd M U X ID/EX MEM/WB EX/MEM Controle IF/ID M U X PC Memória de Instruções ALU Registradores M U X ForwardA Memória de dados ForwardB Rd Rt Rt Rs M U X EX/MEM.RegistradorRd Unidade de Forward MEM/WB.RegistradorRd M U X Hazards de Dados e Stalls Leitura ainda pode causar um hazard: Uma instrução tenta ler um registrador após uma instrução load que escreve no mesmo registrador Precisamos de uma unidade de detecção de hazard Opera durante estágio ID, inserindo stall entre load e seu uso Tempo (em ciclos de clock) Ordem de execução do programa (em instruções) lw $2, 20($1) and $4, $2, $5 or $8, $2, $6 add $9, $4, $2 slt $1, $6, $7 IF ID IF EX MEM WB ID EX MEM WB IF ID EX MEM WB IF ID EX MEM WB IF ID EX MEM WB Hazards de Dados e Stalls Se instrução sofre stall, precisamos evitar também que próxima instrução avance Não atualizar PC e IF/ID Instrução no estágio IF continuará a ser lida usando o mesmo PC Registradores no estágio ID continuarão a ser lidos usando os mesmos valores Inserir nops Colocar 0 em todos os sinais de controle Serão filtrados: nenhum valor modificado se todos os sinais iguais a zero Tempo (em ciclos de clock) Ordem de execução do programa (em instruções) lw $2, 20($1) and $4, $2, $5 and $4, $2, $5 or $8, $2, $6 add $9, $4, $2 IF ID IF EX MEM WB ID EX MEM WB IF ID EX MEM WB IF ID EX MEM WB IF ID EX MEM WB Hazard de Desvio Uma instrução precisa ser buscada a cada ciclo para sustentar o pipeline A decisão do desvio não ocorre até o estágio MEM Conforme visto, este atraso sobre a decisão de que instrução buscar é chamado de hazard de desvio ou controle Hazard de Desvio (in clock cycles) Tempo (em ciclos deTime clock) Program execution Ordemorder de execução do programa (em instruções) (in instructions) 40 beq $1, $3, 7 44 and $12, $2, $5 48 or $13, $6, $2 52 add $14, $2, $2 72 lw $4, 50($7) CC 1 CC 2 IM Reg IM CC 3 CC 4 CC 5 DM Reg Reg IM DM Reg IM CC 6 CC 8 CC 9 Reg DM Reg IM CC 7 Reg DM Reg Reg DM Reg Hazard de Desvio Considere que o desvio não foi tomado Podemos considerar que desvio não será tomado Caso seja tomado, precisamos descartar instruções buscadas e decodificadas Se desvio tomado na metade das vezes e descartar instruções for barato Execução continua no destino do desvio Otimização reduz pela metade custo do hazard de desvio Como descartar instruções? Alteramos valor de controles para zero Fazer flush nas instruções nos estágios IF, ID e EX do pipeline quando instrução de desvio atinge MEM Hazard de Desvio Técnica: pesquisar o endereço da instrução para ver se desvio foi tomado da última vez Caso tenha sido, busca-se instruções a partir do mesmo lugar da última vez Tabela de histórico de desvios (ou buffer de previsão de desvios) usado na implementação Pequena memória indexada pela parte menos significativa do endereço da instrução de desvio Contém um bit dizendo se desvio foi tomado recentemente ou não Exceções Outra forma de hazard Controle deve ser transferido para rotina de exceção imediatamente após instrução Entrada adicional (80000180HEX) no multiplexador que fornece novo PC Necessário flush nas instruções que vêm após instrução que causou exceção Estágio ID: fazemos OR com o sinal de stall da unidade de detecção de hazard Estágio EX: novo sinal, EX.Flush Exceções Suponha que add $1, $2, $1 cause overflow Se não pararmos execução no meio da instrução, programador não verá valor $1 que ajudou a causar exceção Sinal EX.Flush pode ser usado para impedir escrita do resultado no estágio WB Exceções Cinco instruções ativas em qualquer ciclo de clock Desafio: associar exceção à instrução correta Estágio do pipeline ajuda: instrução desconhecida (ID), chamada ao SO (EX), ... Várias exceções podem ocorrer no mesmo ciclo de clock Priorizar exceções Instrução mais antiga interrompida Flexibilidade para solicitações de E/S e defeitos de hardware Não estão associados a instrução específica Exceções Dificuldade de associar exceção correta à instrução correta levou projetistas a relaxarem esse requisito em casos não críticos Interrupções (ou exceções) imprecisas SO determina que instrução causou o problema Interrupções (ou exceções) precisas: associadas as instruções corretas Pipelining Avançado Pipelining explora paralelismo em potencial entre instruções Paralelismo em nível de instrução Dois métodos para aumentar quantidade de paralelismo Aumentar Sobrepondo mais instruções Ciclo de clock encurtado Replicar profundidade do pipelining componentes (despacho múltiplo) Iniciar várias instruções em cada estágio do pipeline Permite que CPI seja menor que 1 => IPC (instrução por ciclo) Especulação Técnica que permite que o compilador ou processador adivinhem as propriedades de uma instrução, para removê-la como uma dependência na execução de outras instruções Ex: buscamos, emitimos e executamos instruções, como se previsão de desvio estivesse sempre correta Como pode estar errada, temos de verificar se a escolha foi certa Caso tenha sido errada, temos de retroceder os efeitos Especulação Pode ser feita por compilador ou hardware Recuperação diferente Compilador Hardware Adiciona instruções para verificar precisão da especulação Rotina de reparo chamada quando especulação incorreta Resultados especulativos armazenados em buffer Se resultados corretos, resultados escritos em registradores ou na memória Especular pode introduzir exceções que antes não estavam presentes Load com endereço inválido quando especulação incorreta O Pipeline do Pentium 4 Vimos que P4 traduzia instruções IA-32 em microoperações Microoperações executadas por pipeline especulativo e escalonado dinamicamente Três microoperações por ciclo de clock Extensas filas Até 126 microoperações pendentes PF inclui unidade separada para moves de pf Loads/Stores subdivididos em duas partes: cálculo do endereço e referência real a memória ALUs de inteiros operam com o dobro da frequência de clock O Pipeline do Pentium 4 Cache de trace mantém sequência précodificada de microinstruções Unidade de PF também trata operações multimídia (MMX e SSE2) Pré-busca e decodificação de instruções Previsão de desvios Cache de trace Fila de microoperações Banco de Registradores Despacho e renomeação de registradores Fila de operações com inteiros e ponto flutuante Instrução Complexa Inteiro Inteiro PF Fila de operação de memória Load Store Unidade de commit Cache de Dados