Paralelismo ao nível de instruções
Dependências, múltiplas unidades funcionais, intervalos de início e emissão múltipla.
Um multiplicador pode continuar a trabalhar enquanto a ALU calcula uma subtração independente. O paralelismo ao nível de instruções, ILP, aproveita esse trabalho simultâneo. O número de unidades não chega para decidir quais as operações que podem avançar: precisamos de conhecer dependências, disponibilidade dos operandos e portos partilhados.
RAW, WAR e WAW
| Dependência | Ordem a preservar | Exemplo |
|---|---|---|
| RAW, verdadeira | Ler depois da escrita que produz o valor | add t0,t1,t2; sub t3,t0,t4 |
| WAR, antidependência | Não destruir um valor antes da leitura anterior | sub t3,t0,t4; add t0,t5,t6 |
| WAW, de saída | A última escrita do programa deve prevalecer | add t0,t1,t2; sub t0,t3,t4 |
RAR, duas leituras, não obriga a ordenar resultados. RAW transporta um valor calculado; WAR/WAW podem desaparecer por renomeação, atribuindo destinos físicos ou etiquetas diferentes às escritas.
O facto de duas instruções usarem memória exige também considerar endereços: um load pode depender de um store anterior no mesmo endereço. Se não se conhece o endereço, não se pode assumir independência.
Latência e intervalo de início
Uma multiplicação pode ter 6 fases de execução e aceitar uma nova operação em cada ciclo. Outra unidade pode demorar 6 ciclos e aceitar outra só depois de terminar. A latência é igual; o intervalo de início é diferente.
Para operações independentes, duração e intervalo de início , o tempo da primeira entrada à última saída é:
Quatro operações com terminam em 9 ciclos. Com , levam 24. Se o enunciado define latência como ciclos adicionais ao ciclo inicial, uma latência 5 corresponde a 6 ciclos ocupados, por isso converte a notação antes de desenhar.
Múltiplas unidades com emissão em ordem
Usamos IF e ID de um ciclo, uma ALU de um ciclo e um multiplicador de três fases, com intervalo de início 1. Todas as instruções passam depois por MEM e WB comuns, uma por ciclo, pela ordem do programa. Há atalhos para EX, memórias I/D separadas e não há faltas. Cada unidade retém a saída até poder passar por MEM; enquanto essa saída está retida, não aceita uma operação que a substitua. Uma instrução bloqueada em ID retém as seguintes.
Este é um modelo didático fechado para praticar traços, não a organização de referência das aulas. A apresentação usa unidades sem atalhos e outras latências: soma e subtração inteiras com latência 0 e intervalo 1, soma e subtração em vírgula flutuante com latência 3 e intervalo 1, multiplicação com latência 6 e intervalo 1, divisão com latência 24 e intervalo 25. Antes de contar num enunciado, confirma sempre as latências, os atalhos e a ordem de passagem que esse enunciado fixa.
mul t0,t1,t2
lw t3,0(a0)
add t4,t0,t3
sub t5,t6,a1
A multiplicação começa EX no ciclo 3 e termina no fim de 5. O load poderia terminar o cálculo do endereço no fim de 4, mas não pode passar por MEM antes da multiplicação mais antiga. O quadro distingue essa espera estrutural da espera do add pelos valores.
| Instrução | IF | ID | Execução | MEM | WB |
|---|---|---|---|---|---|
mul | 1 | 2 | 3–5 | 6 | 7 |
lw | 2 | 3 | Endereço em 4; espera em 5–6 | 7 | 8 |
add | 3 | 4–7 | 8 | 9 | 10 |
sub | 4–7 | 8 | 9 | 10 | 11 |
No ciclo 6, MEM serve a multiplicação; no 7, serve o load. O dado carregado só existe no fim de 7, pelo que o add pode recebê-lo em EX 8 pelo atalho MEM/WB. O produto já está disponível. A sub é independente, mas não ultrapassa o add retido em ID.
A ordem mul; sub; lw; add pode ocupar a ALU durante a multiplicação, se conservar a semântica e não houver exceções ou efeitos externos relevantes. Ainda assim, verifica o porto MEM comum e a ordem de conclusão: ocupar uma unidade livre não garante que o tempo total diminua.
Em outros modelos, o porto de escrita pode ser comum mas MEM separado, ou a conclusão pode ocorrer fora de ordem. Essas hipóteses mudam a tabela. Antes de contar, fixa quais os recursos comuns e qual a ordem imposta.
Emissão múltipla
Um processador superescalar emite mais de uma instrução por ciclo. Supõe duas vias: uma ALU e uma memória. O par add; lw pode emitir junto se for independente; duas operações de memória não cabem nesse ciclo, mesmo com endereços distintos.
| Par candidato | Pode emitir junto neste modelo? | Motivo |
|---|---|---|
add t0,t1,t2; lw t3,0(a0) | Sim | Uma ALU, uma memória e operandos independentes |
lw t0,0(a0); add t1,t0,t2 | Não | O add precisa do resultado do load |
lw t0,0(a0); sw t1,0(a1) | Não | Ambos pedem a única via de memória |
A ausência de dependências não elimina limites de classe, portos ou unidades. Um salto pode ainda limitar a janela de instruções úteis disponível para formar pares.
Para 100 instruções em 60 ciclos: IPC= e CPI=. CPI inferior a 1 é possível em emissão múltipla. O pico de duas instruções por ciclo não garante IPC 2 em um programa real.
Sequenciamento dinâmico
O hardware pode manter uma janela de instruções e selecionar as que têm operandos e recursos disponíveis. Assim, uma operação independente pode ultrapassar outra à espera de um dado. Em Tomasulo, ambas entram nas estações pela ordem do programa; a escolha da operação que começa a executar é que pode mudar essa ordem. Continua a ser necessário preservar o significado do programa.
O algoritmo de Tomasulo faz esse controlo com estações de reserva, etiquetas e difusão de resultados. Em processadores especulativos, um reorder buffer permite confirmar resultados por ordem, preservar exceções precisas e descartar o caminho errado de um salto. Executar, difundir um resultado e confirmar uma instrução são eventos diferentes.
Desenrolar ciclos aumenta instruções independentes, mas aumenta o código e pode exigir mais registos. Uma otimização tem de respeitar o custo de memória, a pressão sobre caches e a semântica dos resultados, sobretudo em vírgula flutuante.
Exercícios
Classificar nomes e valores
I1: add t0, t1, t2; I2: sub t3, t0, t4; I3: add t0, t5, t6. Identifica as dependências entre pares.
Pista
Solução
I1→I2 RAW em t0; I2→I3 WAR em t0; I1→I3 WAW em t0. Ler t0 em I2 não é uma escrita nesse registo.
Confere a tua resposta:
- Identifiquei RAW em t0 de I1 para I2.
- Identifiquei WAR em t0 de I2 para I3.
- Identifiquei WAW em t0 de I1 para I3.
Erros frequentes
Chamar WAR a duas escritas ou classificar qualquer repetição de nome como RAW.
Calcular a última conclusão
Cinco operações independentes: unidade de 6 ciclos ocupados, intervalo de início 2. Quantos ciclos da primeira entrada à última saída?
Pista
Solução
14 ciclos, ou seja, os inícios podem ser 1,3,5,7,9 e a última saída no fim de 14.
Erros frequentes
Multiplicar 5×6 como se a unidade não tivesse pipeline.
Um bloqueio em ordem
Um add bloqueia em ID à espera de mul. A instrução seguinte é independente. O que faz uma pipeline com emissão em ordem?
Pista
Independência é condição necessária para ultrapassar, mas não cria o mecanismo.
Solução
A instrução seguinte não ultrapassa ID bloqueado. Uma reordenação estática válida pode colocá-la antes; sequenciamento dinâmico pode permitir execução fora de ordem em outro modelo.
- A terceira espera pela instrução bloqueada em ID. Emissão em ordem não permite ultrapassar essa instrução.
- A terceira passa automaticamente porque é independente. Isso exige separar emissão e espera de operandos, ou reordenar o programa.
- A terceira perde o seu resultado. Esperar não significa descartar uma instrução.
Erros frequentes
Supor que múltiplas unidades funcionais implicam emissão fora de ordem.
CPI inferior a 1
Um fragmento conclui 80 instruções em 50 ciclos em um processador superescalar. Calcula CPI.
Pista
Solução
CPI 0,625; IPC 1,6, porque a emissão múltipla permite concluir mais de uma instrução por ciclo em média.
Erros frequentes
Registos diferentes podem designar o mesmo endereço
a0=100 e a1=104. Seguem-se sw t0,4(a0); lw t1,0(a1). A segunda instrução pode ler memória antes da primeira sem outra garantia? Não há acessos externos.
Pista
Solução
Não. O load deve observar o valor guardado pelo store no endereço 104, ou seja, existe RAW de memória apesar das bases terem nomes diferentes. O hardware pode encaminhar o valor do store ao load, mas não pode deixá-lo ler o valor antigo.
Confere a tua resposta:
- Calculei 104 nos dois acessos.
- Identifiquei RAW de memória do store para o load.
- Expliquei por que renomear registos não elimina essa dependência.
Erros frequentes
Procurar só nomes de registos iguais ou tratar renomeação de registos como renomeação dos dados em memória.
Escalonar uma conclusão comum
Traça mul t0,t1,t2; add t3,t4,t5; sub t6,t3,a0. IF e ID duram
um ciclo; a ALU dura um e mul ocupa três fases com intervalo 1. Há MEM e WB
comuns, uma instrução por ciclo, pela ordem do programa, e atalhos para EX.
Cada unidade retém a saída até passar por MEM e não aceita uma operação que
a substitua enquanto estiver retida. Não há faltas ou saltos. A primeira
instrução está em IF 1. Indica EX, MEM e WB das três e distingue espera por
recurso de espera por operando.
Pista
Segue primeiro a ordem de MEM, depois verifica quando cada operando pode chegar a EX.
Solução
mul: EX 3–5, MEM 6, WB 7. add: EX 4, resultado retido em 5–6, MEM 7, WB 8. sub: ID 4–6, EX 7, MEM 8, WB 9. Embora add seja independente, não pode concluir antes de mul. sub pode obter t3 do registo EX/MEM em EX 7, quando add já avança para MEM; não precisa de esperar pelo WB 8.
Confere a tua resposta:
- Coloquei mul em EX nos ciclos 3 a 5 e em MEM 6.
- Retive a add independente antes de MEM 7.
- Usei o resultado da add em EX 7 da sub.