• Nenhum resultado encontrado

Publicações do PESC Memorização Dinâmica de Traces com Reuso de Valores de Instruções de Acesso à Memória

N/A
N/A
Protected

Academic year: 2021

Share "Publicações do PESC Memorização Dinâmica de Traces com Reuso de Valores de Instruções de Acesso à Memória"

Copied!
130
0
0

Texto

(1)

MEMORIZAÇÃO DINÂMICA DE TRACES COM REUSO DE VALORES DE INSTRUÇ~ES DE ACESSO A MEMÓRIA

Luiz Marcio Faria de Aquino Viana

TESE SUBMETLDA AO CORPO DOCENTE DA COORDENAÇÃO DOS PROGRAMAS DE PÓS-GRADUAÇÃO DE ENGENHARIA DA UNIVERSIDADE FEDERAL DO RIO DE JANEIRO COMO PARTE DOS REQUISITOS NECESSÁRIOS PARA A OBTENÇÃO DO GRAU DE MESTRE EM CIÊNCIAS EM ENGENHARIA DE SISTEMAS DE COMPUTAÇÃO.

I'

Aprovada por:

RIO DE JANEIRO, RJ

-

BRASIL MARçO DE 2002

(2)

VIANA, LUIZ MARCIO FARIA DE AQUINO Memorização Dinâmica de Traces com Reuso de Valores de Instruções de Acesso à Memória [Rio de Janeiro] 2002

XIT, 118 p. 29,7 cm (COPPE/UFRJ, MSc., Engenharia de Sistemas e Computação, 2002)

Tese

-

Universidade Federal do Rio de Janeiro, COPPE

1. Reuso Dinâmico de Traces 2. Arquitetura de Processador

(3)

A Mila, minha esposa, e aos meus filhos, Luiz Felipe e Maria Julia, por toda a alegria e força que me proporcionam.

(4)

AGRADECIMENTOS

Agredeço a Deus pela força e luz recebida durante o desenvolvimento deste trabalho e pela oportunidade que eu tive em ampliar o meu conhecimento. .

Aos meus orientadores, Eliseu Monteiro Chaves Filho e Felipe Maia Galvão França pelos valiosos conhecimentos recebidos e pela orientação dedicada e profissional que foi fundamental para o amadurecimento e finalização deste trabalho.

Agradeço em especial ao apoio recebido do amigo Amarildo Teodoro da Costa pelas diversas conversas e idéias que trocamos durante o desenvolvimento desta pesquisa e que foram fundamentais para a compreenção do mecanismo base deste trabalho.

A todos os companheiros de trabalho da COPPEISistemas que de forma direta ou indireta contribuiram com o desenvolvimento deste trabalho e em especial aos companheiros de turma Álvaro da Silva Ferreira, Magnos Martinelli, Élcio Pinecchi, Alexis Braga Kropotoff e Igor Briglia Habib de Almeida Alves pelo incentivo mútuo na conquista de nossos objetivos.

A minha esposa, Mila, e aos meus filhos, Luiz Felipe e Maria Julia, pelo apoio, carinho e compreenção recebidos.

Aos meus pais, José Luiz de Aquino Viana e Maria Cristina Faria de Aquino Viana, pelo apoio e constante incentivo recebidos durante toda a minha vida.

(5)

Resumo da Tese apresentada à COPPE/UFRJ como parte dos requisitos necessários para a obtenção do grau de Mestre em Ciências (M.Sc.)

MEMORIZAÇÃO DINÂMICA DE TRACES COM REUSO DE VALORES DE INSTRUÇ~ES DE ACESSO A MEMÓRIA

Luiz Marcio Faria de Aquino Viana

Orientadores: Eliseu Chaves Filho

Felipe Maia Galvão França.

Programa: Engenharia de Sistemas e Computação

No passado, com o objetivo de aumentar o desempenho dos processadores, as novas tecnologias focavam a otimização da velocidade dos processadores sem a devida avaliação da quantidade de trabalho redundante executado. Recentemente, novos mecanismos foram introduzidos com o intuito de prover desempenho através da redução da quantidade de trabalho redundante executado por um processador e, entre estes, as técnicas de reuso dinâmico de traces vem se destacando bastante. Este trabalho introduz o novo mecanismo de reuso dinâmico de traces denominado Dynamic Trace Memoization with Reuse of Memov Values, DTMm, que estende as funcionalidades do mecanismo original, DTM (Dynamic Trace Memoization), com a adição de reuso de valores de instruções de acesso à memória. Os experimentos realizados com o DTMm apresentaram um crescimento médio de 4.7% na aceleração sobre o mecanismo original e 7.9% sobre a arquitetura base para um benchmark composto por um subconjunto de programas do SPECint' 95.

(6)

Abstract of Thesis presented to COPPEIUFRJ as a partia1 fulfillrnent of the requenments for degree of Master of Science (M.Sc.)

DYNAMIC TRACE MEMOIZATION WITH REUSE OF MEMORY ACCESS INSTRUCTIONS' VALUES

Luiz Marcio Faria de Aquino Viana

Advisors: Eliseu Chaves Filho

Felipe Maia Galvão França.

Department: Engenharia de Sistemas e Computação

In the past, with the objective to improve the speed of processors, the new technologies were looking for optimizations in processors speed without taking profit fiom redundant work. Recently, new mecanisms were introduced with the intention to improve speed with the reduction in the quantities of redundant work, and dynamic trace reuse techniques have been introduced. This work introduce a new scheme for trace reuse named Dynamic Trace Memoization with Reuse of Memory Values, DTMm, which extend the funtionality of DTM (Dynamic Trace Memoization), by adding reuse of values of memory access instructions. Experiments done with DTMm shows a growth of 4.7% in speed over the original mecanism and 7.9% over the superscalar base architecture for a benchmark based on a subset of programs from SPECint '95.

(7)

Indice

1 Introdução

1.1 Motivações e Objetivos

Fundamentos e Trabalhos Correlatos

2.1 Localidade de Valores

2.2 Técnicas de Previsão de Valores

2.2.1 Implementação Típica de Previsão de Valores 2.2.2 Analisando Diferentes Tipos de Preditores 2.3 Reuso Dinâmico de Instruções Simples

2.3.1 Esquemas de Reuso Dinâmico de Instrugões 2.3.2 Comparando os Esquemas Sv, Sn e Sn+d 2.4 Reuso de Blocos Básicos

2.4.1 Implementação

2.4.2 Comparando o Mecanismo

3 Memorização Dinâmica de Traces

-

DTM

3.1 Terminologia Básica

3.2 Estrutura das Tabelas de Memorização 3.3 Funcionamento do Mecanismo

3.4 Implementação do DTM 3.4.1 Construção de Traces 3.4.2 Reuso de Traces

3.4.3 Detalhes de Implementação

(8)

4 Adicionando Instruções de Acesso à Memória ao DTM

4.1 Condições Iniciais

4.2 Modificações Implementadas no DTM 4.3 Implementação do DTM com Memória

4.3.1 Implementação com Invalidação de Valores 4.3.2 Solução com Antecipação de Valores 4.4 Detalhes de Implementação

5 O Mecanismo DTMm

5.1 Descrição do Mecanismo 5.2 Detalhes de Implementação

6 Análise dos Resultados

6.1 Métricas Utilizadas

6.2 Distribuição das Instruções nos Programas 6.3 Resultados da Implementação do DTM no Sparc 6.4 Resultados das Diferentes Implementações do DTM

com Reuso de Instruções de Memória

6.4.1 Analisando os Resultados do DTMinv

6.4.2 Analisando os Resultados do DTMupd e DTMm 6.4.3 Comparando os Resultados de DTMupd e DTMm 6.5 Resultados Obtidos com o Reuso de Cadeias de Instruções

