• Nenhum resultado encontrado

DTSVLIW. UFES Mestrado em Informática. Arquiteturas Avançadas de Computador. Sotério Ferreira de Souza. Prof. Alberto Ferreira de Souza

N/A
N/A
Protected

Academic year: 2021

Share "DTSVLIW. UFES Mestrado em Informática. Arquiteturas Avançadas de Computador. Sotério Ferreira de Souza. Prof. Alberto Ferreira de Souza"

Copied!
84
0
0

Texto

(1)

UFES – Mestrado em Informática

Arquiteturas Avançadas de

Computador

DTSVLIW

UFES – Mestrado em Informática

Arquiteturas Avançadas de

Computador

DTSVLIW

DTSVLIW

Sotério Ferreira de Souza

Orientador: Prof. Alberto Ferreira de Souza

23 de outubro de 2003

DTSVLIW

Sotério Ferreira de Souza

Orientador: Prof. Alberto Ferreira de Souza

23 de outubro de 2003

(2)

DTSVLIW

Dynamically Trace Scheduled Very

Long Instruction Word

DTSVLIW

Dynamically Trace Scheduled Very

Long Instruction Word

Long Instruction Word

Prof. Dr. Alberto Ferreira de Souza

Tese de Doutorado – UCL - Set/1999

Long Instruction Word

Prof. Dr. Alberto Ferreira de Souza

Tese de Doutorado – UCL - Set/1999

(3)

1 – Visão geral da arquitetura DTSVLIW

2 – Como extrai paralelismo no nível de instrução 3 – Como renomeia registradores

Do que vamos falar?

4 – Como renomeia leituras/escritas na memória 5 – Como trata aliasing exceptions

6 – Como trata exceções

(4)

Background

Paralelismo no Nível de Instrução – ILP

Explorar a possibilidade de execução de instruções

independentemente da seqüência definida pelo programador Paralelismo no Nível de Instrução – ILP

Explorar a possibilidade de execução de instruções

independentemente da seqüência definida pelo programador independentemente da seqüência definida pelo programador

Temporal: processador segmenta a “execução” em vários subprocessos executados por unidades autônomas.

Espacial: processador com múltiplas unidades funcionais executando simultaneamente.

independentemente da seqüência definida pelo programador

Temporal: processador segmenta a “execução” em vários subprocessos executados por unidades autônomas.

Espacial: processador com múltiplas unidades funcionais executando simultaneamente.

(5)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch

(6)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1

(7)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1 I2 I1 CLK 2

(8)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1 I2 I1 CLK 2 I3 I2 I1 CLK 3

(9)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1 I2 I1 CLK 2 I3 I2 I1 CLK 3 I4 I3 I2 CLK 4 I1

(10)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1 I2 I1 CLK 2 I3 I2 I1 CLK 3 I4 I3 I2 CLK 4 I5 I4 I3 I1I2 I1 CLK 5

(11)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1 I2 I1 CLK 2 I3 I2 I1 CLK 3 I4 I3 I2 CLK 4 I5 I4 I3 I1I2 I1 CLK 5 I6 I5 I4 I3 I2 CLK 6

(12)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1 I2 I1 CLK 2 I3 I2 I1 CLK 3 I4 I3 I2 CLK 4 I5 I4 I3 I1I2 I1 CLK 5 I6 I5 I4 I3 I2 CLK 6 I7 I6 I5 I4 I3 CLK 7

(13)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1 I2 I1 CLK 2 I3 I2 I1 CLK 3 I4 I3 I2 CLK 4 I5 I4 I3 I1I2 I1 CLK 5 I6 I5 I4 I3 I2 CLK 6 I7 I6 I5 I4 I3 CLK 7 I8 I7 I6 I5 I4 CLK 8

(14)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1 I2 I1 CLK 2 I3 I2 I1 CLK 3 I4 I3 I2 CLK 4 I5 I4 I3 I1I2 I1 CLK 5 I6 I5 I4 I3 I2 CLK 6 I7 I6 I5 I4 I3 CLK 7 I8 I7 I6 I5 I4 CLK 8 I8 I7 I6 I5 CLK 9

(15)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1 I2 I1 CLK 2 I3 I2 I1 CLK 3 I4 I3 I2 CLK 4 I5 I4 I3 I1I2 I1 CLK 5 I6 I5 I4 I3 I2 CLK 6 I7 I6 I5 I4 I3 CLK 7 I8 I7 I6 I5 I4 CLK 8 I8 I7 I6 I5 CLK 9 I8 I7 I6 CLK 10

(16)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1 I2 I1 CLK 2 I3 I2 I1 CLK 3 I4 I3 I2 CLK 4 I5 I4 I3 I1I2 I1 CLK 5 I6 I5 I4 I3 I2 CLK 6 I7 I6 I5 I4 I3 CLK 7 I8 I7 I6 I5 I4 CLK 8 I8 I7 I6 I5 CLK 9 I8 I7 I6 CLK 10 I8 I7 CLK 11

(17)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1 I2 I1 CLK 2 I3 I2 I1 CLK 3 I4 I3 I2 CLK 4 I5 I4 I3 I1I2 I1 CLK 5 I6 I5 I4 I3 I2 CLK 6 I7 I6 I5 I4 I3 CLK 7 I8 I7 I6 I5 I4 CLK 8 I8 I7 I6 I5 CLK 9 I8 I7 I6 CLK 10 I8 I7 CLK 11 I8 CLK 12

(18)

Background

PIPELINE

PARALELISMO TEMPORAL

PIPELINE

