PIPELINE
Pipelining - analogia
Pipelining OBJECTIVO: Aumentar o desempenho pelo aumento do fluxo de instruções Program execution Time order (in instructions) lw $1, 100($0) Instruction fetch ALU Data access lw $2, 200($0) 800 ps lw $3, 300($0) Program execution Time order (in instructions) lw $1, 100($0) lw $2, 200($0) lw $3, 300($0) Instruction fetch 200 ps 200 400 600 800 1000 1200 1400 1600 1800 O aumento ideal do desempenho é igual ao numero de estados do pipeline. É possível? Instruction fetch ALU 800 ps Data access 200 400 600 800 1000 1200 1400 Instruction fetch 200 ps ALU Instruction fetch Data access ALU Data access ALU Data access 200 ps 200 ps 200 ps 200 ps 200 ps Instruction fetch 800 ps
Implementação de Pipelining É simplificado por: Todas as instruções tem o mesmo tamanho simplifica a descodificação Poucos formatos de instruções simplifica o datapath Acesso a memória apenas existem em LOADS e STORES É Limitado por Conflitos estruturais: Quando temos apenas uma memória Conflitos de dados: Dependência entre as instruções Conflitos de controlo: Tomada ou não de saltos relativos
Datapath de ciclo unico IF: Instruction fetch ID: Instruction decode/ register file read EX: Execute/ address calculation MEM: Memory access WB: Write back 4 Add Shift left 2 ADD Add result PC Address Instruction Instruction memory register 1 register 2 Write register Write data isters data 1 data 2 ALU Zero ALU result Address data Data Memory Write data 16 Sign 32 extend
Sobre a velocidade Quando se fala em velocidade estamos a falar de frequência, ou melhor tempo de propagação A velocidade é limitada pelo tempo máximo que um sinal demora a propagar-se de um elemento de estado para o próximo elemento de estado.
Pipelined Datapath IF/ID ID/EX EX/MEM MEM/WB Add 4 Shift left 2 Add Add result PC Address Instruction memory register 1 register 2 Write register Write data isters data 1 data 2 Zero ALU ALU result Address Data memory data Write data 16 Sign 32 extend
Instrução LOAD: estados IF & ID
Instrução LOAD: estado EXE
Instrução LOAD: estado MEM & WB
BUG em WB da instrução LOAD Qual a diferença da execução em pipeline do LOAD e do STORE Qual o problema que vê na execução da intrução LOAD em pipeline Será que é possível a escrita de resultados? Como resolver?
Datapath Corrigido IF/ID ID/EX EX/MEM MEM/WB Add 4 Shift left 2 Add Add result PC Address Instruction memory register 1 register 2 isters Write register Write data data 1 data 2 Zero ALU ALU result Address Data memory data Write data 16 Sign 32 extend
Representação gráfica de Pipelines Time (in clock cycles) Program execution order (in instructions) CC 1 CC 2 CC 3 CC 4 CC 5 CC 6 CC7 lw $1, 100($0) ALU lw $2, 200($0) ALU lw $3, 300($0) ALU Quantos ciclos demora a execução deste código? O que faz a ALU no ciclo 4?
Controlo do Pipeline PCSrc IF/ID ID/EX EX/MEM MEM/WB Add 4 Shift left 2 Add Add result Branch Write PC Address Instruction memory register 1 register 2 Write register Write data isters data 1 data 2 ALUSrc Zero Add ALU result MemWrite Address data Data memory Memto Instruction (15Ð0) 16 Sign 32 6 extend ALU control Write data Mem Instruction (20Ð16) ALUOp Instruction (15Ð11) Dst
Controlo do Pipeline Existem 5 estados. O que é necessário controlar em cada estado? Busca da Instrução e incremento do PC (comum a todas as instruções) Descodificação da instrução / leitura de registos (comum a todas as instruções) Execução/Cálculo de endereço (dependente da instruções) Estado de memória Escrita de resultados
Controlo do Pipeline Sinais de controlo de acordo com os dados da instrução Execution/Address Calculation stage control lines Write-back stage control lines Memory access stage control lines ALU ALU ALU Branc Mem Mem Instruction Dst Op1 Op0 Src h Write write R-format 1 1 0 0 0 0 0 1 0 lw 0 0 0 1 0 1 0 1 1 sw X 0 0 1 0 0 1 0 X beq X 0 1 0 1 0 0 0 X Mem to WB Instruction Control M WB EX M WB IF/ID ID/EX EX/MEM MEM/WB
Datapath com sinais de controlo PCSrc ID/EX WB EX/MEM Control M WB MEM/WB IF/ID EX M WB Add 4 Shift left 2 Add Add result ALUSrc Branch PC Address Instruction memory register 1 register 2 Write register Write data isters data 1 data 2 Zero ALU ALU result Address Data memory data Instruction [15 0] 16 Sign 32 6 extend ALU control Write data Mem Instruction [20 16] ALUOp Instruction [15 11] Dst
Dependências entre instruções sub $2, $1, $3 and $12, $2, $5 or $3, $6, $2 add $4, $2, $2 lw $4, 100($2) Existem vários tipos de dependências entre instruções Dados Anti-dependência Saída As dependências anti e de saída só existem em execução de instruções fora da ordem do programa
Dependências de dados sub $2, $1, $3 and $12, $2, $5 or $3, $6, $2 add $4, $2, $2 lw $4, 100($2) Quando a execução de uma instrução está dependente do resultado de uma Instrução prévia no pipeline
Anti-Dependência sub $2, $1, $3 and $12, $2, $5 or $3, $6, $2 add $4, $2, $2 lw $4, 100($2) Quando a escrita no registo do resultado da execução de uma instrução acontece antes da leitura desse registo numa instrução prévia no pipeline
Dependência de saída sub $2, $1, $3 and $12, $2, $5 or $3, $6, $2 add $4, $2, $2 lw $4, 100($2) Quando a execução de uma instrução está dependente do resultado de uma Instrução prévia no pipeline
Dependências As dependências podem dar origem aos conflitos Dependência de dados RAW Anti - Dependência WAR Dependência de saída WAW
Conflito de dados (RAW) (antes de sub, reg $2 tem o valor 10, depois tem o valor -20) Time (in clock cycles) Value of CC 1 CC 2 CC 3 CC 4 CC 5 CC 6 CC 7 CC 8 CC 9 register $2: 10 10 10 10 10/ 20 20 20 20 20 Program execution order (in instructions) sub $2, $1, $3 and $12, $2, $5 or $13, $6, $2 add $14, $2, $2 sw $15, 100($2)
Solução de software O compilador resolver esta situação pela inserção de NOPs Onde devem os NOPs serem inseridos? sub $2, $1, $3 and $12, $2, $5 or $13, $6, $2 add $14, $2, $2 sw $15, 100($2) As dependências de dados são um problema e tem de ser resolvido!
Solução de Hardware: Forwarding Forwarding aos registos de ficheiros para permitir leitura/escrita no mesmo ciclo ALU forwarding Time (in clock cycles) CC 1 CC 2 CC 3 CC 4 CC 5 CC 6 CC 7 CC 8 CC 9 Value of register $2: 10 10 10 10 10/ 20 20 20 20 20 Value of EX/MEM: X X X 20 X X X X X Value of MEM/WB: X X X X 20 X X X X Program execution order (in instructions) sub $2, $1, $3 and $12, $2, $5 or $13, $6, $2 add $14,$2, $2 sw $15, 100($2) what if this $2 was $13?
SEM FORWARDING COM FORWARDING
Forwarding Objectivo 1. Identificcar as condições de dependência, (i.e., Rd I_anterior =? Rs I_present or Rt I_presente ) 2. Se condição é verdadeira, seleccionar a entrada MUX para a ALU, outros casos selcciona a entrada MUX normal
Forward nem sempre resolve A Instrução LOAD também pode causar conflito? Quando uma instrução lê um registo a seguir a uma instrução LOAD que escreve nesse mesmo registo É preciso um detector de conflitos para inserir um bloqueio na instrução LOAD lw $2, 20($2) and $4, $2, $5 or $8, $2, $6 add $9, $4, $2
LOAD Time (in clock cycles) CC 1 CC 2 CC 3 CC 4 CC 5 CC 6 CC 7 CC 8 CC 9 Program execution order (in instructions) lw $2, 20($1) and $4, $2, $5 or $8, $2, $6 add $9, $4, $2 slt $1, $6, $7
Stalling Estados de bloqueio Podemos bloquear o pipeline(1 estado) mantendo o instrução no mesmo estado. Time (in clock cycles) CC 1 CC 2 CC 3 CC 4 CC 5 CC 6 CC 7 CC 8 CC 9 CC 10 Program execution order (in instructions) lw $2, 20($1) bubble and becomes nop add $4, $2, $5 or $8, $2, $6 add $9, $4, $2
Detecção de conflitos e Forwarding Hazard detection unit ID/EX.Mem ID/EX IF/ID Control WB EX/MEM M u M WB x 0 EX M MEM/WB WB PC Instruction memory isters M u x M u x ALU Data memory M u x IF/ID.isterRs IF/ID.isterRt IF/ID.isterRt IF/ID.isterRd ID/EX.isterRt Rt Rd Rs Rt M u x Forwarding unit
Conflitos de saltos Se a decisão do salto se tomar a seguir a EXE, quando se decide o salto já estão três instruções no pipeline! Time (in clock cycles) CC 1 CC 2 CC 3 CC 4 CC 5 CC 6 CC 7 CC 8 CC 9 Program execution order (in instructions) 40 beq $1, $3, 28 44 and $12, $2, $5 48 or $13, $6, $2 52 add $14, $2, $2 72 lw $4, 50($7)
Conflitos de saltos Predição de salto não tomado Necessário adicionar hardware para flushing do pipeline das três instruções que já estão no pipeline (isto no caso de o salto ser efectuado) - a detecção de salto se está a fazer a seguir ao EXE em simultâneo no MEM. Neste caso uma predição errada resulta neste caso numa penalidade de 3 ciclos Se mudarmos a decisão de salto para o estado ID, em quanto fica a penalidade de salto errado?
SALTOS Se o salto não for efectuado temos uma penalidade de 1 ciclo É uma penalidade aceitável (?!) para um pipeline de 5 estados Com o aumento da profundidade dos pipelines, as penalidades aumentam e a predição estática diminui dramaticamente o desempenho do pipeline Solução é a utilização de predição dinâmica: que tem a ver com características locais e globais do programa
Delayed Branch Outra técnica que permite aumentar o desempenho nos saltos. Neste caso a instrução a seguir à instrução de salto é sempre executada independente da decisão. O Compilador é que toma a decisão sobre que instrução deve colocar a seguir à instrução de salto. Que hipóteses existem?
Predição de saltos Tenta adivinhar se o salto se toma ou não? Predição estática fixa por exemplo considera sempre que o salto não se toma Predição dinâmica Técnicas sofisticadas: Técnicas que envolvem características locais e características globais do programa É uma área de desenvolvimento e de investigação Processadores modernos têm uma taxa de predição correcta superior a 95%
Predição dinâmica de 2 bits Taken Predict taken Not taken Taken Predict taken Taken Not taken Predict not taken Not taken Taken Predict not taken Not taken
Técnicas sofisticadas: Técnicas que envolvem características locais e características globais do programa É uma área de desenvolvimento e de investigação Processadores modernos têm uma taxa de predição correcta de 95%
Melhorar desempenho Evitar os estados de bloqueio i. e. pelo reordenamento das instruções: Execução de instruções fora da ordem do programa Hardware escolhe que instruções pode executar Instruções são executadas fora de ordem em que os problemas de dependência estão resolvidos Especulação (pode ser necessário efectuar nova edição e execução se a predição estiver errada) Explorar o ILP instruction-level parallelism
Melhorar Desempenho - Pipelines Avançados Aumentar a profundidade do pipeline Iniciar mais do que uma instrução de uma só vez (emissão múltipla) Loop unrolling (melhor agendadmento das instruções) Superscalar processors DEC Alpha 21264: 9 estados de pipeline, `rmissão de 6 instruções Todos os processadores modernos são de edição múltipla de instruções e superescalares (várias unidades funcionais) VLIW: very long instruction word, multioperação por instrução