e Traces Dependentes em um mesmo Ciclo

7 Concliasões e Trabalhos Futuros

Apêndice A O Ambiente de Simulação

-

SuperSIM

A. 1 Descrição da Arquitetura Base A. 1.1 Tipos de Operações A. 1.2 Formato das Instruções A. 1.3 Janela de Registradores

(9)

A.2 Arquitetura do Simulador SuperSIM

A.2.1 Modelo de Dados do Simulador A.2.2 Recursos Implementados

A.3 Apresentação do Simulador SuperSIM A.4 Limitações do Simulador

(10)

Lista de Figuras

Localidade de valores presentes nos programas de benchmark

7

Diagrama de blocos do mecanismo de previsão de valores 1 O Modelos de contexto finito de profundidade de 1-4 valores 12 Taxa de acerto nas previsões por tipo de preditor 14

Estrutura genérica do reuse buffer 15

Estrutura das entradas do reuse buffer 16

Register source table armazena índices do reme buffer 20 Estrutura básica de entrada do reuse buffer 2 1 Percentual de reuso de instruções com o esquema

Sv

22

2.9b Percentual de reuso de instruções com o esquema

Sn

22 2 . 9 ~ Percentual de reuso de instruções com o esquema

Snid

23 2.10 Estrutura básica de uma entrada do block histovy buffer 26

Formato das entradas na MEMOTABLE-G 3 2

Formato das entradas na MEMO-TABLE-T 3 3

Buffers temporários e mapas de contexto de entrada e saída 35 Exemplo de construçào dinâmica de traces com DTM 37

Diagrama de blocos de um processador superescalar típico

com DTM 39

Trecho de código de programa para o

Sparc v7

43

Ilustração da janela de registradores 44

Comparando o DTM com outras técnicas de reuso 46 Comparação entre o reuso explorado pelo DTM e

Snid

48 Entradas da MEMO-TABLE-G com suporte à loadlstore 52 Entradas da MEMO-TABLE-'I' com suporte à loadlstore 52 Fluxo de dados das instruções ou traces reusados contendo stores 53

(11)

Fluxo de dados das instruções ou traces reusados conténdo loads Fluxo de dados das instruções ou traces reusados conténdo valores de loads não reusados

Diagrama do DTM com reuso de valores de memória Modificações nas entradas da MEMOTABLE-G Modificações nas entradas da M E M O T A B L E T Estrutura das entradas na MEMO-TABLE-L

Diagrama de blocos de um processador superescalar com DTMm Frequência dos diferentes tipos de instruções nos programas Comparação entre a aceleração de DTMmips e DTMsparc Reuso explorado por DTMmips e DTMsparc

Motivos de finalização dos traces com DTMsparc

Frequência dos traces por número de desvios no DTMsparc Frequência dos traces por número de desvios no DTMmips Aceleração obtida com as implementações do DTM no Sparc v7

Reuso explorado com as implementações do DTM no Sparc v7 Motivos de finalização dos traces com DTMinv no Sparc v7

Percentual dos traces servidos por loads reusados

Percentual dos loads reusados por traces e instruções no DTMupd Aceleração com implementação sem verificação de dependência Convenção de armazenamento de dados na memória

Registrador de estado do processador Formato das instruções

Ilustração do mecanismo de janela de registradores

Pipeline superescalar implementado pelo simulador SuperSIM

(12)

Lista de Tabelas

Distribuição das instruções executadas no SPECint '92 4

Percentual de reuso por tipo de instrução 24

Speedups para diferentes configurações de máquinas 29 Ações tomadas no processo de construção de traces 4 1 Ações tomadas em cada etapa do processo de reuso de traces 42 Parâmetros de entrada usados na execução do SPECint '95 68 Parâmetros de configuração da arquitetura dos simuladores 69 Parâmetros de configuração do DTM e extensões 7 1 Frequência dos diferentes tipos.de instruções nos programas 73 Motivos de finalização dos traces com DTMsparê 77 Motivos de finalização dos traces não formados no DTMsparc 7 8 Frequência dos traces com loads e stores pelo tamanho 82 Motivos de finalização dos traces com DTMinv no Sparc v7 83

Instruções de acesso a memória 93

Instruções atitméticas e lógicas da arquitetura 94

Distribuição dos grupos de desvios 96

Instruçòes que manipulam os registradores especiais 99 Instruções de ponto flutuante da arquitetura 99 Formato da instrução em função do valor de op 101 Instruções determinadas pelo valor de op2 101

(13)

Capítulo 1

Introdução

Os recentes avanços obtidos na produção de circuitos integrados proporcionaram novos rumos na pesquisa e no desenvolvimento de mecanismos de hardware capazes de estender o poder de processamento dos computadores atuais. Assim, constantemente nos deparamos com novos mecanismos que quebram paradigrnas no campo da arquitetura de computadores.

No passado, por falta de tecnologia apropriada para implementa-los, tais mecanismos eram frequentemente abandonados ou demoravam muito tempo até que a industria os adotassem. Porém, com a evolução do processo de manufatura 'de hardware crescendo a taxas extremas, os novos mecanismos estão sendo absorvidos de forma cada vez mais rápida pela industria.

Os esforços contínuos no desenvolvimento de tecnologias que aumentam o desempenho dos processadores foram durante muito tempo dedicados exclusivamente a diminuição do ciclo de relógio e ao desenvolvimento de novas técnicas de exploração do paralelismo no nível de hardware. Porém quando falamos de desempenho de um processador nos referimos ii sua capacidade de realizar uma determinada tarefa em um determinado tempo, e quando nos esforçamos em prover desempenho a um processador, desconsiderando o trabalho necessário ao cumprimento de uma tarefa, estamos deixando de avaliar a quantidade de trabalho redundante produzido pelo processador e que poderia ser evitado economizando tempo de processamento.

(14)

Pela equação de desempenho [15], apresentada a seguir (Equação 1.1), temos que o desempenho de um processador em realizar uma tarefa pode ser definido por:

CPUtime = IC x CPI x T

Onde, IC é o número total de instruções executadas,

CPI é o número médio de ciclos por instrução, e T é o tempo médio de um ciclo.

Equação 1.1: Equação de desempenho de um processador.

Analisando a equação de desempenho, Equação 1.1, observamos que pode-se melhorar o desempenho de um processador reduzindo o número de instruções necessárias ao cumprimento de uma determinada tarefa e para isto, precisamos de mecanismos que identifiquem e eliminem o trabalho redundante existente em um programa.

Atualmente novos mecanismos estão surgindo com o intuito de prover tal capacidade aos processadores modernos e o conceito de localidade de valores se tornou chave destes desenvolvimentos.

O conceito de localidade de valores foi inicialmente introduzido por [20] e expressa a tendência que os valores produzidos em uma unidade de armazenamento tem de se repetirem ao longo da execução de um programa. O motivo pelo qual isso ocorre se deve ao fato dos programas reais serem construídos para resolverem problemas genéricos e não para um conjunto limitado de entradas.

Existem vários mecanismos que exploram o conceito de localidade de valores e foram modelados a partir deste principio, porém existem apenas duas vertentes de pesquisa apoiadas nele. A primeira consiste de mecanismos de previsão de valores que procuram antecipar o resultado das instruções usando como referência o histórico de execuções anteriores, permitindo a execução especulativa de instruções com dependência

(15)