PARALELISMO TEMPORAL Execute Memory Access Write Back Decode Fetch I1 CLK 1 I2 I1 CLK 2 I3 I2 I1 CLK 3 I4 I3 I2 CLK 4 I5 I4 I3 I1I2 I1 CLK 5 I6 I5 I4 I3 I2 CLK 6 I7 I6 I5 I4 I3 CLK 7 I8 I7 I6 I5 I4 CLK 8 I8 I7 I6 I5 CLK 9 I8 I7 I6 CLK 10 I8 I7 CLK 11 I8 CLK 12 CLK 13

(19)

Background

VLIW

PARALELISMO ESPACIAL

VLIW

PARALELISMO ESPACIAL I1 I2 I3 I4 FU-3 FU-4 FU-2 FU-1 IC DC E I5 I6 I7 I8

(20)

Background

VLIW

PARALELISMO ESPACIAL

VLIW

PARALELISMO ESPACIAL I1 I2 I3 I4 FU-3 FU-4 FU-2 FU-1 IC DC E I5 I6 I7 I8 I5 I6 I7 I8 I3 I4 I2 I1 CLK 1

(21)

Background

VLIW

PARALELISMO ESPACIAL

VLIW

PARALELISMO ESPACIAL I1 I2 I3 I4 FU-3 FU-4 FU-2 FU-1 IC DC E I5 I6 I7 I8 I5 I6 I7 I8 I3 I4 I2 I1 CLK 1 I1 I2 I3 I4 I7 I8 I6 I5 CLK 2

(22)

Background

VLIW

PARALELISMO ESPACIAL

VLIW

PARALELISMO ESPACIAL I1 I2 I3 I4 FU-3 FU-4 FU-2 FU-1 IC DC E I5 I6 I7 I8 I5 I6 I7 I8 I3 I4 I2 I1 CLK 1 I1 I2 I3 I4 I7 I8 I6 I5 CLK 2 I5 I6 I7 I8 FU-3 FU-4 FU-2 FU-1 I1 I2 I3 I4 CLK 3

(23)

Background

PARALELIZAÇÃO

Capacidade de paralelização que pode ser explorada é limitada pelas dependências de controle e de dados entre as instruções.

PARALELIZAÇÃO

Capacidade de paralelização que pode ser explorada é limitada pelas dependências de controle e de dados entre as instruções. pelas dependências de controle e de dados entre as instruções. PIPELINE: impedem a execução de instruções consecutivas.

VLIW: impedem a inserção de mais instruções dentro de uma instrução longa.

pelas dependências de controle e de dados entre as instruções. PIPELINE: impedem a execução de instruções consecutivas.

VLIW: impedem a inserção de mais instruções dentro de uma instrução longa.

(24)

Background

Dependências:

if r8 = 0 goto L r3 : = r1 + r4 ... ...

Dependências:

if r8 = 0 goto L r3 : = r1 + r4 ... ... r2 : = r1 + 1 r1 : = r2 / r5 ... L: r1 : = r3 * r4 r1 : = 50[r6] ... ... r2 : = r1 + 1 r1 : = r3 + r4 r2 : = r1 + 1 r1 : = r2 / r5 ... L: r1 : = r3 * r4 r1 : = 50[r6] ... ... r2 : = r1 + 1 r1 : = r3 + r4

(25)

Background

Dependências:

if r8 = 0 goto L r3 : = r1 + r4 ... ...

Dependências:

if r8 = 0 goto L r3 : = r1 + r4 ... Controle ... r2 : = r1 + 1 r1 : = r2 / r5 ... L: r1 : = r3 * r4 r1 : = 50[r6] ... ... r2 : = r1 + 1 r1 : = r3 + r4 r2 : = r1 + 1 r1 : = r2 / r5 ... L: r1 : = r3 * r4 r1 : = 50[r6] ... ... r2 : = r1 + 1 r1 : = r3 + r4

(26)

Background

Dependências:

if r8 = 0 goto L r3 : = r1 + r4 ... ...

Dependências:

if r8 = 0 goto L r3 : = r1 + r4 ... Controle ... r2 : = r1 + 1 r1 : = r2 / r5 ... L: r1 : = r3 * r4 r1 : = 50[r6] ... ... r2 : = r1 + 1 r1 : = r3 + r4 r2 : = r1 + 1 r1 : = r2 / r5 ... L: r1 : = r3 * r4 r1 : = 50[r6] ... ... r2 : = r1 + 1 r1 : = r3 + r4 Saída

(27)

Background

Dependências:

if r8 = 0 goto L r3 : = r1 + r4 ... ...

Dependências:

if r8 = 0 goto L r3 : = r1 + r4 ... Controle ... Anti-dependência r2 : = r1 + 1 r1 : = r2 / r5 ... L: r1 : = r3 * r4 r1 : = 50[r6] ... ... r2 : = r1 + 1 r1 : = r3 + r4 r2 : = r1 + 1 r1 : = r2 / r5 ... L: r1 : = r3 * r4 r1 : = 50[r6] ... ... r2 : = r1 + 1 r1 : = r3 + r4 Saída

(28)

Background

Dependências:

if r8 = 0 goto L r3 : = r1 + r4 ... ...

Dependências:

if r8 = 0 goto L r3 : = r1 + r4 ... Controle ... Anti-dependência r2 : = r1 + 1 r1 : = r2 / r5 ... L: r1 : = r3 * r4 r1 : = 50[r6] ... ... r2 : = r1 + 1 r1 : = r3 + r4 r2 : = r1 + 1 r1 : = r2 / r5 ... L: r1 : = r3 * r4 r1 : = 50[r6] ... ... r2 : = r1 + 1 r1 : = r3 + r4 Saída VERDADEIRA

