MIPS avançado Escalação Dinâmica MIPS64 com instruções de inteiros e de pontos flutuantes Instruções de ponto flutuante LS LD SS SD ADDD DIVD MULD SUBD F5, 0(R1) – load FP simples (32 bits) F6, 0(R1) - load FP duplo (64 bits) F6, 0(R1) – store FP simples F6, 0(R1) – store FP duplo F6, F10, F8 – adição de F10 e F8 com resultado em F6 F0, F2, F4 - divisão de F2 por F4 com resultado em F0 F6, F10, F8 – multiplicação de F10 com F8 com resultado em F6 F6, F10, F8 – subtração de F10 com F8 com resultado em F6 Registradores do MIPS64 32 registradores de uso geral de 64 bits, R0,...,R31, registradores inteiros. 32 registradores de ponto flutuante, F0, ..., F31, que podem ter dados de precisão simples (32 bits) e dados de precisão dupla (64 bits). Observação: no livro, LS = L.S, LD= L.D, ADDD = ADD.D, etc. Situações de dependência que levam a: RAW – Read After Write – ler depois de escrever WAR – Write After Read – escrever depois de ler WAW – Write After Write – escrever depois de escrever quando se pensa em execução fora de ordem. Exemplos: DIVD F0, F2, F4 ADDD F6, F0, F8 SD F6, 0(R1) SUBD F8,F10, F14 MULD F6, F10, F8 RAW - Dependência entre DIVD e ADDD – no uso de F0 WAR - Antidependência entre ADDD e SUBD - no uso de F8 WAW - Dependência de saída entre ADDD e MULD ( ADDD pode terminar depois de MULD) Escalaçao Dinâmica usando scoreboard (placar) semelhante ao usado no CDC6600 A função do scoreboard é controlar a execução de instruções, e todos os fluxos de dados entre os registradores e as unidades funcionais scoreboard Escalação Dinâmica: Estrutura do MIPS com Placar (scoreboard) Duas unidades de Multiplicação FP Uma unidade de Divisão FP Uma unidade de Adição FP Uma unidade de inteiros 1 .Estágio de Emissão • Se uma unidade funcional estiver livre e nenhuma instrução ativa tem o mesmo registrador destino, o scoreboard emite a instrução para a unidade funcional e atualiza a estrutura de dados interna. Esse passo substitui uma porção do passo ID(Instruction Decode) no MIPS pipeline. – Assegurando que nenhuma instrução ativa tem o mesmo registrador destino, garante-se que WAW seja resolvido. – Se um conflito estrutural ou WAW existe, então, a emissão da instrução pára e nenhuma instrução posterior é emitida até que o conflito seja resolvido. – Quando o estágio de emissão pára, causa o preenchimento do buffer entre IF(Instruction Fetch) e o estágio de emissão. Se o buffer é de única entrada, IF pára imediatamente. Se o buffer é uma fila com múltiplas instruções, IF pára após a fila ficar cheia. 2. Leitura de operandos • O scoreboard monitora a disponibilidade dos operandos fonte. Um operando fonte é disponível se nenhuma instrução anterior ativa irá sobrescrevê-lo. • Quando os operandos fonte são disponíveis, o scoreboard diz à unidade funcional para realizar a leitura dos operandos nos registradores e iniciar a execução. – O scoreboard resolve assim RAW dinamicamente nesse passo, e instruções podem ser enviados para execução fora de ordem. • Este passo junto com o anterior (emissão) completa a função do passo ID no pipeline MIPS simples. 3. Execução • A unidade funcional inicia a execução ao receber os operandos. • Quando o resultado estiver pronto, a unidade notifica o scoreboard que a execução foi realizada. • Este passo substitui o EX no pipeline MIPS e toma vários ciclos no caso da unidade de ponto flutuante. 4. Escrita do resultado (finalização) • Uma vez que o scoreboard é avisado de que a execução foi realizada, o scoreboard verifica se existe violação de WAR e pára a finalização da instrução caso necessário. • O perigo de violação de WAR existe num caso como: DIVD F0, F2, F4 ADDD F10, F0, F8 SUBD F8, F8, F14 onde ADDD depende de F8, que será alterado por SUBD. – Nesse caso, o scoreboard irá parar SUBD no seu estágio de finalização até que ADDD faça a leitura dos seus operandos. • Se o perigo de violação de WAR não existe, ou for eliminado, o scoreboard diz à unidade funcional para escrever o resultado no registrador de destino. • Esse passo substitui o WB no pipeline MIPS. PARTES DO SCOREBOARD 1- Status da Instrução Indica em qual dos quatro passos a instrução se encontra. Instrução emissão LD F6,34(R2) v LD F2,45(R3) v MULD F0,F2,F4 v SUBD F8,F6,F2 v DIVD F10,F0,F6 v ADDD F6,F8,F2 v leitura v v Ex.completa v v Result.escrito v Partes do Scoreboard 2. Status da unidade funcional Indica o estado da unidade funcional. Existem nove campos para cada unidade funcional: • • • • • • Busy – indica se a unidade está ocupada Op – operação a realizar na unidade (P.ex: add, sub) Fi – registrador de destino Fj, Fk – número dos registradores fonte Qj, Qk – unidades funcionais produzindo os valores para fontes Fj, Fk. Rj, Rk – flags indicando que Fj, Fk estão prontos. Exemplo de Status da unidade funcional dest Unid. Func. Busy op Int Mult1 Mult2 Add Divide yes yes no yes yes fontes Fi Fj Fk load mult F2 F0 R3 F2 F4 sub div F8 F6 F10 F0 F2 F6 un.func. Flags de pronto Qj Rj Rk No No yes Qk int int Mult1 yes no No yes Partes do Scoreboard 3. Status dos registradores • Indica qual unidade funcional escreve em cada registrador, se uma instrução ativa tem o registrador como destino. • O campo fica em branco quando não existe nenhuma instrução pendente que escreva no registrador. Regs. F0 F2 Unid. Mult1 int Func. F4 F6 F8 Add F10 Divide F12 ..... F30 Tempo de execução LD – 1 ciclo SUBD – 2 ciclos MULTD - 10 ciclos DIVD – 40 ciclos ADDD – 2 ciclos Exemplo Instruction status Instruction Read j k LD F6 34+ R2 LD F2 45+ R3 MULTD F0 F2 F4 SUBD F8 F6 F2 DIVD F0 F6 F8 F2 F10 ADDD F6 Issue operands complete Result Functional unit status Time Name Busy Integer No Mult1 No Mult2 No Add No Divide No ExecutionWrite dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk F2 F4 F6 F8 F10 F12 ... F30 Register result status Clock F0 FU ciclo 1 Instruction status Instruction j Read k LD F6 34+ R2 LD F2 45+ R3 MULTD F0 F2 F4 SUBD F8 F6 F2 DIVD F0 F6 F8 F2 F10 ADDD F6 Issue operands complete Result 1 Functional unit status Time Name Execution Write dest S1 S2 FU for j FU for k Fj? Fk? Fj Fk Qj Qk Rj Rk Busy Op Fi Integer Yes Load F6 Mult1 No Mult2 No Add No Divide No F2 F4 R2 Yes Register result status Clock 1 F0 FU F6 Integer F8 F10 F12 ... F30 ciclo 2 Instruction status Instruction j Read k LD F6 34+ R2 LD F2 45+ R3 MULTD F0 F2 F4 SUBD F8 F6 F2 DIVD F0 F6 F8 F2 F10 ADDD F6 Issue operands complete Result 1 2 Functional unit status Time Name Execution Write dest S1 S2 FU for j FU for k Fj? Fk? Fj Fk Qj Qk Rj Rk Busy Op Fi Integer Yes Load F6 Mult1 No Mult2 No Add No Divide No F2 F4 R2 Yes Register result status Clock 2 F0 FU • Issue 2nd LD? F6 F8 Integer (não, conflito estrutural) F10 F12 ... F30 ciclo 3 Instruction status Instruction j Read k LD F6 34+ R2 LD F2 45+ R3 MULTD F0 F2 F4 SUBD F8 F6 F2 DIVD F0 F6 F8 F2 F10 ADDD F6 Issue operands complete Result 1 2 Functional unit status Time Name Execution Write 3 dest S1 S2 FU for j FU for k Fj? Fk? Fj Fk Qj Qk Rj Rk Busy Op Fi Integer Yes Load F6 Mult1 No Mult2 No Add No Divide No F2 F4 R2 Yes Register result status Clock 3 • F0 FU Issue MULT? F6 F8 F10 Integer (não, emissão fora de ordem) F12 ... F30 ciclo 4 Instruction status Instruction j Read k LD F6 34+ R2 LD F2 45+ R3 MULTD F0 F2 F4 SUBD F8 F6 F2 DIVD F0 F6 F8 F2 F10 ADDD F6 Issue operands complete Result 1 2 Functional unit status Time Name Execution Write 3 4 dest S1 S2 FU for j FU for k Fj? Fk? Fj Fk Qj Qk Rj Rk Busy Op Fi Integer Yes Load F6 Mult1 No Mult2 No Add No Divide No F2 F4 R2 Yes Register result status Clock 4 F0 FU F6 Integer F8 F10 F12 ... F30 ciclo 5 Clock Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Clock 5 FU Read Execution Write Issue operandscomplete Result 1 2 3 4 5 Busy Op Yes Load No No No No F0 dest Fi F2 F2 F4 Integer S1 Fj S2 Fk R3 FU for j FU for k Fj? Qj Qk Rj Fk? Rk Yes F6 F8 F10 F30 F12 ... ciclo 6 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Clock 6 FU Read ExecutionWrite Issue operandscompleteResult 1 2 3 4 5 6 6 Busy Yes Yes No No No Op Load Mult dest Fi F2 F0 F0 F2 F4 Mult1 Integer S1 Fj FU for j FU for k Fj? Qj Qk Rj F2 S2 Fk R3 F4 F6 F8 F10 Integer F12 No Fk? Rk Yes Yes ... F30 ciclo 7 Instruction status Instruction j k Issue LD F6 34+ R2 1 LD F2 45+ R3 5 MULTD F0 F2 F4 6 SUBDF8 F6 F2 7 DIVD F10 F0 F6 ADDDF6 F8 F2 Functional unit status TimeName Busy Integer Yes Mult1 Yes Mult2 No Add Yes Divide No Register result status Clock 7 • Read Execution Write operands complete Result 2 3 4 6 7 Op Load Mult dest Fi F2 F0 S1 Fj FU for jFU for kFj? Qj Qk Rj F2 S2 Fk R3 F4 No Fk? Rk Yes Yes Sub F8 F6 F2 Integer Yes No F4 F6 F8 F10 F12 ... F0 F2 FU Mult1Integer Read multiply operands? Integer Add (F2 não disponível) F30 ciclo 8 Instruction status Instruction j k Issue LD F6 34+ R2 1 LD F2 45+ R3 5 MULTD F0 F2 F4 6 SUBDF8 F6 F2 7 DIVD F10 F0 F6 8 ADDDF6 F8 F2 Functional unit status TimeName Busy Integer No Mult1 Yes Mult2 No Add Yes Divide Yes Register result status Clock 8 FU Read Execution Write operands complete Result 2 3 4 6 7 8 Op dest Fi S1 Fj S2 Fk FU for jFU for kFj? Qj Qk Rj Fk? Rk Mult F0 F2 F4 Yes Yes Sub Div F8 F10 F6 F0 F2 F6 Yes No Yes Yes F0 F2 F4 F6 F8 F10 F12 ... Mult1 Mult1 Add Divide F30 ciclo 9 Instruction status Instruction j k Issue LD F6 34+ R2 1 LD F2 45+ R3 5 MULTD F0 F2 F4 6 SUBDF8 F6 F2 7 DIVD F10 F0 F6 8 ADDDF6 F8 F2 Functional unit status TimeName Busy Integer No 10 Mult1 Yes Mult2 No 2 Add Yes Divide Yes Register result status Read Execution Write operands complete Result 2 3 4 6 7 8 9 9 Clock 9 • • F0 FU Op dest Fi S1 Fj S2 Fk FU for jFU for kFj? Qj Qk Rj Fk? Rk Mult F0 F2 F4 Yes Yes Sub Div F8 F10 F6 F0 F2 F6 Yes No Yes Yes F2 F4 F6 F8 F10 F12 ... F30 Mult1 Mult1 Add Divide Read operands for MULT & SUBD? (sim) (não, unidade Add ocupada) Issue ADDD? ciclo 11 Instruction status Instruction j Read k Issue Execution Write operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 SUBD F8 F6 F2 7 9 DIVD F0 F6 8 F8 F2 F10 ADDD F6 Functional unit status Time Name dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk Mult F0 F2 F4 Yes Yes Yes Sub F8 F6 F2 Yes Yes Yes Div F10 F0 F6 Mult1 No Yes F0 F2 F4 F6 F8 F10 ... F30 Add Divide Busy Integer 11 No 8 Mult1 Yes Mult2 No 0 Add Divide Register result status Clock 11 FU Mult1 F12 • ciclo 12 Instruction status Instruction j Read k Issue Execution Write operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 SUBD F8 F6 F2 7 9 11 12 DIVD F0 F6 8 F8 F2 F10 ADDD F6 Functional unit status Time Name Busy Integer dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk Mult F0 F2 F4 Yes Yes No Yes ... F30 No 7 Mult1 Yes Mult2 No Add No Divide Yes Div F10 F0 F6 Mult1 F0 F2 F4 F6 F8 F10 Register result status Clock 12 FU Mult1 Read operands for DIVD? Divide (F0 não disponível) F12 ciclo 13 Read Instruction status Instruction j k Issue Execution Write operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 SUBD F8 F6 F2 7 9 11 12 F0 F6 8 F8 F2 13 DIVD F10 ADDD F6 dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk Mult F0 F2 F4 Yes Yes Yes Yes No Yes ... F30 Functional unit status Busy Time Name No Integer Yes 6 Mult1 Mult2 No Add Yes Add F6 F8 F2 Divide Yes Div F10 F0 F6 Mult1 F0 F2 F4 F6 F8 F10 Register result status Clock 13 FU Mult1 Add Divide F12 ciclo 14 Instruction status Instruction j Read k Issue Execution Write operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 SUBD F8 F6 F2 7 9 11 12 DIVD F0 F6 8 F8 F2 13 F10 ADDD F6 14 Functional unit status Time Name dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk Mult F0 F2 F4 Yes Yes Yes Add F6 F8 F2 Yes Yes Yes Div F10 F0 F6 Mult1 No Yes F0 F2 F4 F6 F8 F10 ... F30 Busy Integer No 5 Mult1 Yes Mult2 No 2 Add Divide Register result status Clock 14 FU Mult1 Add Divide F12 ciclo 15 Instruction status Instruction j Read k Issue Execution Write operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 SUBD F8 F6 F2 7 9 11 12 DIVD F0 F6 8 F8 F2 13 F10 ADDD F6 14 Functional unit status Time Name dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk Mult F0 F2 F4 Yes Yes Yes Add F6 F8 F2 Yes Yes Yes Div F10 F0 F6 Mult1 No Yes F0 F2 F4 F6 F8 F10 ... F30 Busy Integer No 4 Mult1 Yes Mult2 No 1 Add Divide Register result status Clock 15 FU Mult1 Add Divide F12 ciclo 16 Read Instruction status Instruction j k Issue Execution Write operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 SUBD F8 F6 F2 7 9 11 12 F0 F6 8 F8 F2 13 14 16 DIVD F10 ADDD F6 dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk Mult F0 F2 F4 Yes Yes Yes Add F6 F8 F2 Yes Yes Yes Div F10 F0 F6 Mult1 No Yes F0 F2 F4 F6 F8 F10 ... F30 Functional unit status Busy Time Name No Integer Yes 3 Mult1 No Mult2 0 Add Divide Register result status Clock 16 FU Mult1 Add Divide F12 ciclo 17 Instruction status Instruction j Read k Issue Execution Write operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 SUBD F8 F6 F2 7 9 11 12 DIVD F0 F6 8 F8 F2 13 14 16 F10 ADDD F6 Functional unit status Time Name Busy Integer dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk Mult F0 F2 F4 Yes Yes Yes Yes No Yes ... F30 No 2 Mult1 Yes Mult2 No Add Yes Add F6 F8 F2 Divide Yes Div F10 F0 F6 Mult1 F0 F2 F4 F6 F8 F10 Register result status Clock 17 • FU Mult1 Write result of ADDD? Add F12 Divide (não, WAR de F6 para read em DIVD) ciclo 18 Instruction status Instruction j Read k Issue Execution Write operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 SUBD F8 F6 F2 7 9 11 12 DIVD F0 F6 8 F8 F2 13 14 16 F10 ADDD F6 Functional unit status Time Name Busy Integer dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk Mult F0 F2 F4 Yes Yes Yes Yes No Yes ... F30 No 1 Mult1 Yes Mult2 No Add Yes Add F6 F8 F2 Divide Yes Div F10 F0 F6 Mult1 F0 F2 F4 F6 F8 F10 Register result status Clock 18 FU Mult1 Add Divide F12 ciclo 19 Instruction status Instruction j Read k Issue Execution Write operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 19 SUBD F8 F6 F2 7 9 11 DIVD F0 F6 8 F8 F2 13 14 16 F10 ADDD F6 Functional unit status Time Name Busy Integer 12 dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk Mult F0 F2 F4 Yes Yes Yes Yes No Yes ... F30 No 0 Mult1 Yes Mult2 No Add Yes Add F6 F8 F2 Divide Yes Div F10 F0 F6 Mult1 F0 F2 F4 F6 F8 F10 Register result status Clock 19 FU Mult1 Add Divide F12 ciclo 20 Instruction status Instruction j Read k Issue Execution Write operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 19 20 SUBD F8 F6 F2 7 9 11 12 DIVD F0 F6 8 F8 F2 13 14 16 F10 ADDD F6 Functional unit status Time Name Busy dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk Integer No Mult1 No Mult2 No Add Yes Add F6 F8 F2 Yes Yes Divide Yes Div F10 F0 F6 Yes Yes F0 F2 F4 F6 F8 ... F30 Register result status Clock 20 FU Add F10 Divide F12 ciclo 21 Instruction status Instruction j Read k Issue Execution Write operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 19 20 SUBD F8 F6 F2 7 9 11 12 DIVD F0 F6 8 21 F8 F2 13 14 F10 ADDD F6 Functional unit status Time Name Busy 16 dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk Integer No Mult1 No Mult2 No Add Yes Add F6 F8 F2 Yes Yes Divide Yes Div F10 F0 F6 Yes Yes F0 F2 F4 F6 F8 ... F30 Register result status Clock 21 FU Add F10 Divide F12 ciclo 22 Instruction status Instruction j Read k Issue Execution Write operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 19 20 SUBD F8 F6 F2 7 9 11 12 DIVD F0 F6 8 21 F8 F2 13 14 16 22 F10 ADDD F6 Functional unit status Time Name dest S1 S2 FU for j FU for k Fj? Fk? Op Fi Fj Fk Qj Qk Rj Rk Yes Div F10 F0 F6 Yes Yes F0 F2 F4 F6 F8 ... F30 Busy Integer No Mult1 No Mult2 No Add No 40 Divide Register result status Clock 22 FU F10 Divide F12 ciclo 61 Instruction status Instruction j k Issue LD F6 34+ R2 1 LD F2 45+ R3 5 MULTD F0 F2 F4 6 SUBDF8 F6 F2 7 DIVD F10 F0 F6 8 ADDDF6 F8 F2 13 Functional unit status TimeName Busy Integer No Mult1 No Mult2 No Add No 0 Divide Yes Register result status Read Execution Write operands complete Result 2 3 4 6 7 8 9 19 20 9 11 12 21 61 14 16 22 dest S1 S2 Op Fi Fj Fk Div F10 F0 Clock F2 F4 F6 F8 F10 F12 61 F0 FU FU for jFU for kFj? Qj Qk Rj Fk? Rk Yes Yes ... F30 F6 Divide ciclo 62 Instruction status Read Execution Write Instruction j k Issue operands complete Result LD F6 34+ R2 1 2 3 4 LD F2 45+ R3 5 6 7 8 MULTD F0 F2 F4 6 9 19 20 SUBDF8 F6 F2 7 9 11 12 DIVD F10 F0 F6 8 21 61 62 ADDDF6 F8 F2 13 14 16 22 Functional unit status dest S1 S2 TimeName Busy Op Fi Fj Fk Integer No Mult1 No Mult2 No Add No 0 Divide No Register result status Clock 62 F0 F2 FU F4 FU for jFU for kFj? Qj Qk Rj F6 F8 F10 F12 ... Fk? Rk F30 Resumo • Idéias chaves do scoreboard – Estágio ID verifica o conflito estrutural – Emissão em ordem, respeitando WAW – Espera dos operandos fora de ordem, respeitando RAW – Execução e término fora de ordem – Escrita do resultado fora de ordem, respeitando WAR