de dados verdadeira. Entre os mecanismos que seguem esta vertente podemos citar last value prediction [20,21], stride prediction [I01 e context based prediction [31]. A segunda vertente procura eliminar a execução redundante através do reuso de instruções ou trechos de códigos dos programas, e como referência a esta linha de pesquisa podemos citar: dynamic instruction reuse [33], block reuse [l6,l7] e trace reuse [3,8,13].

Entre as linhas de pesquisa que exploram o conceito de localidade de valores os mecanismos que se baseiam no reuso de traces de instruções vem se destacando bastante pelos resultados obtidos, pelas possibilidades de desenvolvimento e pelos estudos que podem ser estendidos a partir deles.

1 . i MOTIVAÇÕES E OBJETIVOS

O objetivo deste trabalho é estender a funcionalidade de uma das técnicas de trace reuse denominada DTM [8], adicionando instruções de acesso a memória ao conjunto de instruções válidas do mecanismo e possibilitando desta forma que instruções que acessam memória possam fazer parte dos traces de instruqões.

O motivo que levou ao desenvolvimento desta pesquisa, foi o fato do mecanismo

DTM ser uma técnica nova e que produz ganhos significativos de desempenho. Porém, esta técnica não reusa valores de instruções de acesso a memória e conforme podemos ver na tabela (Tabela 1.1), este grupo de instruções representam 34% das instruções executadas por um programa e, além disso, conforme [31], instruções de acesso a memória possuem grande localidade de valores, sendo que aproximadamente 30% delas poderiam ser reusadas ao longo da execução de um programa. Assim a inclusão de instruções de acesso a memória ao DTM pode levar a ganhos consideráveis de desempenho.

(16)

Executadas

Tabela 1.1: Distribuição das instruções executadas no SPECint '92.

Para o desenvolvimento desta pesquisa foi construído um simulador de uma arquitetura superescalar executando o conjunto de instruções do processador SPARC v7,

sendo que este simulador foi modelado segundo os conceitos de orientação a objetos onde os seus componentes podem ser estendidos, modificados ou removidos de forma bastante simples proporcionando grande flexibilidade a ferramenta.

Esta pesquisa também contribuiu para a avaliação dos resultados obtidos com o

DTM em uma arquitetura diferente da originalmente estudada e usando outro conjunto de instruções. Além disso, nesta pesquisa é introduzido um novo esquema de formação e reuso de traces denominado DTMm, que estende o modelo originalmente proposto em [8] com a inclusão de instruções de acesso à memória. Nos experimentos realizados com um subconjunto de programas do benchmark SPECint '95, o DTMm obteve aceleração média de 9.9% e média harmônica de 5.4% sobre a arquitetura base contra um resultado de 3.2% de média e 2.5% de média harmônica obtido pelo mecanismo original.

No capítulo a seguir, apresentaremos alguns conceitos iniciais e os mecanismos de previsão de valores e reuso de instruções que formam a base de conhecimento usada no desenvolvimento do DTMm. O Capítulo 3 apresenta o mecanismo original, DTM, e

(17)

alguns aspectos de sua implementação na arquitetura do simulador. No capitul'o seguinte,

Capitulo 4, este mecanismo é estendido com a inclusão de instruções de acesso a memória, e no Capítulo 5 é apresentado o DTMm, que é uma variação do mecanismo DTM original que separa o reuso de instruções de leitura de memória do mecanismo de reuso de traces para reduzir o custo de implementação do mecanismo. Em seguida,

Capítulo 6, são apresentadas as análises dos resultados obtidos nos experimentos

(18)

Capítulo 2

Fundamentos e Trabalhos Correlatos

Neste capítulo será apresentado o conceito de localidade de valores além de alguns mecanismos que exploram este conceito com a finalidade de eliminar ou atenuar os problemas provocados pela dependência de dados.

2.1

LOCALIDADE DE VALORES

Em [20] foi introduzido o conceito de localidade de valores. Este conceito expressa a tendência que um valor já visto possui de se repetir em uma unidade de annazenamento ao longo da execução de um programa.

As medidas realizadas em [20], demonstraram que os resultados produzidos por operações de leitura de memória exibem 50% de localidade de valor para um histórico que armazena o último resultado produzido por estas operações, e exibem 80% de localidade de valor para um histórico que armazena os dezesseis últimos resultados obtidos pela execução das instruções.

Os gráficos da Figura 2.1 a seguir, apresentam os resultados obtidos em [20] para um conjunto de programas dos benchmarks de inteiro SPECint '92, SPECint '95, algumas aplicações de processamento de imagem e utilitários de uso geral, além do uso de quatro programas do benchmark de ponto flutuante do SPECfp '92, executados por simuladores das platafoimas Alpha AXP e PowerPC.

(19)

Alpha AXP

1

O ú i ü m wlor 116 últimos valores

Figura 2.la: Localidade de valores encontrada no simulador Alpha AXP.

PowerPC

O Último wlor 1 16 úitims valores

Figura 2.lb: Localidade de valores encontrada no sin~ulador PowerPC.

O motivo pelo qual a localidade de valor existe, se deve a natureza genérica dos programas reais que são construídos para resolverem problemas para conjuntos de entradas distintos e desta forma estes programas são construídos tendo como base loops e sub-rotinas que freqtientemente manipulam os mesmos dados de entrada.

Por exemplo, programas que possuem poucas variações nos conjuntos de entradas, tais como processadores de textos e planilhas eletrônicas executam com freqüência processamento sobre os mesmos dados. Também a utilização de constantes de

(20)

dados que frequentemente são armazenadas em memória e usadas na fase inicial de uma computação favorecem a localidade de valor.

Mecanismos de predição de desvios exploram o conceito de localidade de valores [l4,18,22,36], porém em [20], este conceito foi introduzido em um experimento com valores que endereçam 32 e 64 bits de dados, isto é, para um domínio de valores muito maior, confirmando a previsibilidade de valores de dados. A partir deste conceito vários mecanismos foram criados com o intuito de aumentar o desempenho dos processadores e entre eles podemos citar os mecanismos de previsão de valores e os mecanismos de reuso de valores que serão apresentados neste capitulo.

I

As técnicas de previsão de valores procuram antecipar o resultado de uma instrução antes da sua execução atenuando os efeitos da dependência de dados. Estes mecanismos se baseiam em uma arquitetura onde uma tabela de classificação de instruções denominada classzfication table, CT, é usada para identificar as instruções que possuem melhores condições de terem seus resultados previstos corretamente, além de identificar qual o tipo de preditor mais adequado para a previsão do resultado da instrução, quando são assumidos múltiplos preditores.

Estas técnicas por serem de natureza especulativa, exigem que o resultado previsto para uma instrução, seja validado após a execução dela. Assim se o resultado for previsto incorretamente o processador sofrerá penalidades, pois terá que executar as instruções novamente usando o valor correto. Deste modo, o uso de uma tabela de classificação das instruções permite selecionar as instruções com maior chance de acerto na previsão minimizando as penalidades impostas.

As tabelas de classificação são frequentemente construidas usando métodos de predição do tipo contador saturado para avaliar as chances de previsão correta dos valores das instruções. Após determinar se o resultado de uma instrução pode ou não ser previsto

(21)

corretamente uma segunda tabela denominada value prediction table, VPT, é acessada com o intuito de obter o valor previsto.

Após o acesso a VPT, o resultado previsto fica disponível para as instruções seguintes que requerem este valor, e a instrução entra em execução para que o resultado possa ser obtido e posteriormente comparado com o resultado previsto.. Caso haja discordância as instruções executadas especulativamente são escalonadas novamente para execução com o valor correto.

Em [20] a tabela de predição de valores é denominada load valueprediction table, LVPT, e neste mecanismo uma unidade adicional é usada na validação dos resultados previstos. Esta unidade recebe o nome de constant verzfication unit ou CVU e serve para verificação de instruções de leitura da memória que possuem elevada taxa de acerto nas previsões e são classificadas como constantes pela tabela de classificação. A CVU opera como uma memória totalmente associativa que mantém coerência com os valores correspondentes na memória cache e desta forma o seu emprego evita que um acesso a memória seja efetuado para obtenção do resultado de operações classificadas como constantes.

2.2.1

IMPLEMENTAÇAO

TÍPICA

DE

PREVISÃO

DE

VALORES

A Figura 2.2, apresenta o diagrama de blocos de um mecanismo de previsão de valores típico [21]. Nesta figura observamos que as tabelas de classificação, CT, e de valores previstos, VPT, são acessadas no estágio de busca usando o endereço da instrução como referência. Para possibilitar que múltiplos resultados de uma mesma instrução estejam presentes na VPT, um índice pode ser concatenado ao endereço da instrução e usado como referência em uma tabela associativa por conjunto. Neste caso o uso de um preditor que possa identificar eficientemente o valor mais provável entre os valores disponíveis nesta tabela se torna fundamental para o mecanismo.

(22)

No momento do despacho da instrução, o resultado da tabela de classificação é consultado e se ele indicar que a instrução é previsível, o valor previsto será antecipado as instruções seguintes.

Após a execução da instrução, um estágio de validação adicionado pelo i~iecanismo é usado pai-a verificação do resultado previsto e se o resultado. obtido pela execução da instrução não corresponder ao valor previsto as instruções seguintes são escalonadas novamente.

Figura 2.2: Diagrama de blocos do mecanismo de previsão de valores.

Comp

2.2.2 ANALISANDO DIFERENTES TIPOS DE PREDITORES

I t

<- , sFJa>*.

As técnicas de previsão de valores são bastante sensíveis à qualidade da tabela de

classifica~ào c: ao tipo de preditos usado. Podemos classificar a seqiiência de valores produzidos por uma instrução como constante, seqüencial ou não-seqüencial [31], conforme apresentado na listagem 2.1.

(23)

Constante 2 , 2 , 2 , 2

,...,

2 Seqüencial 1, 3, 5, 7 , ..., 2n+l Não-sequencial 1,15, 20, 14> ...> ? Listagem 2.1 : Tipos de valores produzidos por uma instrução.

Sendo que as seqüências de valores sequencial e nao-sequencial ainda podem ter ou não repetição conforme apresentado na listagem 2.2 a seguir.

Sequencial com repetição l y 3> 5, l y 3> 5, ...

Não-sequencial com repetição 1,15,20,14, 1, 15,20,14

,...

1

Listagem 2.2: Tipos de valores com repetições produzidos por uma instrução.

~Poniando como base as classificações dos tipos de seqüências de dados que podem ser produzidas por uma instrução, podemos definir dois tipos básicos de preditores: Preditor computacional que efetua previsões com base na avaliação de expressões sobre valores previamente obtidos e preditor com base no contexto dos dados que aprende como a seqüência de dados se comporta e procura reproduzir os valores futuros com base nas seqüências anteriores.

Entre os preditores do tipo computacional podemos destacar Last Value Prediction de [20,21], e Stride Prediction apresentado em [10]. Já entre os preditores com base no contexto da seqüência de dados temos o Context Based Prediction introduzido en1 [3 11.

Last Value Prediction

Este

S

o modelo tradicional de preditor inicialmente apresentado em [20] para previsão de valores de operações de leitura da memória, e foi em seguida estendido para todas as instruções em [21]. Neste modelo e armazenado o valor do último resultado produzido por uma instrução, e se na ocorrência da instrução ela estiver classificada como previsível este valor é usado como valor previsto.

(24)

Stride Prediction

Este modelo de preditor foi inicialmente introduzido por [10] e efetua a coniputação do valor previsto somando o último valor retomado pela instrução com a diferença entre ele e o penúltimo valor produzido. Para efeito de implementação são armazenados o valor atual e o próximo valor da instrução evitando a necessidade de computação deste valor no momento da utilização.

Este tipo de preditor consegue prever com eficiência instruções que retomam valores constantes ou que possuem comportamento repetitivo constante, como ocorre com o preditor anterior, porém este método prevê também sequências de valores como as produzidas por contadores.

Context Based Prediction

O modelo de preditor com base no contexto das sequências de dados, procura aprender o comportamento dos valores produzidos por uma instrução aplicando um modelo de contexto finito ou FCM [3 11. A figura a seguir, Figura 2.3, apresenta alguns iuodelos de contexto finito com prof~indidade variando de um a quatro valores de seqüência. 8equericia:aaa b c a a a b c a a a tabela I b C 6 2 aa ab k tabela 2 ca tabela 3 a b c aaa aab a k k a caa tabela 4

(25)

Pata a sequência de valores apresentado na Figura 2.3 existe grande chance do próximo valor da sequência ser o valor a se usarmos como base a tabela 1, pois a freqüência deste valor é maior dentro da tabela. Para um histórico com os dois últimos valores produzidos pela instrução se o valor atual é a a chance do próximo valor ser a é

maior do que a chance deste valor ser b ou c, conforme apresenta a tabela 2.

Na tabela 3, temos um histórico de três, onde dado que os dois últimos valores foram a e a o próximo valor da sequência será provavelmente a, e na tabela 4 temos um histórico de quatro onde os três últimos resultados foram a, a e a, assim o próximo valor deverá ser b, pois a incidência deste valor após a ocorrência de três valores a é maior.

Conforme podemos observar, este modelo procura identificar dentro do contexto do programa qual o comportamento da sequência de valores gerada pela instrução, sendo este modelo bastante eficiente na previsão de resultados constantes, de seqüências repetitivas finitas e de estruturas periódicas não seqüenciais. Porém a quantidade de valores que precisam ser armazenados para formar um histórico de resultados que apóie eficientemente este modelo inibe o seu uso.

Experimentos conduzidos em [3 11 usando o benchmark de inteiros SPECint '95 demonstram ser este o modelo mais eficiente de predição de valores. Os resultados obtidos nestes experimentos estão reproduzidos no gráfico da Figura 2.4, onde L representa last value prediction, S significa stride prediction e, F C M l , FCM2 e FCM3 são preditores do tipo context based prediction com histórico de uma, duas e três execugões respectivamente.

(26)

I

cornpress rn88k perl xiisp

Figura 2.4: Taxa de acerto nas previsões por tipo de preditor.

Os experimentos conduzidos em [31], também mostraram que o uso de um modelo híbrido composto por Stride Prediction e Context Based Prediction, pode proporcionar um eficiente desempenho a um custo menor de implementação do que usando apenas o mecanismo com base no contexto da seqüência de dados.

Nas próximas seções serão apresentados alguns mecanismos que usam técnicas de reuso de valores. Estes mecanismos formam a base de implementação do DTMm.

\

Em [33] foi introduzida à técnica de reuso dinâmico de instrução, que diferente das técnicas de previsão, exploram o conceito de localidade de valores através do reuso dos resultados das operações.

Os experimentos realizados em [33] apresentaram três técnicas de reuso dinâmico de instruções denominadas Sv, Sn e Sn+d. Estes três esquemas tomam como base uma estrutura comum foimada por uma tabela que armazena os resultados produzidos por instruções já finalizadas e reusa estes valores quando as instruções correspondentes são

(27)

novariiente executadas com os mesmos valores de entrada. A esta estrutura comum foi dado o nome de reuse buffer, RB.

A Figura 2.5 apresenta a estrutura do reuse buffer que é uma tabela usada para armazenamento dos resultados das instruções. Esta tabela é indexada pelo endereço da instrução e dispõem de um mecanismo capaz de efetuar invalidações seletivas das entradas na ocorrência de determinados eventos.

Reuse Buffer

Events Invalidate

Reuse tesi

+

*

Reused Inst. Figura 2.5: Estrutura genérica do reuse buffer.

Cada entrada na tabela do reuse buffer, Figura 2.6, é formada por um campo tag de identificação cujo valor é obtido a partir do endereço da instrução, pelos campos operandl e operand2 responsáveis por armazenar informações dos operandos de entrada, por um campo res que armazena o resultado da instrução, e pelo endereço de acesso à memória das instruções de leitura armazenado no campo addr, além de bits de sinalização usados para indicar se o valor armazenado no campo res é ou não válido para reuso.

(28)

[a) esquema Sv

tag

Figura 2.6: Estrutura das entradas do reuse buffer. tag

Em 1331, três esquemas de reuso dinâmico de instruções foram apresentados, o primeiro Sv efetua o reuso de instruções tomando como base os valores dos operandos de entrada, o segundo esquema denominado Sn processa o reuso de instruções através do registro dos operandos fonte dos dados e não mais com base nos valores de entrada. Enquanto o terceiro esquema, Sn+d, estende os anteriores adicionando a capacidade de reconhecimento de sequencias de instruções dependentes.

[b) esquema Sn reg name

operanj i

Esquema Sv

[c) esquema Sn+d

Q esquema Sv é a implementação imediata do reuso de instruções, onde os

reg w m e operanj 2

operanj i

valores dos operandos de entradas são adicionados as entradas correspondentes no reuse

t

buffer e usados na verificação do reuso.

src injox

Conforme é apresentado na Figura 2.6a, cada entrada do reuse buffer armazena em operandl e operand2 o valor dos operandos de entrada das instruções, e um bit de sinalização, mem valid, que indica se o resultado pode ou não ser usado por uma instrução de leitura da memória.

addr reg wme operanj 2 injex res res valid addr reg w m a m e m valid res res valid m e m valid

(29)

Quando uma instrução vai ser despachada é feita a comparação dos valores dos operandos de entrada com os respectivos valores armazenados na entrada do reuse buffer e se os valores forem iguais ocorrerá o reuso. Se a instrução for de leitura de memória além da verificação dos valores dos operandos de entrada será necessário consultar também o bit mem valid para confirmar se o resultado da operação de memória pode ou não ser reusado. Caso o resultado da operação não possa ser reusado será reusado apenas o endereço do acesso a memória.

Se no momento do despacho os valores dos operandos de entrada da instrução não estiverem disponíveis o teste de reuso não será efetuado e a instrução será executada normalmente. Instruções de escrita na memória fazem reuso apenas do endereço de acesso a memória e não do resultado a ser armazenado.

Invalidações das entradas do reuse buffer ocorrem quando uma operação de escrita a memória é encontrada. Neste ponto as entradas do reme buffer são consultadas a procura de entradas contendo instruções de leitura que lêem do mesmo endereço de memória que está sendo modificado, e nas entradas encontradas o sinalizador mem valid

é anulado invalidando os resultados das operações de leitura.

Observe que este esquema invalida de forma associativa apenas instruções de leitura da memória, além disso, este esquema pode ser implementado com o uso de duas tabelas, uma para reuso do resultado das instruções e do endereço de acesso a memória das operações de leitura e escrita, e outra para reuso do resultado de operações de leitura da memória. Está organização evita o uso de um mecanismo de invalidação seletiva no reuse buffer mantendo este recurso em uma segunda tabela que pode possuir menos entradas.

Esquema Sn

Neste esquema cada entrada do reuse buffer, Figura 2.6b, armazena os identificadores dos operandos fontes da instrução e não os valores deles. Assim, o teste

(30)

de reuso tem como base a verificação de que os registradores fontes não sofreram modificações desde a última execução da instrução. Para monitorar e identificar as entradas com resultados válidos para reuso foi adicionado um campo result valid que sinaliza se o valor armazenado é valido.

Quando uma instrução vai ser despachada é verificado se existe alguma entrada no reuse buffer que corresponde a uma instância de execução anterior. Se existe uma instância correspondente, o campo result valid é consultado para verificar se o valor armazenado na tabela é valido para reuso.

Para instruções de acesso à memória o mecanismo consulta o campo result valid para veriíicar se o endereço da operação de acesso a memória pode ser reusado. Para operações de leitura da memória é analisado também o campo mem valid para verificar se o valor da instrução pode ou não ser reusado.

Neste esquema as invalidações ocorrem por dois motivos. Primeiro, quando uma operaçào modifica o valor contido em um registrador usado como operando fonte de alguma entrada do reuse buffer, neste caso o campo result valid é invalidado, e quando uma instrução de escrita modifica o valor armazenado em um endereço de memória referenciado por alguma instrução presente na tabela de reuso, onde o campo mem valid

é invalidado.

Esquema Sn+d

O esquema Sn+d é similar ao esquema Sn e usa os identificadores dos operandos fontes e não os valores para verificação de reuso, porém este esquema procura identificar a relação de dependência entre as instruções para evitar a invalidação excessiva das entradas do reuse buffer, comum no esquema anterior, Sn.

Neste esquema as entradas do reuse buffer possuem estrutura similar à encontrada no esquema Sn, porém cada operando de entrada possui também um índice, src index,

(31)

que aponta para a instrução fonte do dado usado pelo registrador e que está localizada no reuse buffer, como pode ser visto na Figura 2 . 6 ~ . A adição do campo src index fornece um método eficiente para verificar se instruções dependentes podem ser reusadas em um mesmo ciclo.

O esquema Sv não implementa um mecanismo que identifica dependências e na presença de instruções dependentes este mecanismo não pode verificar a redundância destas instruções em um mesmo ciclo. O esquema Sn efetua invalidações na presença de instruções dependentes, pois o arrnazenamento das instruções para reuso leva em consideração os identificadores dos registradores fontes e não seus valores. Deste modo, qualquer instrução executada posteriormente e que escreve nos operandos fontes invalidam as entradas correspondentes no reuse buffer.

No esquema Sn+d o reuso de instruções dependentes presentes na janela de despacho em um mesmo ciclo é resolvido com o uso de ponteiros para as entradas correspondentes das instruções fontes de seus operandos que também estão no reuse buffer. Deste modo, se os registradores fontes da instrução dependente forem modificados por alguma instrução posterior, esta instrução não será invalidada, pois os valores de seus operandos são produzidos por uma instrução presente no reme buffer, e se as instruções fontes forem reusadas a instrução dependente será também reusada.

Para auxiliar na identificação de dependência entre instruções e no teste de reuso de cadeias de dependência em um mesmo ciclo foi adicionado ao mecanismo base uma tabela riusiliar denominada register source table, Figura 2.7, que possui uma entrada correspondente a cada registrador da arquitetura que armazena nestas entradas o índice da instrução presente no reuse buffer e que modificou por último o registrador.

(32)

Register Source Table Reuse Buffer

Figura 2.7: Register source table armazena índices do reuse buffer.

A verificação de reuso no esquema Sn+d é similar ao teste de reuso realizado pelo esquema Sn, onde no momento do despacho o endereço da instrução é usado na obtenção da entrada correspondente no reuse buffer. Existindo uma entrada correspondente é realizada a verificação do sinalizador res valid, que indica se o resultado da instrução é válido para reuso, instruções de leitura e escrita verificam este sinalizador para reusarem os endereços de acesso a memória e instruções de leitura reusam o resultado da operação quando mem valid também estiver ativo. Instruções dependentes precisam ainda verificar se as últimas modificações realizadas nos registradores de entrada foram feitas pelo reuso das instruções fontes da dependência, e isto é feito consultando a register source table, RST, para verificar se as últimas instruções que atualizaram os registradores fontes são as mesmas instruções referenciadas pelos campos de índice dos operandos de entrada da instrução.

Invalidações ocorrem quando instruções de escrita à memória modificam o mesmo endereço de memória de uma instrução de leitura contida no reuse buffer, quando os registradores de entrada de instruções independentes são modificados, e quando a instrução fonte de uma cadeia de instruções dependentes é removida do reuse buffer.

Na Figura 2.8 observamos um exemplo de funcionamento do mecanismo Sn+d, onde as instruções 100,104 e 108 já foram executadas e inseridas no reuse buffer.

(33)

Figura 2.8: Estrutura básica de uma entrada do result buffer. RST R6 Table 100. R 1 i- 0 104. R2 < - R 1

+ 4

108, R3 < - R 1 + R3 " ' R31

IIq

11

1

1 2

1

120, R 1 < - 4

R

100. R 1 =:- 0 1 0 104. R2 .:- R 1

+

4

Quando a instrução 120 é executada o valor de R 1 é modificado e a entrada correspondente a ele na tabela RST recebe o valor 1 3 que representa a posição desta instrução no reuse buffer. Além disso, todas as entradas do reuse buffer que usam este registrador e não possuem dependência são invalidadas. Desta forma as entradas 11 e 12 da tabela de reuso, dependentes do resultado da entrada 10, não serão invalidadas.

108, R3 < - R 1

+

R2 13.

Se em seguida a instrução 100 é executada novamente o registrador R1 será modificado e a entrada correspondente a ele na tabela RST receberá novamente o valor 10. Deste modo quando a instrução 104 for acessada e a entrada correspondente no reuse buffer obtida, a análise da instrução 104 constatará que o valor do registrador fonte R 1 desta instrução é dependente da instrução localizada na posição 10 do reuse buffer e comparando este valor com o valor presente na tabela RST, que identifica a última instrução presente do reuse buffer que modificou

o

registrador R I , teremos que os valores são iguais e, portanto a instrução 104 também será reusada. De forma similar, a instrução 108 também será reusada, pois os seus operandos fontes dependem das instruções reusadas 100 e 104 [33].

R 1 <- 4

I

I

2.3.2 COMPARANDO OS ESQUEMAS Sv, Sn, Sn+d

As Figuras 2.9a, 2.9b e 2 . 9 ~ apresentam os percentuais de reuso de instruções obtidos pelos esquemas Sv, Sn e Sn+d usando um reuse buffer com 32, 128 e 1024 entradas, na execução de um benchmark composto por cinco programas do SPECint '92 (gcc, compress, eqntott, espresso e xlisp), cinco programas do SPECint '95 (go,

(34)

mSSksim, vortex, ijpeg e perl) e mais dois programas de processamento intensivo de

operações com inteiros (Yacr2 e Mpeg).

Esquema Sv

Figura 2.9a: Percentual de reuso de instruções com o esquema Sv.

i

Esquema Sn

(35)

I

Esquema Sn+d

Figura 2 . 9 ~ : Percentual de reuso de instruções com o esquema Sn+d.

Conforme podemos observar todos os mecanismos apresentaram um resultado significativo no reuso de instruções com taxas de até 76% para o esquema Sv e de até 59% para o esquema Sn+d. Porém, o esquema Sv não efetua verificações de dependências entre as instruções no momento do despacho e, portanto os dados reportados em [33] representam o potencial deste mecanismo e não uma implementação prática.

Deste modo, entre os mecanismos de implementação prática, Sn e Sn+d, o esquema Sn+d apresentou melhor percentual de reuso de instruções, devido à exploração do reuso de cadeias de dependências que reduziu a taxa de invalidações das instruções contidas no reuse bufler e aumentou a granularidade do mecanismo.

Outro importante resultado obtido em [33] diz respeito à contribuição que cada tipo de instrução traz ao mecanismo de reuso. A Tabela 2.1 apresenta o percentual de reuso por tipo de instrução para um reuse buffer com 1024 entradas.

(36)

C

Tabela 2.1: Percentual de reuso por tipo de instrução.

Na Tabela 2.1, podemos observar que operações de leitura da memória representam 11.9% do total de instruções reusadas no esquema Sn+d e 21.2% no esquema Sv, mostrando que existe ainda um grande potencial de reuso a ser explorado. Além do reuso do valor de retomo das instruções de leitura da memória, o reuso do cálculo de endereçamento também representa um grande potencial de reuso a ser explorado.

Vantagens

Os mecanismos baseados em técnicas de previsão de valores introduzem custos adicionais para verificação e validação dos dados, além disso, as instruções ainda são executadas para verificação do resultado previsto utilizando os recursos do processador. Enquanto o uso de técnicas de reuso de valores possibilitam a antecipação dos resultados das instruções redundantes sem que haja necessidade de executá-las, minimizando a utilização de recursos do processador.

Outra vantagem destas técnicas é que não existem execuções especulativas com base nos valores retomados pelo reuso e, portanto não existem penalidades impostas a estes mecanismos.

(37)

Desvan tageiis

No esquema Sn+d. as instruções pertencentes a uma cadeia de dependências só serão reusadas no mesmo ciclo se todas as instruções estiverem contidas na janela de despacho, e, além disso, para manter a relação de dependência este esquema precisa conter todas as instruções pertencentes a uma cadeia de dependência dentro do reuse huffer. sendo que se uma instrução fonte da cadeia de dependência for invalidada todas as instruções seguintes serão invalidadas.

Devido

A

política de invalidação, os mecanismos Sn e Sn+d não possuem habilidades de manter várias instâncias de uma mesma instrução no reuse buffer.

Também nos esquemas apresentados, as instruções são inseridas no reuse buffer assim que são finalizadas, e isto torna o mecanismo bastante sensível a política de substituição implementada.

Nesta seção apresentamos um mecanismo que explora a localidade de valores pelo reuso dinâmico de instruções. Na próxima seção veremos um novo mecanismo que estende o conceito de reuso de valores ao nível de blocos básicos, aumentando a granularidade das técnicas de reuso.

2.4 REUSO DE BLOCOS BÁSICOS

Experimentos conduzidos em [16] demonstram que os valores de entrada e saída de blocos básicos apresentam considerável nível de localidade de valores. Além disso, estes experimentos constataram que para a totalidade dos programas analisados 90% dos blocos básicos mantiveram o número de registradores de entrada inferior a quatro registradores e o número de registradores de saída inferior a cinco, e que as quantidades de instruções de leitura e escrita na memória são respectivamente menores que quatro e cinco instruções deste tipo por bloco.

(38)

Estes resultados favorecem a exploração de técnicas de previsão e reuso de valores com mecanismos de maior granularidade e em [16] foi introduzido o mecanismo de block reme, que estende o reuso de valores ao nível de blocos básicos.

O mecanismo proposto em [16], consiste de uma tabela denominada block history buffer, ou BHB, que é responsável por armazenar as instâncias de execução dos blocos básicos.

Cada entrada da BHB consiste de um tag de identificação da entrada, formado pelo endereço da primeira instrução presente no bloco básico. Além dos contextos de entrada e saída do bloco, dos campos correspondentes as instruções de entrada e saída de memória, e de um ponteiro para o endereço da primeira instrução do próximo bloco básico, Figura 2.10.

Figura 2.10: Estrutura básica de uma entrada do block history buffer.

Os campos que armazenam o contexto de entrada e saída, representados por reg- in e reg-out na figura, são formados pelos registradores e seus valores de dados, enquanto os campos mem-in e mem-out armazenam as operações de leitura e escrita a memória respectivamente e são compostos por um tag que identifica a instrução de memória através do próprio endereço da instrução, de um sinalizador, fulllempty, que

(39)

indica se a entrada é valida, além do endereço de acesso à memória e do valor a ser lido ou armazenado.

Reuso de Blocos Básicos

Quando o endereço de inicio de um bloco básico é obtido, a BHB é consultada a procura das instâncias deste bloco que satisfaçam os valores de entrada. Assim que as instâncias são obtidas, os valores dos registradores de entrada são comparados com os

\ r ~ l o ~ ~ b J I I ~ I J L C I I ~ U ~ , 3lL'lil disso sc existcrn en~radas válidas presentes em meni-in a

memória cache é acessada e o valor armazenado também é comparado com o valor da cache para determinar o reuso do bloco. Se os valores comparados não corresponderem ou se o endereço de acesso à memória de uma das instruções em mem-in não está presente na cache, então o bloco não é reusado e as instruções são despachadas normalmente.

Quando uma instância de iam bloco básico é reusada, os registradores de saída correspondentes são atualizados e as instruções pertencentes ao bloco são marcadas como completadas e são enviadas ao reorder buffer para finalização como qualquer outra instrução, porém as unidades funcionais não são utilizadas. Além disso, o endereço do próximo bloco básico, next-block, é usado para modificar o contador de programa, redirecionando-o para a primeira instrução do próximo bloco básico. Se o bloco contém uma instrução de escrita na memória, isto é, se existe alguma entrada válida em mem- out, o valor é armazenado na cache quando esta for finalizada.

Reconhecimento Dinâmico de Blocos Básicos

A identificação e construção dinâmica dos blocos básicos são realizadas da seguinte forma. Qualquer instrução que segue uma instrução de desvio é considerada começo de um novo bloco básico e uma instrução de desvio marca o fim do bloco básico. Se uma instrução de desvio redireciona o programa para uma instrução interna a um

(40)

bloco básico, uma nova entrada é criada na BHB começando no endereço da instrução alvo do desvio.

O reconhecimento dos registradores de entrada e saída de um bloco básico é realizado com o auxílio de duas mascaras de bits que identificam os registradores de entrada e de saída dinamicamente. Quando uma instrução é executada todos os bits da mascara de entrada correspondentes aos registradores fontes usados pela instrução e que não estão habilitados na mascara de bits de saída são ativados. Os bits da mascara de saída são habilitados para os registradores destino da instrução.

Para minimizar o número de registradores pertencentes ao contexto de saída de um bloco básico este mecanismo usa recursos de compilação para identificar dead outputs, isto é, valores produzidos pelo bloco básico e que não serão mais necessários.

2.4.2

COMPARANDO O MECANISMO

O mecanismo de block reuse aumenta a granularidade do mecanismo de reuso apresentado por [33], porém as seqüências de instruções são limitadas ao'tamanho do bloco básico e a limitação no tamanho médio dos blocos básicos, encontrados em aplicações de inteiros, podem minimizar os ganhos com este mecanismo.

Porém blocos básicos com muitas instruções tendem a ter contextos de entrada grandes e que não podem ser mantidos inteiramente em uma única entrada. Além disso, blocos básicos grandes podem conter instruções pouco redundantes que reduzem a freqüência de reuso dele.

A técnica de reuso de blocos básicos adiciona instruções de acesso à memória diretamente nas entradas da

BHB,

desta forma o contexto de entrada, que precisa ser avaliado para reuso do bloco, se toma muito grande prejudicando os resultados obtidos. Além disso, a avaliação dos valores de memória é realizada cornparando-os com os

(41)

valores correspondentes contidos na cache, o que induz o aumento no número de portas de leitura da memória cache para implementação deste mecanismo.

A Tabela 2.2 a seguir apresenta os resultados obtidos em [16] com a implementação de diferentes configurações do mecanismo de reuso de blocos básicos usando o simulador Simplescalar To01 Set [I], executando um subconjunto de programas de hei7cFimark.s foimado por três programas do SPECint '92, alvinn, ear e wordcount, e seis programas do SPECint '95, compress, go, ijpeg, li, m88ksim e perl.

Tabela 2.2: Speedups para diferentes configurações de máquinas.

Ilimitado r-inz4,r-out=4 m-in=3,m-out=2 alvinn compress ear 90 ijpeg 1 i m88ksim perl wordcount

Em [17], a verificação de que a frequência de reuso de blocos poderia ser mais bem explorada com a redução do contexto de entrada fez surgir um novo mecanismo

r-in=4, r-out=5 m-ini4,m-outs2 1.04 1.06 1. O1 1.08 1. o1 1.09 1.09 1.12 1.04

denominado sub-block reuse, que procura reusar grupos de instruções com menor

r-in=5,r-oute6 m-in=4,m-out=3

granularidade porém com maior frequência de reuso. 1.05 1.06 1.01 1.09 1.08 1.09 1.09 1.14 1.04

Neste capítulo foi apresentado o conceito de localidade de valor que é o conceito base de todos os mecanismos de previsão e reuso de dados, além de alguns dos principais

1 . 0 5 1 . 0 6 1.01 1 . 0 9 1.08 1.10 1.10 1.16 1.04

mecanismos que exploram tal conceito. No próximo capítulo iniciaremos a exploração da técnica de reuso de traces de instruções denominada DTM que utiliza dois níveis de

1.15 1.07 1. O1 1.18 1.11 1.14 1.21 1.37 1.04

tabelas de reuso para formar traces com melhor relação entre número de instruções e freqüência de reuso.

(42)

Capítulo 3

Memorização Dinâmica de

Traces

-

DTM

Experimentos conduzidos em [3] introduziram o DTM, Dynamic Trace Memoization, uma técnica que estende o reuso de instruções para além das fronteiras dos blocos básicos. Este mecanismo utiliza duas tabelas de memorização na identificação dinâmica de seqüências de instruções redundantes.

O uso de duas tabelas de memorização fornece ao mecanismo dois níveis de reuso, o primeiro nível é usado no reuso de instruções simples e na construção de traces de instruções redundantes, enquanto o outro é responsável pelo reuso de traces de instruções. Os dois níveis de reuso também fornecem ao mecanismo uma 'volatilidade menor que a encontrada em outras técnicas semelhantes. Assim, quando uma instrução é

executada pela primeira vez ela é inserida na tabela de memorização global,

MEMO - TABLE-G. e somente as instâncias das instruções que estão presentes nesta tabela e que são reusadas irão constituir traces de instrugões redundantes que são adicionados a tabela de memorização de traces, MEMO-TABLET.

Este tipo de implementação também fornece uma pré-qualificação das instruções que compõem um trace, porém não é um indicador de qualidade do trace formado, pois para qualificar um trace precisamos levar em consideração o número de instruções que estão contidas no trace e que pertencem ao caminho crítico de execução do programa, e a freqüência de reuso do trace durante a execução do programa.

(43)

Para auxiliar a compreensão deste mecanismo, na próxima seção apresentaremos as terminologias básicas introduzidas por esta técnica.

3.1

TERMINOLOGIA BÁSICA

A técnica de reuso de traces introduziu novos termos [3,8] que são usados na descrição do DTM, apresentado neste capítulo, e na descrição das variações deste mecanismo. que incluem instruções de acesso

i

memória e serão apresentadas nos capítulos seguintes.

trace de instruções

- Um trace de instruções, ou simplesmente trace,

é uma seqüência dinâmica de instruções de um programa.

trace redundante - Um trace é considerado redundante se todas as instruções pertencentes a ele forem redundantes.

instruções válidas - O DTM trabalha com um subconjunto das instruções do processador e as instruções que pertencem a este subconjunto são denominadas instruções válidas. Neste subconjunto não estão incluídas instruções de acesso à

memória, chamadas ao sistema operacional e instruções de ponto flutuante. Embora instruqòes de acesso a memória não pertençam ao conjunto de instruções válidas o cálculo do endereço de acesso a memória é reusado pelo mecanismo.

contexto de entrada

-

Conjunto formado pelos registradores e respectivos valores de entrada das instruções presentes no trace e que são fornecidos por instruções externas a ele.

contexto de saída - Conjunto formado pelos registradores e respectivos valores de saída das instruções presentes no trace.

(44)

3.2

ESTRUTURA DAS TABELAS DE

MEMORIZAÇAO

A Figura 3.1 apresenta o formato das entradas da MEMO-TABLE-G. As

entradas desta tabela possuem como chave o endereço da instrução armazenado no campo pc, os campos svl e sv2 representam os valores dos operandos fontes das instruções e o campo reslnpc compartilha o armazenamento do endereço alvo de instruções de desvio com o resultado de instruções lógicas e aritméticas.

Alem destes campos são incluídos também três sinalizadores usados para atualização do preditor de desvios. O sinalizador jmp indica uma instrução de desvio que usa o valor contido no campo reslnpc como endereço alvo do desvio, brc indica instrução de desvio condicional e btaken sinaliza se o desvio condicional é tomado ou não tomado, Figura 3.1.

P C

]v

b rc btaken s v l sv2 res/npc

pc - endereço da instruçao jrnp - sinalizador de instrução de desvio incondicional brc - sinalizador de instrução de desvio condicional btaken - sinalizador de desvio tomado ou nao-tomado s v l -valor do operando fonte 1 çv2 - valor do operando fonte 2

reslnpc - resultado do oparacao/destino do desvio

Figura 3.1: Formato das entradas na MEMO

-

TABLE-G.

A Figura 3.2 apresenta o formato das entradas da MEMO-TABLE-T. Esta tabela é acessada pelo endereço da primeira instrução do trace e o campo de identificação pc armazena o valor do índice de acesso.

(45)

pc - endereço da instruçao npc - endereço da instrução seguinte ao trace

bmask - sinalizadores de instniçóes de desvios btaken - sinalizadores de desvios tornadohão tomado

IC,, IC,,

.

. .

, IC,- contexto de entrada do trace

reg - endereço do registrador regval -valor do registrador OCo,OC,,

.

.

.

, OCN- contexto de saida do trace

reg - endereço do registrador regval -valor do registrador

PC nPc bmask btaken C C

.

.

. , C OC,,OC,,

.

. .

, CCN

Figura 3.2: Formato das entradas na MEMO-TABLE-T. 30b

Além do campo de identificação, cada entrada possui um campo que armazena o endereço da instrução seguinte ao trace, npc, um conjunto de campos que armazenam os contextos de entrada, ICN, e são constituídos pelos pares registradorlvalor, por um conjunto de pares registradorlvalor que armazenam os contextos de saída, OCM, e dois mapas de bits, bmask e btaken, que indicam a presença de instruções de desvios e informam para cada desvio se ele foi ou não tomado [3,8].

3.3 FUNCIONAMENTO DO MECANISMO

regval

'

reg

32b 5b 32b

30b

Quando uma instrução é acessada, é verificado se ela pertence ao conjunto de instruçòes válidas do DTM. Instruções que não são válidas são marcadas como não-redundante e seguem o caminho normal de execução.

Se uma instrução válida do DTM é acessada, as tabelas de memorização são consultadas para verificar se existe alguma instância de execução desta instrução ou se existe algum trace iniciando por ela. Se nenhuma instância de execução da instrução ou

troce for encontrado nas tabelas de reuso, a instrução é marcada como não-redundante

(46)

e segue o caminho normal de execução. Entretanto, se alguma instância de execução da instrução for encontrada na MEMO-TABLE-G a instrução é marcada como redundante e as instâncias correspondentes são selecionadas.

No momento do despacho, se a instrução está marcada como redundante, os operandos fontes são acessados e seus valores comparados com os respectivos valores de entrada das instâncias selecionadas. Se estes valores forem iguais, a instrução é identificada como redundante e a instância correspondente reusada. Quando uma instrução é reusada os registradores destino são atualizados e a instrução é enviada diretamente ao buffer de reordenação. Porém, se os valores dos operandos de entrada não coincidirem com os valores dos operandos correspondentes nas instâncias selecionadas, a instrução é marcada como não-redundante e segue o caminho normal de execução. Instruções cujos operandos de entrada não estão disponíveis durante o teste de reuso, seguem o caminho normal de execução sendo marcadas como não-redundante.

Após a finalização da instrução, se ela pertence ao conjunto de instruqões válidas do DTM e foi marcada como não-redundante, ela é inserida na MEMO-TABLE-G. Se a instruções foi marcada como redundante, ela é usada na construção de novos traces, e um buffer temporário com a mesma estrutura das entradas da MEMO-TABLE-T é usado para armazenar o trace em formação [3,8].

Quando uma instrução marcada como não-redundante, pela falta de operandos prontos na verificação do reuso, é finalizada. É realizada a comparação entre os valores dos operandos de entrada da instrução, obtidos após a execução, com os respectivos valores dos operandos das instâncias selecionadas, e se estes valores forem iguais a instrução é identificada como redundante, e incluída no trace em formação comforme apresentado em [8].

Para possibilitar que um trace seja finalizado e que no mesmo ciclo um novo trace comece a ser construído, o DTM usa dois buffers temporários [8], BirffeyT#l e

(47)

Buffer - T#2, que são chaveados quando um trace é finalizado e inserido na MEMO-TABLE-T, conforme apresentado na Figura 3.3.

R I R1 R2 R31

Figura 3.3: Buffers temporários e mapas de contextos de entrada e saída. . . .

, , o

Quando uma instrução redundante é inserida no buffer temporário, o campo npc

é modificado e passa a apontar para a instrução seguinte a ela no fluxo de execução. Além disso, os contextos de entrada e saída do trace e os sinalizadores de instruções de desvio são atualizados. Se a instrução inicia um novo trace o endereço da instrução é

usado como índice para a MEMO-TABLET e o campo pc é modificado.

mapa de c~ntexto de entrada

mapa de wntexto de saida

As identificações do contexto de entrada e saída são realizadas com o auxílio de dois mapas de bits, Figura 3.3. Quando uma instrução redundante vai ser adicionada a um trace em formação, o mapa de bits do contexto de saída é consultado para verificar se os valores de alguns dos operandos fontes da instrução são fornecidos por alguma instnição interna ao trace, e estando o bit correspondente a um destes registradores ativo, significa que o valor usado por este operando foi produzido por uma instrução interna ao trace e portanto, tal registrador não faz parte do contexto de entrada. Entretanto para os operandos fontes que não estão presentes no mapa de bits do contexto de saída é realizada a consulta ao mapa de bits do contexto de entrada e os registradores que não estiverem marcados são adicionados junto com os respectivos valores ao contexto de

Referências

Documentos relacionados

CAPÍTULO V – CONSIDERAÇÕES FINAIS Esta pesquisa teve como objetivo a construção e a validação de dois jogos didáticos: “Trinca Genética” e “Dominogêneo”, para

Devido a importância da HPIE para o cavalo atleta e as dificuldades naturais para o diagnóstico da HPIE, que compromete não só a saúde mas também a performance dos atletas,

CHROUSOS, 2002, com menor atuação em infecções crônicas pela Burkholderia mallei, concluindose que o período do dia para a coleta de material não interfere na resposta sorológica

Diversas fontes de carbono são empregadas no cultivo em bioflocos, açúcares, amidos, álcoois e fibras, assim, o objetivo deste trabalho foi avaliar os efeitos das fontes de

O farelo de algodão, caroço de algodão e a ureia podem ser utilizadas como alternativas ao farelo de soja, na alimentação de cabras leiteiras, com média de produção de 2kg de

Tabela 10:Taxas de infiltração de água, coeficiente de escoamento superficial C, taxas de desagregação do solo em entressulcos Di e perdas de solo PS obtidas sob as condições

Ao optar por uma história centrada nos traumas de uma relação entre pai e filho, foi impossível não pensar em Carta ao pai, de Franz Kafka. De novo, aqui, não quis margear a

Crescimento em área basal m2 ha-1 dos fustes das espécies lenhosas adultas levantadas em área de caatinga, entre os anos de 2011 e 2013, Floresta- PE.. Em que: Bf = Área basal