(29)

Background

Técnicas para minimização dos problemas causados por dependências. Técnicas para minimização dos problemas causados por dependências.

Register Renaming

Register Renaming

Elimina dependências de saída e anti-dependência, também conhecidas como dependências de nome.

Exemplos: r1:=r2+r4 r1:=r2+r4 r3:=r1+r4 r3:=r1+r4

... ... ... ...

r1:=r2*r5 r3:=r2*r5 r1:=r2/r5 r6:=r2/r5 Elimina dependências de saída e anti-dependência, também conhecidas como dependências de nome.

Exemplos: r1:=r2+r4 r1:=r2+r4 r3:=r1+r4 r3:=r1+r4

... ... ... ...

(30)

Background

Técnicas para minimização dos problemas causados por dependências. Técnicas para minimização dos problemas causados por dependências.

Branch Prediction

Branch Prediction

Branch Prediction

Reduz impacto das dependências de controle.

Desvios podem ser preditos estaticamente pelo compilador ou dinamicamente pelo hardware.

Branch Prediction

Reduz impacto das dependências de controle.

Desvios podem ser preditos estaticamente pelo compilador ou dinamicamente pelo hardware.

(31)

Background

Técnicas para minimização dos problemas causados por dependências. Técnicas para minimização dos problemas causados por dependências.

Speculative Execution

Speculative Execution

Speculative Execution

As instruções são executadas sem que o resultado de um desvio

condicional seja conhecido, porém os valores de saída são confirmados apenas se o resultado do desvio for coerente com o caminho tomado na execução especulativa.

Speculative Execution

As instruções são executadas sem que o resultado de um desvio

condicional seja conhecido, porém os valores de saída são confirmados apenas se o resultado do desvio for coerente com o caminho tomado na execução especulativa.

(32)

Background

Técnicas para minimização dos problemas causados por dependências. Técnicas para minimização dos problemas causados por dependências.

Memory Disambiguation

Memory Disambiguation

É necessária quando instruções load/store são executadas fora da ordem especificada pelo programador.

Exemplo: ... st r3,a ld a,r1 ld a,r1 ... ... st r3,a

É necessária quando instruções load/store são executadas fora da ordem especificada pelo programador.

Exemplo: ... st r3,a ld a,r1 ld a,r1 ... ... st r3,a

(33)

Background

Técnicas para minimização dos problemas causados por dependências. Técnicas para minimização dos problemas causados por dependências.

Predication

Predication

Predication

Execução condicional baseada em valor booleano de um operador de entrada. Instrução com predicado true são executadas normalmente enquanto as com predicado false, embora tratadas, não tem seus resultados salvos no estado ISA.

Predication

Execução condicional baseada em valor booleano de um operador de entrada. Instrução com predicado true são executadas normalmente enquanto as com predicado false, embora tratadas, não tem seus resultados salvos no estado ISA.

(34)

Background

Técnicas para minimização dos problemas causados por dependências. Técnicas para minimização dos problemas causados por dependências.

Instruction Hoisting

Instruction Hoisting

Instruction Hoisting

Execução especulativa de instruções load, store e ponto-flutuante pode causar exceções que não devem ser sinalizadas enquanto os resultados da execução especulativa não sejam confirmados.

Instruction Hoisting

Execução especulativa de instruções load, store e ponto-flutuante pode causar exceções que não devem ser sinalizadas enquanto os resultados da execução especulativa não sejam confirmados.

(35)

Máquina

Máquina dede EscalonamentoEscalonamento:: Unidade

Unidade dede EscalonamentoEscalonamento Processador

Processador PrimárioPrimário PipelinedPipelined

Máquina

Máquina VLIWVLIW::

Cache

Cache VLIWVLIW

D

D

T

T

S

S

V

V

CacheCache VLIWVLIW

Estágios

Estágios PipelinedPipelined

Fecth

Fecth UnitUnit::

Program

Program CounterCounter

Endereço

Endereço dede InstruçãoInstrução Endereço

Endereço dede InstruçãoInstrução LongaLonga

V

V

L

L

II

W

W

(36)

Instruction Cache

Scheduler

Visão Geral da Arquitetura DTSVLIW

Visão Geral da Arquitetura DTSVLIW

VLIW Cache Fecth Unit Primary Processor Scheduler Unit Scheduler Engine Scheduling List VLIW Engine Data Cache To/From Memory

(37)

A Máquina de Escalonamento

Processador Primário

Processador pipelined simples com estágios de fetch,

decode, execute e write back, capaz de executar todas as decode, execute e write back, capaz de executar todas as

instruções Sparc Version 7 ISA.

Unidade de Escalonamento

Implementação, em hardware, de versão simplificada do algoritmo FCFS (First Come First Served)

(38)

A máquina VLIW

Cache VLIW

Cache associativo com tamanho de linha igual à um bloco de instruções longas (BLOCK_SIZE), com campo nba

associado à cada linha do cache. associado à cada linha do cache.

Processamento das instruções

Unidades funcionais pipelined com estágios de fetch,

execute e write back, para processamento de instruções

(39)

A máquina DTSVLIW

A máquina DTSVLIW

Scheduler Engine Scheduler Unit I S Mu Mu Mu Mu Instruction Cache Primary Processor VLIW Engine Fecth Unit VLIW Cache F E WB F D WB E I S

(40)

A Unidade de Escalonamento

