ARQUITECTURA DE COMPUTADORES CAPÍTULO IV AULA II Maio 2014
Índice Processadores Revisões Pipelining Pipeline hazards Hazard estrutural Hazard de dados Hazard de controlo Pipelining datapath Pipelined control Caso Real
Overview Esquema completo de um processador. 1 MUX: 1- Decide se a próxima instrução é a seguinte ou se existe um branch que força o salto para PC + 4. 2 3 2- Decide se guarda num registo o resultado de uma operação aritmética proveniente da ALU ou um valor carregado de memória por um load. 3- Decide se o segundo input da ALU é um operando aritmético ou o offset de uma instrução de load ou store.
Overview A figura anterior mostra-nos diferentes componentes de diferentes naturezas, tais como: Elementos combinacionais elementos que para cada conjunto de entrada determinam sempre o mesmo valor de saída. Ex: ALU. Elementos de estado elementos que mantêm determinado estado guardado num elemento de memória interno. Ex: instruções, registos, memórias. Por norma os elementos de estado recebem dois parâmetros: Conteúdo a escrever. Relógio que determina o momento de escrita. Retornam o último valor escrito.
Pipelining Uma técnica de implementação na qual múltiplas instruções são executadas pelo processador em simultâneo, optimizando assim os recursos deste.
Pipelining Considerando o exemplo do processo de tratamento de roupa suja: Sem pipelining: 1. Colocar a roupa na máquina de lavar e esperar que lave; 2. Tirar a roupa da máquina de lavar e colocar na máquina de sacar. Esperar que seque. 3. Tirar a roupa da máquina de secar e passar a ferro. 4. Arrumar a roupa. 5. Colocar a próxima roupa suja na máquina de lavar
Pipelining Considerando o exemplo do processo de tratamento de roupa suja: Com pipelining: 1. Colocar a roupa na máquina de lavar e esperar que lave; 2. Tirar a roupa da máquina de lavar, colocar na máquina de sacar e carregar a segunda remessa na máquina de lavar. 3. Tirar a roupa da máquina de secar e passar a ferro. Tirar a segunda remessa da máquina de lavar e colocar na de secar. Colocar a terceira remessa na máquina de lavar. 4. Arrumar a primeira roupa e passar a segunda a ferro 5. Etc
Pipelining
Pipelining Utilizando pipelining o tempo de cada tarefa não é reduzido. No entanto, no mesmo período de tempo consegue-se executar mais do que uma tarefa em sistemas distintos. Portanto, optimizando os recursos diminui-se o tempo geral de execução, aumentando por isso o throughput. Entenda-se por throughput a capacidade em executar instruções/unidade de tempo.
Pipelining Este mesmo principio aplica-se ao modelo sequencial, anteriormente estudado, implementado na arquitectura MIPS da seguinte forma: Ler instrução (Fetch PC) Descodificar e Ler inputs Executar um cálculo ou obter um endereço Aceder a um operando em memória Escrever ouputs
Concretizando: Pipelining
Pipelining Considerando condições ideais e instruções com a mesma dimensão, podemos concluir que: Tempo entre instruções piped = Tempo entre instruções (not piped) nºde etapas Assim, considerando a figura do slide anterior e supondo que as instruções ocupariam o mesmo tempo de CPU, teríamos: Tempo entre instruções piped = 800 5 = +- 160 ps
Pipelining Pipelining em MIPS A arquitectura MIPS foi precisamente desenhada para suportar pipelining, tendo nomeadamente: Todas as instruções com a mesma dimensão (32 bits) Efectuar o fetch e a descodificação é mais simples caso se utilize sempre o mesmo tamanho. No x86 onde as instruções variam entre 1 e 15 byte, torna-se mais complexo a implementação de pipelining. Nos x86 modernos encapsulam-se as instruções em segmentos com dimensão igual, convergindo para a arquitectura MIPS. Apenas 3 formatos de codificação, com os registos fonte sempre na mesma posição Deste modo é possível ler os inputs enquanto se determina qual o tipo de operação.
Pipelining Pipelining em MIPS A arquitectura MIPS foi precisamente desenhada para suportar pipelining, tendo nomeadamente (continuação): Os operadores de memória somente surgem nos loads e stores Deste modo podemos utilizar a etapa de execução para determinar o endereço e a próxima etap para obter os dados Os operandos devem estar alinhados em memória. É possível transferir dados entre o processador e a memória numa única etapa.
Pipeline Hazards Existem situações onde a próxima etapa não pode ser executada durante o mesmo ciclo que a etapa anterior. A estas situações chama-se Pipeline Hazards (perigos de pipelining), existindo três tipos distintos, nomeadamente: Hazard estrutural Hazard de dados Hazard de controlo
Pipeline Hazards Hazard estrutural Ocorre quando não é possível executar duas instruções distintas, no mesmo ciclo de relógio. Ex: considerando o exemplo do tratamento de roupa suja, caso as máquinas de lavar e secar fossem um só aparelho não seria possível executar ambas as tarefas no mesmo ciclo. Ou seja, quando uma instrução não é executada no ciclo devido, porque o processador não tem capacidade para executar todas as instruções planeadas nesse mesmo ciclo de relógio.
Pipeline Hazards Hazard de dados Ocorre quando uma instrução que deveria correr num determinado ciclo, não pode ser executada, porque necessita de dados de instruções que ainda não terminaram. Ex: add $s0,$t1,$t2 sub $s1,$s0,$t3 No exemplo, o registo $s0 somente ficará disponível na quinta etapa (escrita dos outputs). Como tal, a instrução sub somente poderá ser executada 3 ciclos mais tarde, evitando assim Hazard de dados. De modo a evitar esse tempo de espera surgiu uma técnica no desenho do hardware chamada Forwarding ou Bypassing.
Pipeline Hazards Hazard de dados Forwarding ou Bypassing é uma técnica que permite obter os resultados de uma execução directamente da ALU, sem ter de esperar que os mesmos sejam colocados num registo.
Pipeline Hazards Hazard de dados Apesar da técnica Forwarding ou Bypassing funcionar plenamente no exemplo anterior, caso a instrução precedente seja um load, os dados só ficaram disponíveis na quarta etapa, forçando o adiamento da próxima instrução. A estes casos chama-se Hazard de dados com uso de carga. Para resolver esta questão utiliza-se o que se chama de pipelining stall ou bublles, ou seja, uma instrução fictícia que permite adiar a próxima instrução dentro do mesmo ciclo.
Pipeline Hazards Hazard de dados Pipelining stall
Pipeline Hazards Hazard de dados Exercício: Ordene as seguintes instrução de modo a evitar qualquer hazard de dados. lw $t1, 0($t0) lw $t2, 4($t0) add $t3, $t1,$t2 sw $t3, 12($t0) lw $t4, 8($t0) add $t5, $t1,$t4 sw $t5, 16($t0)
Pipeline Hazards Hazard de controlo ou de branch Ocorre com a próxima instrução carregada no Program Counter não é a instrução que deveria ser executada. Este problema surge no âmbito das instruções branches. Ao se verificar um branche a próxima instrução é alterada, alterando assim a ordem previamente prevista pelo pipelining. Uma solução não optimizada é a introdução de uma cadeia intermédia tal como no caso anterior
Pipeline Hazards Hazard de controlo ou de branch Uma solução não optimizada é a introdução de uma cadeia intermédia tal como no caso anterior. No entanto, dada a complexidade e pouco eficiência, foi necessário desenhar uma solução mais eficaz.
Pipeline Hazards Hazard de controlo ou de branch Performance via previsões Ao prever o resultado do branch, não será necessário desacelerar o pipeline, optimizando assim a execução do mesmo. No entanto, caso a previsão falhe, é necessário refazer o branch e seguir o outro caminho. Uma forma simples de implementar uma previsão em branches é assumir que os branches nunca irão ser verdadeiros.
Pipeline Hazards Hazard de controlo ou de branch Performance via previsões
Pipeline Hazards Hazard de controlo ou de branch Performance via previsões Numa versão mais realista, uns branches são assumidos como verdadeiros e outros como falsos. Ex: Branches em loops que provocam o regresso a instruções anteriores, são normalmente tomados como verdadeiros. Assim, algumas implementações, por regra, determinam que sempre que o endereço do branche é anterior ao do próprio branch, este é tomado como verdadeiro. Outras soluções mais eficazes, gerem as decisões dinamicamente com base no histórico de cada branche.
Pipelining - Resumo O Pipelining é uma técnica que explora o paralelismo entre instruções, tendo a vantagem de que ao contrário dos multiprocessadores, é completamente transparente para o programador. O Pipelining aumenta o número de instruções executadas em simultâneo e a frequência a que as mesmas são inicializadas e concluídas. Ao contrário, o pipelining não diminuí o tempo que demora a executar uma instrução individualmente (também chamado de latencia).
Pipelining Datapath De modo a entender a forma como o processador implementa o pipelining, a seguinte figura divide o datapath nas 5 etapas definidas pelo MIPS:
Pipelining Datapath Como podemos observar, o fluxo de dados é sempre feito da esquerda para a direita, exceto duas exceções: 1. Na escrita de um valor para um registo 2. Na escolha do próximo PC com base na incrementação ou no resultado de um branch. O primeiro caso pode originar um hazard de dados, enquanto que o segundo caso pode originar um hazard de controlo.
Exemplificando: Pipelining Datapath
Pipelining Datapath A versão do datapath pipelinined, estabelece quatro registos entre cada etapa. A esses registos atribui-se o nome composto pelas partes adjacentes, ex: IF/ID (Intruction Fetch /Instruction Decode), ID/EX, EX/MEM e MEM/WB.
Exemplificando um lw (lado direito a azul significa leitura, enquanto que o lado esquerdo significa escrita): 1. Pipelining Datapath
Exemplificando um lw (lado direito a azul significa leitura, enquanto que o lado esquerdo significa escrita): 2. Pipelining Datapath
Exemplificando um lw (lado direito a azul significa leitura, enquanto que o lado esquerdo significa escrita): 3. Pipelining Datapath
Exemplificando um lw (lado direito a azul significa leitura, enquanto que o lado esquerdo significa escrita): 4. Pipelining Datapath
Exemplificando um lw (lado direito a azul significa leitura, enquanto que o lado esquerdo significa escrita): 5. Pipelining Datapath
Pipelining Datapath Exemplificando um lw (lado direito a azul significa leitura, enquanto que o lado esquerdo significa escrita):
Pipelined Control Tal como aplicado para o datapath, torna-se necessário adaptar o controlador ao esquema de pipelining. Como tal, considere-se o seguinte esquema:
Pipelined Control Dividindo o esquema anterior nas mesmas 5 etapas conclui-se que: 1. Ler instrução Não são necessários elementos de controlo, uma vez que a leitura da instrução e escrita do PC é uma ação que é sempre executada. 2. Descodificar e ler inputs Tal como no caso anterior também aqui não existe a necessidade de elementos de controlo.
Pipelined Control 3. Executar - Os sinais a serem lidos são RegDst, ALUOp e ALUSrc, selecionando o registo para o resultado, a operação da ALU e se lê um segundo registo ou uma extensão (em bits) de um valor imediato.
Pipelined Control 4. Acesso à memória As linhas de controlo nesta etapa são Branch, MemRead e MemWrite, acionadas respetivamente pelas instruções branch, load e store. 5. Write-Back Contem duas linhas de controlo, nomeadamente a MemtoReg que determina se o valor escrito no registo provem da ALU ou da memória, e a RegWrite que escreve os valor escolhido.
Pipelined Control Exemplo das flags de controlador:
Pipelined Control Aplicando a linhas de controlo aos registos de pipelining:
Pipelined Control Combinando com o esquema do datapath, ficamos com o seguinte esquema:
Caso Real Considere a seguinte sequência de instruções: Como resolver este problema?
Caso Real Utilizando o registo de pipelining EX/MEM é possível passar o valor de $2 diretamente da saída da ALU para a entrada da mesma na instrução seguinte, sem passar pelos registos. Deste modo resolve-se o problema de hazard de dados utilizando o método de forwarding.
Dúvidas e Questões Maio 2014