800 likes | 984 Views
3. Pipelining Avançado 3.1. Escalonamento Dinâmico. Pipelining Avançado?. Instruction Level Parallelism. Explorar o potencial paralelismo existente numa sequência (fluxo) de instruções (...) a = x + y; b = x - y; c = x*x + y*y; (...)
E N D
Instruction Level Parallelism • Explorar o potencial paralelismo existente numa sequência (fluxo) de instruções (...) a = x + y; b = x - y; c = x*x + y*y; (...) • Existem duas grandes abordagens para explorar ILP: • Dinâmicas Baseadas em Hardware • Estáticas Baseadas em Software (Compilador) • Limitações ao ILP... • CPIPipeline = CPIIdeal + Structural_Hazzards + Data_Stalls + Control_Stalls
Paralelismo Disponível • Bloco Básico: Uma sequência “limpa” de instruções sem saltos (excepto para a sua entrada e no seu ponto de saída) Loop: L.D F0, 0(R1) ADD.D F4, F0, F2 S.D F4, 0(R1) DADDUI R1, R1, -8 BNE R1, R2, Loop • Tamanho médio de um bloco básico em programas MIPS: • 4 a 7 instruções!!! • É necessário haver técnicas para explorar o paralelismo para além de blocos básicos!
Como ir além dos blocos básicos? • Exemplo: Loop Unrolling • Este tipo de operações pode ser feito... • Pelo compilador (e.g. gcc m.c -funroll-loops matrix.c -o m; instruções vectoriais) • Pelo processador (escalonamento dinâmico, processadores vectoriais) for (i=0; i<N; i++) x[i] = y[i] + 5; for (i=0; i<N; i+=4) { x[i] = y[i] + 5; x[i+1] = y[i+1] + 5; x[i+2] = y[i+2] + 5; x[i+3] = y[i+3] + 5; }
Primeiro tipo de limitações: Dados • (Verdadeiras) Dependências de Dados Loop: LW R1, 0(R20) ADDU R2, R1, R4 SW R2, 80(R20) ADDI R20, R20, -8 BNE R20, R6, Loop • Para o programa executar correctamente, as instruções em causa têm de ser executadas na sequência em que aparecem • Não podem executar fora de ordem ou ao mesmo tempo! • É difícil de lidar com dependências que envolvam de memória
Antidependência Dependência de Saída Dependências de Nome • Dependências de Nome: ocorrem quando sequências de instruções utilizam os mesmos registos sem que exista verdadeiro fluxo de dados entre elas • As dependências de nome são resolúveis alterando o nome dos registos (register renaming) Loop: LW R1, 0(R20) ADDU R2, R1, R4 SW R2, 80(R20) ADDI R20, R20, -8LW R1, 0(R20) ADDU R2, R1, R4 SW R2, 80(R20)
Data Hazzards • RAW: Read after Write • Uma instrução tenta ler os dados antes da instrução que os produz os escrever • Verdadeiras dependências de dados; a ordem tem de ser preservada; uso de forwarding ou introdução de stalls • WAW: Write after Write • Uma instrução tenta escrever os seus dados quando uma anterior ainda não o fez • Não pode ocorrer no pipeline simples dos MIPS • WAR: Write after Read • Uma instrução tenta escrever os seus dados num destino antes de uma instrução anterior ter oportunidade de usar os dados nesse destino • Tipicamente só ocorre se as instruções não forem executadas em ordem
Segundo tipo de limitações: Controlo • Uma instrução que tem uma dependência de controlo relativamente a um salto não pode ser movida para antes do salto • Uma instrução que não tem uma dependência de controlo relativamente a um salto não pode ser movida para depois do salto (de forma a que já não é controlada pelo mesmo) if (cond1) { S1; } if (cond2) { S2; } Dependência de controlo Dependência de controlo
Qual é a relevância de tudo isto? • Nós não queremos preservar a ordem de execução das instruções... • Nós não queremos apenas executar saltos e instruções que existam apenas no programa... • Para a execução do programa ser correcto, tudo o que tem de ser preservado é: • Os fluxos de dados existentes no programa original • O comportamento nos casos em que existam excepções Um processador de elevada performance pode: - Executar instruções fora de ordem!!! - Executar instruções especulativamente que nunca deveriam ser executadas!!!
CDC 6600, Scoreboard & Seymour Cray • CDC 6600, 1965
Escalonamento Dinâmico com um Scoreboard • Divide-se a fase ID em duas: • Issue: Descodificação da instrução e verificação de dependências estruturais • Read Operands: Espera até que não existam dependências de dados e então lê os operandos • In-order issue • Assim que as dependências estão resolvidas, a instrução é enviada para uma unidade funcional disponível • As instruções podem “ultrapassar-se” na parte de leitura de operandos • Out-of-order Execution / Completion • As instruções começam a executar assim que já não existam dependências de dados (nem estruturais!) • Out-of-order Execution => Out-of-order Completion
Novos conflitos de dados que podem surgir... • WAR (Write-After-Read) • WAW (Write-After-Write) DIV.D F0, F2, F4 ADD.D F10, F0, F8 SUB.D F8, F12, F14 DIV.D F0, F2, F4 ADD.D F10, F0, F8 SUB.D F0, F8, F14 • - O scoreboard têm de lidar com estes problemas • -- Objectivo do scoreboard: executar uma instrução quão cedo • quanto possível, desde que não hajam dependências
Mantém a informação sobre todas as instruções em execução Aspecto de um Scoreboard para o MIPS (FP!)
Operação do “Novo” Pipeline • IF – Instrucution Fetch (Vai buscar a instrução à memória) • IS – Issue • Se existe uma unidade funcional livre para a instrução E nenhuma outra instrução irá escrever no endereço destino da instrução então a instrução é enviada para a unidade funcionar e o Scoreboard actualizado (resolve WAW) • RD – Read Operands • O Scoreboard verifica quando é que os operandos da instrução ficam disponíveis (i.e. nenhuma outra instrução tem uma escrita pendente). Quando estão disponíveis, o Scoreboard informa a unidade funcional que pode prosseguir com a leitura (resolve RAW) • EX – Execution • A unidade funcional executa a operação. Quando a operação completa, a mesma informa o Scoreboard • WR – Write Result • O Scoreboard verifica se não existem conflitos WAR (i.e. instruções pendentes que ainda não leram os registos necessários – dados de outras instruções anteriores – numa altura em que estamos a tentar escrever). Quando não existem, o Scoreboard informa a unidade funcional que pode escrever o registo destino
Escritas Pendentes Unidades Funcionais Existentes Instruções Issued ou pending (Window) Registos Origem Quem produz regs. origem Fi e Fj readyAND not read Ocupada? Operação Registo Destino Componentes do Scoreboard
Vamos a um exemplo... • Os slides seguintes foram obtidos de: CS 505: Computer Architecture Spring 2005 (c) Thu D. Nguyen http://paul.rutgers.edu/courses/cs505/s05/
Scoreboard Example: Cycle 2 • Issue 2nd LD?
Scoreboard Example: Cycle 3 • Issue MULT?
Scoreboard Example: Cycle 9 Note Remaining • Read operands for MULT & SUB? Issue ADDD?
Scoreboard Example: Cycle 12 • Read operands for DIVD?
WAR Hazard! Scoreboard Example: Cycle 17 • Why not write result of ADD???
Scoreboard Example: Cycle 21 • WAR Hazard is now gone...
Review: Scoreboard Example: Cycle 62 • In-order issue; out-of-order execute & commit
Pontos chave da técnica Scoreboarding • In-order Issue, Out-of-order Execution and Completion • Se não é possível fazer o Issue, todo o pipeline pára • Tamanho do buffer entre a fase IF e ISSUE • Limitações • ILP disponível num bloco básico (verdadeiras dependências) • Tamanho da janela do Scoreboard • Tipo e número de unidades funcionais disponíveis • Presença de anti-dependências e dependências de saída
LW R1, 0(R20)ADDU R2, R1, R4SW R2, 80(R20) ADDI R20, R20, -8LW R1, 0(R20)ADDU R10, R1, R4SW R10, 80(R20) LW R1, 0(R20)ADDU R2, R1, R4SW R2, 80(R20) ADDI R20, R20, -8LW R1, 0(R20)ADDU R2, R1, R4SW R2, 80(R20) Processadores Modernos... • Utilizam uma forma avançada de Scoreboarding • Algoritmo de Tomasulo (IBM 360/91) • Ideias base: • Verifica quando os operandos das instruções estão disponíveis (semelhante ao Scoreboard Reais dependências de dados) • Register Renaming para evitar WAR e WAW
Componentes do Hardware de Tomasulo • Múltiplas Unidades Funcionais • Reservation Stations (RS) • Mantêm os operandos aguardando ser lançados • Fazem a gestão local do lançamento • Common Data BUS (CDB) • Os dados vão directamente para as reservation stations sem passar pelos registos Gestão distribuída dos dados
Algoritmo (Simplificado) • ISSUE • Obtêm a instrução da Instruction Queue e envia-a para a RS correcta (se disponível), com o valor dos operandos. Se os operandos não estão disponíveis, envia a instrução indicando as unidades funcionais que irão produzir os resultados. • Renomeia os registos de forma a evitar WAR e WAW! • EXECUTE • Se os operandos não estão disponíveis espera até que eles surgirem no CDB. Nessa altura, a instrução pode ser executada. Note-se que na mesma unidade funcional, esta execução não tem de ser em ordem. • Os conflitos RAW (verdadeiras dependências) são evitadas esperando até que os operandos estejam disponíveis. • WRITE RESULT • Quando uma instrução acaba de executar, o resultado é escrito no CDB. Isto implica que todas as RS que estejam à espera do resultado obtêm o valor. Os registos/memória também são escritos nesta altura.