O algoritmo FCFS:

• Motivos para a escolha

• Como trabalha

• A inserção na lista de escalonamento

• Instrução candidata / Move Up

• Condições para Move Up

• Envio para o Cache VLIW

(41)

Inserções na lista de Escalonamento

Instrução livre de dependências com outras presentes no último elemento da lista são inseridas em slot vago neste elemento e se tornam candidatas, podendo ser escalonadas dentro da lista (move up). Caso contrário, um novo elemento é criado para receber a instrução recebida do estágio execute do processador primário, sendo a mesma instalada nesse novo elemento.

(42)

Condições para Move Up

Se existe slot vago e não existe dependência verdadeira com outras instruções presentes no elemento imediatamente superior (i-1).

Se existe dependência de saída com instrução em (i-1); Se existe dependência de saída com instrução em (i-1); Ou existe antidependência com instrução em (i);

Ou existe dependência de controle com instrução em (i). Nestes três últimos casos, a instrução candidata é dividida.

Renomeia-se a saída e instala-se instrução cópia no slot atual da instrução longa (i).

(43)

Split de instruções

Em caso de dependência de saída, antidependência ou dependência de controle com instrução no elemento (i-1):

O registrador de saída é renomeado para um renaming register e o

move up acontece normalmente. Instrução COPY é instalada no slot atual para copiar renaming register para registrador original. slot atual para copiar renaming register para registrador original.

...

(i-k) r3: = r1 + r4 ...

(44)

Split de instruções

Em caso de dependência de saída, antidependência ou dependência de controle com instrução no elemento (i-1):

O registrador de saída é renomeado para um renaming register e o

move up acontece normalmente. Instrução COPY é instalada no slot atual para copiar renaming register para registrador original. slot atual para copiar renaming register para registrador original.

... (i-k) r3: = r1 + r4 ... (i) r1: = r2 + r5 (i) r9: = r2 + r5 ... (i-k) r3: = r1 + r4 ... (i) r1: = r9

(45)

Instruções COPY

Não provocam dependência de dados e podem ser sobrescritas. Instrução em (i) que escreve em registrador de saída de instrução cópia em (i-1) pode ser escalonada sem divisão se o tag é igual ao da instrução longa. Neste caso, pode subrescrever instrução cópia em (i-1).

em (i-1).

Se tag da instrução cópia é diferente do tag da instrução longa (i-1), a instrução em (i) tem que ser dividida para ser movida para (i-1) Instrução longa que lê registrador de saída de instrução cópia, pode ser escalonada com renomeação do registrador de entrada.

(46)

Instruções de Desvio

Instruções de desvio condicional são instaladas quando inseridas. Estabelecem tag para suas instruções longas que são propagados para instruções inseridas e/ou instaladas posteriormente.

para instruções inseridas e/ou instaladas posteriormente.

Os tags são avaliados na execução VLIW. Se válidos, as instruções tem seus resultados escritos no estado de máquina.

(47)

O algoritmo FCFS executando:

for (sum=0, i=0; i<x;i++) {

sum=a[i] + sum; }

1: or r0, 0, r9 # r9=sum 2: sethi hi(56), r8 # r8=temp 3: or r8, 8, r11 # r11=*a 4: or r0, 0, r10 # r10=4*i Loop: 5: ld [r10+r11],r8 6: add r9, r8, r9 7: add r10, 4, r9 8: subcc r10, 4*x-1,r0 9: ble loop 9: ble loop 10: or r0, 0, r0 # nop

(48)

O algoritmo FCFS executando:

for (sum=0, i=0; i<x;i++) {

sum=a[i] + sum; }

1: or r0, 0, r9 # r9=sum 2: sethi hi(56), r8 # r8=temp 3: or r8, 8, r11 # r11=*a 4: or r0, 0, r10 # r10=4*i Loop: 5: ld [r10+r11],r8 6: add r9, r8, r9 7: add r10, 4, r9 8: subcc r10, 4*x-1,r0 9: ble loop or r0,0,r9 slh-> Depois de 1 ciclo 9: ble loop 10: or r0, 0, r0 # nop

(49)

O algoritmo FCFS executando:

for (sum=0, i=0; i<x;i++) {

sum=a[i] + sum; }

1: or r0, 0, r9 # r9=sum 2: sethi hi(56), r8 # r8=temp 3: or r8, 8, r11 # r11=*a 4: or r0, 0, r10 # r10=4*i Loop: 5: ld [r10+r11],r8 6: add r9, r8, r9 7: add r10, 4, r9 8: subcc r10, 4*x-1,r0 9: ble loop or r0,0,r9 slh-> Depois de 1 ciclo Depois de 2 ciclos or r0,0,r9 slh-> sethi hi(56),r8 9: ble loop 10: or r0, 0, r0 # nop

(50)

O algoritmo FCFS executando:

for (sum=0, i=0; i<x;i++) {

sum=a[i] + sum; }

1: or r0, 0, r9 # r9=sum 2: sethi hi(56), r8 # r8=temp 3: or r8, 8, r11 # r11=*a 4: or r0, 0, r10 # r10=4*i Loop: 5: ld [r10+r11],r8 6: add r9, r8, r9 7: add r10, 4, r9 8: subcc r10, 4*x-1,r0 9: ble loop or r0,0,r9 slh-> Depois de 1 ciclo Depois de 2 ciclos or r0,0,r9 slh-> sethi hi(56),r8 Depois de 3 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> 9: ble loop 10: or r0, 0, r0 # nop

(51)

O algoritmo FCFS executando:

