Aula 11: Previsão Dinâmica de Branches, Superescalar, Speculation e Limites de ILP ARQUITETURA DE COMPUTADORES DEPT. DE CIÊNCIA DA COMPUTAÇÃO - UFMG Revisão do Algoritmo de Tomasulo Registradores não são gargalo Evita hazards de WAR, WAW e hazards no Scoreboard Não está limitado a blocos básicos (desde que tenhamos previsão de branches) Permite loop unrolling em HW Contribuições que existem até hoje Escalonamento dinâmico Register renaming Separação entre Loads e Stores Previsão Dinâmica de Branches Performance = ƒ(precisão, custo de previsão errada) Branch History Table é a mais simples LSBs do endereço dado pelo PC endereça tabela de valores de 1 bit Indica se branch naquela entrada da tabela foi tomado ou não Problema: em um loop, BHT de 1 bit causará duas previsões erradas: Final do loop, quando o branch não é tomado Primeira vez da iteração seguinte, quando o branch da última vez não foi tomado Previsão Dinâmica de Branches Solução: Utilização de 2-bits, onde mudança de previsão ocorre somente se previsão errada ocorre duas vezes: Precisão de BHT Precisão de BHT Precisão do BHT Previsão errada ocorre em dois casos: Previsão errada para esse branch Leu da tabela previsão para branch errado Tabela com 4096 entradas Programas variam de 1% de erro (nasa7, tomcatv) para 18% (eqntott), com spice em 9% e gcc em 12% Tabela com 4096 entradas é tão boa quanto uma com um número infinito de entradas, mas requer muito hardware Contador com 2 bits é tão bom quanto um contador com um número infinito de bits Branches Correlacionados Idéia: tomado/não tomado dos branches executados recentemente está relacionado com o comportamento do branch (tão relacionado quanto o histórico deste branch) Eqntott if (aa aa = if (bb bb = if (aa … } == 2) 0; == 2) 0; != bb) { Branches Correlacionados Precisão dos Esquemas Diferentes Tournament Predictors Mistura informação global com informação local dos branches Multi-nível Alcança melhor resultado para BHTs de tamanhos médios (8K-32K bits) e utiliza melhor um número maior de bits de correlação Tournament Predictors MIPS Precisa do Endereço ao Mesmo Tempo que Previsão Branch Target Buffer (BTB): Endereço do índice de branch busca previsão E endereço (se branch for tomado) ao mesmo tempo Nota: Precisamos checar agora se o branch é realmente aquele na tabela, porque não podemos usar o endereço errado. Portanto, precisamos checar o endereço O que acontece com endereços indiretos, por exemplo, em retorno de procedimentos com BTB? Branch Target Buffers Branch Target Buffer Conseguindo CPI<1: Disparando Múltiplas Instruções/Ciclo Duas Variações Superescalar: variando o número de instruções/ciclo (1 a 8), escalonadas pelo compilador ou por hardware (Tomasulo) IBM PowerPC, Sun SuperSparc, DEC Alpha, HP 7100 Very Long Instruction Words (VLIW) ou EPIC (explicitly parallel instruction computers) : número de instruções fixas (16) escalonadas pelo compilador Itanium (EPIC) Conseguindo CPI < 1:Disparando Múltiplas Instruções/Ciclo MIPS superescalar: 2 instruções, 1 FP & 1 inteira, load ou store – Busca de 64-bits/clock – Mais portos para registradores FP para fazer load/store FP Tipo instr. Int instr. FP instr. Int instr. FP instr. Int instr. FP Estágios IF IF ID ID IF IF EX MEM WB EX MEM WB ID EX MEM WB ID EX MEM WB IF ID EX MEM WB IF ID EX MEM WB 1 ciclo de load delay expande para 3 instruções em SS instrução à direita não pode usá-la, nem podem instrs. no próx. slot Escalonamento Estático em Superescalar 1 Loop: 2 3 4 5 6 7 8 9 10 11 12 13 14 L.D L.D L.D L.D ADD.D ADD.D ADD.D ADD.D S.D S.D S.D DADDIU BNE S.D F0,0(R1) F6,-8(R1) F10,-16(R1) F14,-24(R1) F4,F0,F2 F8,F6,F2 F12,F10,F2 F16,F14,F2 0(R1),F4 -8(R1),F8 -16(R1),F12 R1,R1,-32 R1,R2,LOOP 8(R1),F16 L.D to ADD.D: 1 Ciclo ADD.D to S.D: 2 Ciclos Escalonamento Estático em Superescalar Instr. Inteira Loop: L.D F0,0(R1) L.D F6,-8(R1) L.D F10,-16(R1) L.D F14,-24(R1) L.D F18,-32(R1) S.D 0(R1),F4 S.D -8(R1),F8 S.D -16(R1),F12 S.D -24(R1),F16 DADDIU R1,R1,-40 BNE R1,R2,LOOP S.D -32(R1),F20 Instr. FP ADD.D F4,F0,F2 ADD.D F8,F6,F2 ADD.D F12,F10,F2 ADD.D F16,F14,F2 ADD.D F20,F18,F2 Ciclos 1 2 3 4 5 6 7 8 9 10 11 12 Limites de Processadores Superescalares Enquanto quebra de unidades Inteiras/FP é simples em HW, só conseguimos CPI de 0,5 para programas com: 50% de operações Inteiras de FP Nenhum hazard Se mais instruções disparam ao mesmo tempo, é mais difícil fazer decodificação e issue Até para 2-scalar => exame de 2 opcodes, 6 registradores, & decidir se 1 ou 2 instruções podem ser disparadas Escalonamento Dinâmico em Superescalares Dependências para o disparo Código compilado para versão escalar executa inadequadamente em SS Precisamos manter compatibilidade Idéia simples: separar controle de Tomasulo para reservation stations das unidades Inteira e de FP Escalonamento Dinâmico em Superescalares Como disparar 2 instruções e manter disparo em ordem para Tomasulo? Issue executa 2X mais rápido que o resto da máquina, portanto, issue é mantido em ordem Somente loads FP podem causar dependência entre issue de unidade inteira e FP: Troca reservation station de load por fila; operandos tem que ser lidos na ordem em que são buscados Verifique endereços de Loads com endereços de Store na fila de Store para evitar violação de RAW Verifique endereços de Store na fila de Loads e Stores para evitar WAR e WAW Performance de Escalonamento Dinâmico em SS Iteração no. 1 1 1 1 1 2 2 2 2 2 Instrs. L.D F0,0(R1) ADD.D F4,F0,F2 S.D 0(R1),F4 DADDIU R1,R1,-8 BNE R1,R2,LOOP L.D F0,0(R1) ADD.D F4,F0,F2 S.D 0(R1),F4 DADDIU R1,R1,-8 BNE R1,R2,LOOP Issues 1 1 2 3 4 5 5 6 7 8 Executa ciclo 2 5 9 4 5 6 9 13 8 9 Escreve 4 8 5 8 12 9 Speculation Permite uma instrução executar sem nenhuma consequência, mesmo se branch não for tomado (“HW undo”) Geralmente combinado com escalonamento dinâmico Tomasulo: separa bypass especulativo dos resultados do bypass real dos resultados Quando instr. não for mais especulativa, escreva os resultados (instruction commit) Executa fora de ordem, mas commit em ordem Speculation Speculation Necessita de buffer em HW para resultados de instruções uncommitted: reorder buffer Reorder buffer pode ser fonte de operandos Quando instr. commit, resultado pode ser encontrado nos registradores 3 campos: tipo instr, destino, valor Use número do reorder buffer ao invés do número da reservation station Quatro Passos do Algoritmo de Tomasulo com Especulação 1. Issue—carrega instrução da fila de instruções de FP Se reservation station ou reorder buffer slot livre, issue instr & envie operandos & num. reorder buffer para destino. 2. Execução—(EX) Quando ambos operandos estiverem na reservation station, execute; 3. Escrita de Resultado—término da execução(WB) Escreva no CDB para todas as FUs & reorder buffer aguardando resultado; marque reservation station livre. 4. Commit—grave resultado com resultado de reorder Quando instr. no topo do reorder buffer & resultado estiver presente, grave resultado em registrador ou memória Limites para ILP Modelo inicial de hardware; compiladores MIPS 1. Register renaming–número infinito de registradores virtuais para evitar todos os hazards de WAW & WAR 2. Branch prediction–perfeito; sem previsões erradas 3. Jump prediction–previsões perfeitas => máquina com especulação perfeita & buffer de instruções ilimitado 4. Análise de sinônimos de memória–endereços são conhecidos e stores podem ser movidos antes de loads se os endereços não forem iguais 1 ciclo de latência para todas as instruções Limite Superior para ILP Impacto da Janela Impacto da Janela Efeito da Previsão de Branches Efeito do Número de Registradores Impacto de Alias Resumo do Cap. 3 Previsão de Branches Processadores Superescalares Speculation Limites de ILP