Arquitecturas Alternativas Pipelining Super-escalar VLIW IA-64
Pipeline de execução A execução de uma instrução passa por várias fases: Vimos o ciclo: fetch, decode, execute fetch decode execute instrução operandos resultado Memória ou registos Se em média, cada instrução despender 1 ciclo em cada fase, em média, cada instrução demora 3 ciclos para executar Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 419
Pipelining Supondo que a arquitectura permite manter o pipeline sempre ocupado, como numa linha de montagem: Tempo (ciclos) fetch decode execute 1 I1 2 I2 I1 3 I3 I2 I1 4 I4 I3 I2 5 I5 I4 I3 6 I5 I4 7 I5 Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 420
Pipelining Mesmo que cada instrução demore 3 ciclos, o CPU é capaz de concluir uma instrução em cada ciclo! (mesma latência, mas melhor throughput) Tempo para executar uma sequência de 1000 instruções: Sem pipelining: 1000x3 = 3000 ciclos Com pipelining: 3 ciclos para a primeira instrução (pipeline vazio) + 1 ciclo por cada uma das restantes 3+999x1 = 1002 ciclos Speedup = 3000/1002 = 2,99 (aprox. 3) Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 421
Aumentando o pipeline Supondo que podemos introduzir fases intermédias sem penalizar o tempo total de cada instrução Por exemplo: a arquitectura é mais eficiente em cada fase ou permite aumentar o clock Exemplo: com um pipeline de 5 fases: fetch decode fetch operands execute instruction store result Memória/Cache ou registos Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 422
Aumentando o pipeline Tempo (ciclos) fetch decode fetch operands execute instruction store result 1 I1 2 I2 I1 3 I3 I2 I1 4 I4 I3 I2 I1 5 I5 I4 I3 I2 I1 6 I5 I4 I3 I2 7 I5 I4 I3 8 I5 I4 9 I5 10 Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 423
Pipelining Tempo para executar uma sequência de 1000 instruções: Sem pipelining: 1000x5 = 5000 ciclos Com pipelining: 5 ciclos para a primeira instrução (pipeline vazio) + 1 ciclo por cada uma das restantes 5+999x1 = 1004 ciclos Speedup = 5000/1004 = 4,98 (aprox. 5) Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 424
Aumentar o pipeline É possível? Sim se por exemplo: antes CPU 1GHz 3 ciclos = 3ns agora CPU 1,66GHz 5 ciclos 3ns O aumento do pipeline é conseguido mais facilmente nos CPU RISC Tempo para as 1000 instruções: Sem pipelining: 3000x1 = 3000 ns (speedup=1) Com pipeline de 3: 1002x1 = 1002 ns (2,99) Com pipeline de 5: 1004x0,6 = 602 ns (4,98) No limite, Speedup = número de fases do pipeline Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 425
Premissas Podemos aumentar a profundidade do pipeline (número de fases) mantendo ou penalizando pouco o tempo de execução por instrução Cada componente do pipeline está sempre ocupado (o pipeline está sempre cheiro) O que pode correr mal? Conflito no acesso a recursos Dependências entre operandos (dados) Uma instrução ser um salto (branch) Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 426
Conflito no acesso a recursos Algumas fases podem entrar em conflito no acesso a partes do CPU ou exterior O acesso a memória no fetch O acesso para obter operando e o acesso para guardar o resultado Nos RISC só os load/store acedem à memória Arquitectura Load/Store Optimizações: Bus para dados e instruções separados Caches L1 para código e dados separadas Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 427
Dependências entre operandos Pode existir dependência entre os dados de instruções diferentes Instrução I n necessita do resultado da I n-k add R1, R1, 5 add R2, R2, R1 add R3, R3, 4 add R4, R4, R3 Reordenar instruções para adiar I n Fetch Desc Oper Exec Store add R1 add R2 add R1 add R3 add R2 add R1 add R4 add R3 add R2 add R1 add R4 add R3 add R2 X add R1 add R4 add R3 add R2 X add R4 add R3 add R2 add R4 X add R3 add R4 X add R4 Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 428
Dependências entre operandos Reordenando instruções: add R1, R1, 5 add R3, R3, 4 add R2, R2, R1 add R4, R3, R3 Fetch Desc Oper Exec Store add R1 add R3 add R1 add R2 add R3 add R1 add R4 add R2 add R3 add R1 add R4 add R2 add R3 add R1 add R4 add R2 add R3 Alguns CPU possuem um componente que reordena as instruções no pipeline add R4 add R2 add R4 Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 429
Uma instrução de salto Consideremos a seguinte sequência de instruções: sa: add R1, R1, 5 add R2, R2, 10 beq R1, R2, sa sub R1, R2, 10 sub R2, R1, R2 Que instrução é que se coloca no pipeline depois do beq? Fetch Desc Oper Exec Store add R1 add R2 add R1 beq add R2 add R1? beq add R2 add R1?? beq add R2 add R1??? beq add R2??? beq?????? Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 430
Uma instrução de salto Saltos (jumps ou Branchs ) Alteram o PC, logo a próxima instrução a executar pode não ser a que está no pipeline Nos jumps condicionais nem sabemos qual vai ser a próxima instrução. Se não saltar vai executar a próxima instrução, mas se saltar, vai executar outra Optimizações: Se salto incondicional: tentar avaliar o destino durante a descodificação Se salto condicional: dispor de branch prediction Arquitectura de Computadores (2007/2008): Arquitecturas alternativas 431
Branch prediction Acrescenta-se um componente ao CPU responsável por prever o próximo valor do Program Counter Tenta executar (adivinhar) os jumps assim que entram no pipeline Exemplos de heurísticas: O jump vai ocorrer se salta para trás; não ocorre se é um salto para a frente O jump vai ocorrer se anteriormente ocorreu Arquitectura de Computadores (2007/2008): Arquitecturas alternativas 432
Execução especulativa Ao tentarmos prever o comportamento do salto podemos errar As operações que estão no pipeline só são committed quando se tem a confirmação que se a previsão foi acertada Se a previsão falhou os resultados são descartados De qualquer forma a alternativa era não fazer nada Arquitectura de Computadores (2007/2008): Arquitecturas alternativas 433
Execução especulativa Usando a heurística do salto para trás: sa: add R1, R1, 5 add R2, R2, 10 beq R1, R2, sa sub R1, R2, 10 sub R2, R1, R2 Fetch Desc Oper Exec Store add R1 add R2 add R1 beq add R2 add R1 add R1 beq add R2 add R1 add R2 add R1 beq add R2 add R1 beq add R2 add R1 beq add R2 Se a previsão foi acertada o resultado das instruções especulativas é guardado add R1 beq add R2 add R1 beq add R1 beq add R2 add R1 add R1 Beq add R2 add R1 beq Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 434
Execução especulativa Usando a heurística do salto para trás: sa: add R1, R1, 5 add R2, R2, 10 beq R1, R2, sa sub R1, R2, 10 sub R2, R1, R2 Se a previsão foi errada o resultado das instruções especulativas não é guardado e o pipeline é enchido com o ramo certo Fetch Desc Oper Exec Store add R1 add R2 add R1 beq add R2 add R1 add R1 beq add R2 add R1 add R2 add R1 beq add R2 add R1 beq add R2 add R1 beq add R2 sub R1 beq add R2 add R1 beq sub R2 sub R1 beq add R2 add R1 sub R2 sub R1 beq add R2 sub R2 sub R1 beq Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 435
Ainda mais rápido Ainda é possível mais???? Tipicamente a fase de execução é a mais demorada Os CPU possuem unidades diferentes para os vários tipos de instruções (FPU, ALU, etc. ) Estas podem trabalhar em paralelo Optimização: CPU Super-escalar Arquitectura de Computadores (2007/2008): Arquitecturas alternativas 436
Paralelizando a execução Mais de uma instrução executada em simultâneo arquitectura super-escalar Convém que a sequência de instruções no programa alterne entre os vários tipos execute Int. inst. fetch decode fetch operands execute FPU inst store result execute move Execute Units Arquitectura de Computadores (2007/2008): Arquitecturas alternativas 437
Paralelismo ao nível das instruções O desenho da arquitectura do CPU permite o paralelismo na execução de várias instruções: Pipelining Sobrepõem a execução das várias fases do pipeline, para várias instruções O relógio do pipeline pode ser superior ao relógio externo do CPU Super-escalar Várias unidades de execução executam várias instruções em simultâneo Estas optimizações levam a que o CPU seja capaz de executar mais de uma instrução por ciclo de relógio! Arquitectura de Computadores (2007/2008): Arquitecturas alternativas 438
Vários pipelines Vários pipelines com vários unidades de execução execute Int. inst. fetch fetch decode decode fetch operands fetch operands execute Int. inst. execute FPU inst execute FPU inst store result store result execute move Arquitectura de Computadores (2007/2008): Arquitecturas alternativas 439
Execução fora de ordem Para se tirar partido de arquitecturas com pipeline e superescalares é necessário reescalonar a sequência das instruções dinamicamente O CPU pode executar as instruções num ordem diferente da definida pelo utilizador Mantendo as depêndencias de dados, claro Estas optimizazões precisam de hardware especializado e complexo Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 440
A arquitectura Intel é CISC? Ao nível da execução, não As instruções mais complexas são traduzidas para um microcódigo RISC Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 441
VLIW VLIW (Very Large Instruction Word) Técnica utilizada desde do início dos anos 80 O seu propósito é delegar no compilador o escalonamento das instruções É este que deve ordenar as instruções de forma a tirar o maior partido possível da arquitectura, não o hardware Instruções que podem ser executadas em paralelo são agregadas numa única instrução VLIW Exemplo: Uma instrução VLIW de 128 que pode conter 4 instruções de 32 bits Uma instrução VLIW Inst 1 Inst 2 Inst 3 Inst 4 Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 442
VLIW: Vantagens e desvantagens Vantagens do VLIW Reduz a complexidade do hardware Simplifica o lançamento das instruções Não é preciso verificar dependências de dados e fazer escalonamento dinâmico Desvantagens Aumenta a complexidade dos compiladores Não responde a eventos dinâmicos tão eficientemente quanto a abordagem super-escalar Caso não existam instruções independentes suficientes para encher a instrução VLIW é preciso colocar NOPs Inst 1 Inst 2 Inst 3 NOP Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 443
Intel IA-64 O ISA IA-64 é implementado pela família de processadores Intel Itanium Não é compatível com o IA-32 (também conhecido por x86) e o x86-64 A compatibilidade só é possível através de um emulador implementado em hardware Tem um desenho RISC com instruções VLIW de 128 bits denominado EPIC (Explicitly Parallel Instruction Computers) Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 444
EPIC Os saltos condicionais são resolvidos através de instruções predicadas (dependem da validade de um predicado) Exemplo: cmovz R2, R3, R1 Se R1 == 0 copia o conteúdo de R3 para R2 Se R1!= 0 não faz nada Loads especulativos Especular que dados vão ser usados no futuro carregálos para perto do CPU antes de ser preciso Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 445
Predicação: vantagens e desvantagens Vantagens Elimina os saltos Reduz o código do programa Elimina a necessidade de hardware para branch prediction Desvantagens Precisa de bits na instrução para codificar o predicado Arquitectura de Computadores (2008/2009): Arquitecturas alternativas 446