for (sum=0, i=0; i<x;i++) {

sum=a[i] + sum; }

1: or r0, 0, r9 # r9=sum 2: sethi hi(56), r8 # r8=temp 3: or r8, 8, r11 # r11=*a 4: or r0, 0, r10 # r10=4*i Loop: 5: ld [r10+r11],r8 6: add r9, r8, r9 7: add r10, 4, r9 8: subcc r10, 4*x-1,r0 9: ble loop or r0,0,r9 slh-> Depois de 1 ciclo Depois de 2 ciclos or r0,0,r9 slh-> sethi hi(56),r8 Depois de 3 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> Depois de 4 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> or r0,0,r10 9: ble loop 10: or r0, 0, r0 # nop

(52)

O algoritmo FCFS executando:

for (sum=0, i=0; i<x;i++) {

sum=a[i] + sum; }

1: or r0, 0, r9 # r9=sum 2: sethi hi(56), r8 # r8=temp 3: or r8, 8, r11 # r11=*a 4: or r0, 0, r10 # r10=4*i Loop: 5: ld [r10+r11],r8 6: add r9, r8, r9 7: add r10, 4, r9 8: subcc r10, 4*x-1,r0 9: ble loop or r0,0,r9 slh-> Depois de 1 ciclo Depois de 2 ciclos or r0,0,r9 slh-> sethi hi(56),r8 Depois de 3 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> Depois de 4 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> or r0,0,r10 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 slt-> Depois de 5 ciclos 9: ble loop 10: or r0, 0, r0 # nop

(53)

O algoritmo FCFS executando:

for (sum=0, i=0; i<x;i++) {

sum=a[i] + sum; }

1: or r0, 0, r9 # r9=sum 2: sethi hi(56), r8 # r8=temp 3: or r8, 8, r11 # r11=*a 4: or r0, 0, r10 # r10=4*i Loop: 5: ld [r10+r11],r8 6: add r9, r8, r9 7: add r10, 4, r9 8: subcc r10, 4*x-1,r0 9: ble loop or r0,0,r9 slh-> Depois de 1 ciclo Depois de 2 ciclos or r0,0,r9 slh-> sethi hi(56),r8 Depois de 3 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> Depois de 4 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> or r0,0,r10 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 slt-> Depois de 5 ciclos add r9,r8,r9 slt-> or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 Depois de 6 ciclos 9: ble loop 10: or r0, 0, r0 # nop

(54)

O algoritmo FCFS executando:

for (sum=0, i=0; i<x;i++) {

sum=a[i] + sum; }

1: or r0, 0, r9 # r9=sum 2: sethi hi(56), r8 # r8=temp 3: or r8, 8, r11 # r11=*a 4: or r0, 0, r10 # r10=4*i Loop: 5: ld [r10+r11],r8 6: add r9, r8, r9 7: add r10, 4, r9 8: subcc r10, 4*x-1,r0 9: ble loop or r0,0,r9 slh-> Depois de 1 ciclo Depois de 2 ciclos or r0,0,r9 slh-> sethi hi(56),r8 Depois de 3 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> Depois de 4 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> or r0,0,r10 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 slt-> Depois de 5 ciclos add r9,r8,r9 slt-> or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 Depois de 6 ciclos Depois de 7 ciclos add r9,r8,r9 slt-> add r10,4,r10 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 9: ble loop 10: or r0, 0, r0 # nop

(55)

O algoritmo FCFS executando:

for (sum=0, i=0; i<x;i++) {

sum=a[i] + sum; }

1: or r0, 0, r9 # r9=sum 2: sethi hi(56), r8 # r8=temp 3: or r8, 8, r11 # r11=*a 4: or r0, 0, r10 # r10=4*i Loop: 5: ld [r10+r11],r8 6: add r9, r8, r9 7: add r10, 4, r9 8: subcc r10, 4*x-1,r0 9: ble loop or r0,0,r9 slh-> Depois de 1 ciclo Depois de 2 ciclos or r0,0,r9 slh-> sethi hi(56),r8 Depois de 3 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> Depois de 4 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> or r0,0,r10 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 slt-> Depois de 5 ciclos add r9,r8,r9 slt-> or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 Depois de 6 ciclos Depois de 7 ciclos add r9,r8,r9 slt-> add r10,4,r10 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 Depois de 8 ciclos add r9,r8,r9 slt-> subcc r10,4*x-1,r0 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 add r10,4,r10 9: ble loop 10: or r0, 0, r0 # nop

(56)

O algoritmo FCFS executando:

for (sum=0, i=0; i<x;i++) {

sum=a[i] + sum; }

1: or r0, 0, r9 # r9=sum 2: sethi hi(56), r8 # r8=temp 3: or r8, 8, r11 # r11=*a 4: or r0, 0, r10 # r10=4*i Loop: 5: ld [r10+r11],r8 6: add r9, r8, r9 7: add r10, 4, r9 8: subcc r10, 4*x-1,r0 9: ble loop or r0,0,r9 slh-> Depois de 1 ciclo Depois de 2 ciclos or r0,0,r9 slh-> sethi hi(56),r8 Depois de 3 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> Depois de 4 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> or r0,0,r10 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 slt-> Depois de 5 ciclos add r9,r8,r9 slt-> or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 Depois de 6 ciclos Depois de 7 ciclos add r9,r8,r9 slt-> add r10,4,r10 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 Depois de 8 ciclos add r9,r8,r9 slt-> subcc r10,4*x-1,r0 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 add r10,4,r10 add r9,r8,r9 slt-> ble loop or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 add r10,4,r32 subcc r32,4*x-1,r0 or [r10+r11],r8 COPY r32,r10 Depois de 9 ciclos 9: ble loop 10: or r0, 0, r0 # nop

(57)

O algoritmo FCFS executando:

for (sum=0, i=0; i<x;i++) {

sum=a[i] + sum; }

1: or r0, 0, r9 # r9=sum 2: sethi hi(56), r8 # r8=temp 3: or r8, 8, r11 # r11=*a 4: or r0, 0, r10 # r10=4*i Loop: 5: ld [r10+r11],r8 6: add r9, r8, r9 7: add r10, 4, r9 8: subcc r10, 4*x-1,r0 9: ble loop or r0,0,r9 slh-> Depois de 1 ciclo Depois de 2 ciclos or r0,0,r9 slh-> sethi hi(56),r8 Depois de 3 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> Depois de 4 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> or r0,0,r10 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 slt-> Depois de 5 ciclos add r9,r8,r9 slt-> or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 Depois de 6 ciclos Depois de 7 ciclos add r9,r8,r9 slt-> add r10,4,r10 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 Depois de 8 ciclos add r9,r8,r9 slt-> subcc r10,4*x-1,r0 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 add r10,4,r10 add r9,r8,r9 slt-> ble loop or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 add r10,4,r32 subcc r32,4*x-1,r0 or [r10+r11],r8 COPY r32,r10 Depois de 9 ciclos Depois de 10 ciclos add r9,r8,r9 slt-> ble loop or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 add r10,4,r32 subcc r32,4*x-1,r0 or [r10+r11],r8 COPY r32,r10 9: ble loop 10: or r0, 0, r0 # nop

(58)

O algoritmo FCFS executando:

for (sum=0, i=0; i<x;i++) {

sum=a[i] + sum; }

1: or r0, 0, r9 # r9=sum 2: sethi hi(56), r8 # r8=temp 3: or r8, 8, r11 # r11=*a 4: or r0, 0, r10 # r10=4*i Loop: 5: ld [r10+r11],r8 6: add r9, r8, r9 7: add r10, 4, r9 8: subcc r10, 4*x-1,r0 9: ble loop or r0,0,r9 slh-> Depois de 1 ciclo Depois de 2 ciclos or r0,0,r9 slh-> sethi hi(56),r8 Depois de 3 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> Depois de 4 ciclos or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 slt-> or r0,0,r10 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 slt-> Depois de 5 ciclos add r9,r8,r9 slt-> or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 Depois de 6 ciclos Depois de 7 ciclos add r9,r8,r9 slt-> add r10,4,r10 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 Depois de 8 ciclos add r9,r8,r9 slt-> subcc r10,4*x-1,r0 or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 ld [r10+r11],r8 add r10,4,r10 add r9,r8,r9 slt-> ble loop or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 add r10,4,r32 subcc r32,4*x-1,r0 or [r10+r11],r8 COPY r32,r10 Depois de 9 ciclos Depois de 10 ciclos add r9,r8,r9 slt-> ble loop or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 add r10,4,r32 subcc r32,4*x-1,r0 or [r10+r11],r8 COPY r32,r10 ld [r10+r11],r8 add r9,r8,r9 slt-> ble loop or r0,0,r10 or r0,0,r9 slh-> sethi hi(56),r8 or r8,8,r11 add r10,4,r32 subcc r32,4*x-1,r0 or [r10+r11],r8 COPY r32,r10 Depois de 11 ciclos 9: ble loop 10: or r0, 0, r0 # nop

(59)

Envio de Instruções Longas para Cache

Não existe elemento livre, a lista de escalonamento é descarregada para o Cache VLIW, como um bloco, à taxa de 1 instrução longa por ciclo.

Três registradores slh, slt e olip são usados para descarregar. Todos os registradores são devolvidos ao pool.

Instrução que está chegando encabeça novo bloco. Operação simultânea. Não gera bolha na lista.

(60)

Instruções de Load/Store

São divididas e movidas pelo algoritmo sem restrições.

Endereços de dados são comparados com os de outras load/store. Registradores usados são comparados com os de outras instruções, incluindo load/store.

(61)

Memory Disambiguation

Instruções load/store executadas fora da seqüência original. Ocorre quando load lê de ou store escreve em posição de memória que está sendo escrita por store que deveria ser executado posteriormente.

Instruções load/store executadas fora da seqüência original. Ocorre quando load lê de ou store escreve em posição de memória que está sendo escrita por store que deveria ser executado posteriormente.

executado posteriormente.

Em máquinas VLIW é resolvido, geralmente, em tempo de compilação.

Na DTSVLIW, suporte de hardware extra foi adicionado para detecção e resolução em tempo de execução.

executado posteriormente.

Em máquinas VLIW é resolvido, geralmente, em tempo de compilação.

Na DTSVLIW, suporte de hardware extra foi adicionado para detecção e resolução em tempo de execução.

(62)

Memory Aliasing Detection

Suporte extra de hardware na máquina VLIW.

Campos extras são acrescentados nas instruções load/store Suporte extra de hardware na máquina VLIW.

Campos extras são acrescentados nas instruções load/store

order : recebe a ordem das inserções de load/store

cross bit :setado quando load/store é instalado em instrução

longa contendo store ou cópia de memória gerada por store

split.

Listas para armazenar endereços de load e de store.

order : recebe a ordem das inserções de load/store

cross bit :setado quando load/store é instalado em instrução

longa contendo store ou cópia de memória gerada por store

split.

(63)

Memory Aliasing Detection (load)

Instruções load têm seus endereços comparados com enderços de store em suas instruções longas e todos os endereços constantes na lista de store.

Instruções load têm seus endereços comparados com enderços de store em suas instruções longas e todos os endereços constantes na lista de store.

endereços constantes na lista de store.

Na coincidência, se order do load < order do store correspondente, é sinalizada exceção de aliasing. endereços constantes na lista de store.

Na coincidência, se order do load < order do store correspondente, é sinalizada exceção de aliasing.

(64)

Memory Aliasing Detection (store)

Instruções store têm seus endereços comparados com endereços de store e de load em suas instruções longas e todos os endereços de store e de load constantes na Instruções store têm seus endereços comparados com endereços de store e de load em suas instruções longas e todos os endereços de store e de load constantes na e todos os endereços de store e de load constantes na lista de store e de load.

Na coincidência, se order do store < order do load/store correspondente, é sinalizada exceção de aliasing.

e todos os endereços de store e de load constantes na lista de store e de load.

Na coincidência, se order do store < order do load/store correspondente, é sinalizada exceção de aliasing.

(65)

Instruções Multiciclo

Características adicionadas à lista de escalonamento: Instrução candidata e slot extras para cada elemento.

Duas instâncias são inseridas na lista de escalonamento, com referências cruzadas, evitando que instruções com dependências verdadeiras sejam escalonadas nos elementos delimitados pelas duas instâncias, afetados pela instrução multiciclo.

(66)

Instruções Multiciclo

Instância A

Instância B não sofre/provoca dependência de recurso e nem dependência de dados relativas às suas entradas.

Instância A não sofre/provoca dependência de dados relativas às suas saídas, sofre dependência de controle e, neste caso, a

Instância B

às suas saídas, sofre dependência de controle e, neste caso, a saída é renomeada e instância B é dividida.

Instâncias sobem juntas.

Se instância B sofre depêndência de saída ou antidependênica, ela é dividida e A é renomeada.

(67)

Exceções

Instruções split não devem sinalizar exeções até que a instrução cópia correspondente seja executada.

Para evitar, um bit de exceção é adicionado em cada registrador de Para evitar, um bit de exceção é adicionado em cada registrador de renomeação. Este bit é setado e propagado para o registrador de destino à cada leitura.

Quando instrução possui registrador de entrada com bit setado e registrador de destino é parte do estado, exceção é sinalizada.

(68)

Exceções

(mecanismo de tratamento)

CHECKPOINTING

Todos os registradores que constituem o estado da ISA são

salvos em registradores sombra no início da execução de cada bloco de instruções longas.

bloco de instruções longas.

Esquema 1: valores salvos em registradores sombra e após checkpoint, os valores são transferidos para a memória.

Esquema 2: valores sobrescritos no cache são salvos nos

registradores sombra. Em caso de exceção, os valores retornam ao cache.

(69)

Exceções

(mecanismo de tratamento)

Dados sobrescritos no cache de dados são salvos numa lista de recuperação de checkpoint de store (lrcs), que contém o

Store Instructions

endereço, o dado e o tipo do dado.

Esquema alternativo:

Dados são escritos em uma data store list que contém o endereço, o dado, o tipo do dado e campo order.

(70)

Exceções

(mecanismo de tratamento)

Detectada a exceção pela VLIW, Scheduler Engine entra no modo de recuperação da execução.

modo de recuperação da execução.

Registradores recebem valores armazenados nos registradores sombra, entradas da lista de recuperação de checkpoint de store são reescritas no cache, listas de load e de store são limpas.

(71)

Exceções

(mecanismo de tratamento)

Entrada no cache VLIW é invalidada.

Aliasing Exception

Entrada no cache VLIW é invalidada. Execução retorna no modo trace normal

(72)

Exceções

(mecanismo de tratamento)

Execução retorna no modo exceção até que a exceção se repita.

Outras Exceções

Neste modo, apenas o Processador Primário trabalha, após a exceção, sai do modo exceção.

(73)

Scheduler Engine Scheduler Unit I S Mu Mu Mu Mu

A máquina DTSVLIW

A máquina DTSVLIW

IC ProcessorPrimary EngineVLIW

Fecth Unit C A C H E F E WB F D WB E Fecth Unit PC Fecth Unit PC Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ] Fecth Unit PC [ I ]

(74)

AVALIAÇÃO

DE

DE

(75)
(76)

Maquina DTSVLIW factível

Parâmetros:

Bloco com 16 instruções longas com 8 instruções por instrução longa.

Máquina VLIW com largura de 12 unidades funcionais. Cache VLIW associativo de 192Kbyte.

(77)

compres gcc go ijpeg m88ksim perl vortex xlip H.Mean A.Mean Instruction per Cycle 2,07 1,33 1,31 2,77 2,56 2,17 1,92 1,98 1,89 2,01 Load Latency Cost 15,64% 8,16% 9,22% 20,47% 15,53% 31,67% 13,26% 27,32% 14,50% 17,66% VLIW Cache Cost 0,00% 33,27% 29,64% 0,00% 0,01% 0,00% 20,26% 1,31% - 10,56% Data Cache Cost 19,24% 3,39% 3,30% 1,38% 0,98% 0,18% 5,69% 3,58% 0,95% 4,72% Next LI Miss Cost 5,37% 2,23% 3,38% 0,03% 5,84% 5,49% 2,74% 6,72% 0,22% 3,97% Type F.U. Cost 0,00% 4,48% 4,34% 3,98% 1,96% 1,97% 1,51% 5,43% - 2,96% Instruction Cache Cost 0,01% 7,81% 4,92% 0,01% 0,23% 0,95% 5,17% 0,05% 0,02% 2,39% Aliasing Exceptions 0 4 39 0 1 0 1 0 - 5,63% VLIW Execution Cycles 96,43% 53,42% 60,47% 99,97% 98,47% 86,56% 73,58% 99,09% 79,19% 83,50% Valid Instr. per Block 25,18% 39,25% 35,15% 38,95% 36,44% 41,05% 44,96% 30,35% 35,35% 36,42%

(78)

compres gcc go ijpeg m88ksim perl vortex xlip H.Mean A.Mean Integer Ren. Reg. 33 49 44 24 38 33 39 28 34,32 36,00 Flag Ren. Reg. 17 20 17 15 18 21 18 17 17,70 17,88 Memory Ren. Reg. 14 14 8 7 11 8 15 8 9,78 10,63 Load List Size 10 15 16 7 10 11 12 10 10,72 11,38 Load List Size 10 15 16 7 10 11 12 10 10,72 11,38 Store List Size 32 15 32 5 13 12 23 14 13,24 18,25 Chckpnt Rec. St. L.S. 48 34 48 11 20 31 39 25 25,82 32,00

(79)

CONSIDERAÇÕES

FINAIS

(80)

DTSVLIW

DTSVLIW

Arquitetura simples e eficiente.

Arquitetura simples e eficiente.

Scheduler Unit

Scheduler Unit tem implementação comparável a de um

tem implementação comparável a de um

integer adder.

integer adder.

DTSVLIW

DTSVLIW

Arquitetura simples e eficiente.

Arquitetura simples e eficiente.

Scheduler Unit

Scheduler Unit tem implementação comparável a de um

tem implementação comparável a de um

integer adder.

integer adder.

O algoritmo FCFS é explorado eficientemente, exigindo

O algoritmo FCFS é explorado eficientemente, exigindo

bem menos recursos para atingir performance equivalente

bem menos recursos para atingir performance equivalente

à arquiteturas baseadas no mesmo conceito.

à arquiteturas baseadas no mesmo conceito.

Não “confia” na capacidade do compilador em explorar

Não “confia” na capacidade do compilador em explorar

ILP. O algoritmo consegue extrair mais paralelismo.

ILP. O algoritmo consegue extrair mais paralelismo.

O algoritmo FCFS é explorado eficientemente, exigindo

O algoritmo FCFS é explorado eficientemente, exigindo

bem menos recursos para atingir performance equivalente

bem menos recursos para atingir performance equivalente

à arquiteturas baseadas no mesmo conceito.

à arquiteturas baseadas no mesmo conceito.

Não “confia” na capacidade do compilador em explorar

Não “confia” na capacidade do compilador em explorar

ILP. O algoritmo consegue extrair mais paralelismo.

(81)

DTSVLIW

DTSVLIW

Supera o problema de compatibilidade de código objeto

Supera o problema de compatibilidade de código objeto

enfrentado por processadores VLIW com níveis diferentes

enfrentado por processadores VLIW com níveis diferentes

de paralelismo de hardware.

de paralelismo de hardware.

DTSVLIW

DTSVLIW

Supera o problema de compatibilidade de código objeto

Supera o problema de compatibilidade de código objeto

enfrentado por processadores VLIW com níveis diferentes

enfrentado por processadores VLIW com níveis diferentes

de paralelismo de hardware.

de paralelismo de hardware.

A

A Scheduler Engine

Scheduler Engine provê a compatibilidade de código fonte

provê a compatibilidade de código fonte

e a

e a VLIW Engine

VLIW Engine provê desempenho e simplicidade.

provê desempenho e simplicidade.

A

A Scheduler Engine

Scheduler Engine provê a compatibilidade de código fonte

provê a compatibilidade de código fonte

e a

(82)

DEBATES

DEBATES

(83)

FOI UM

PRAZER

ESTAR COM

VOCÊS.

VOCÊS.

MUITO

OBRIGADO

PELA

ATENÇÃO.

(84)

Referências

Documentos relacionados

Durante a instalação ou manutenção, para executar testes pode-se manter a chave DIP1 em 0, assim o sistema fará a supervisão dos endereços, mas não acusará

Como tem direta relação com o nível lógico-formal (adequação ao sistema jurídico), sugere-se no modelo de racionalidade legislativa deste artigo que se inclua naquele elemento

Foram abordados sete docentes graduados em Enfermagem que lecionam conteúdos sobre HIV/aids em Instituições de Ensino Superior na região metropolitana de São Paulo, sendo realizado

Depois de considerar a confidência, conteúdo, distribuição, e assuntos de oportunidade associadas com a distribuição de um relatório, um controlador pode, então,

Se você vai para o mundo da fantasia e não está consciente de que está lá, você está se alienando da realidade (fugindo da realidade), você não está no aqui e

• Os municípios provavelmente não utilizam a análise dos dados para orientar o planejamento de suas ações;. • Há grande potencialidade na análise dos micro dados do Sisvan

Todavia, nos substratos de ambos os solos sem adição de matéria orgânica (Figura 4 A e 5 A), constatou-se a presença do herbicida na maior profundidade da coluna

ESTABELECE OS VALORES RELATIVOS AO USO EVENTUAL DE ESPAÇOS FÍSICOS INTEGRANTES DO PATRIMÔNIO DA UNIVERSIDADE FEDERAL DE SANTA CATARINA OU SOB A SUA GUARDA, PARA