• Nenhum resultado encontrado

Uma ferramenta protótipo para síntese de software para sistemas embutidos a partir de SystemC

N/A
N/A
Protected

Academic year: 2021

Share "Uma ferramenta protótipo para síntese de software para sistemas embutidos a partir de SystemC"

Copied!
145
0
0

Texto

(1)

Uma Ferramenta Prot´

otipo para S´ıntese de Software

para Sistemas Embutidos a partir de SystemC

(2)

Uma Ferramenta Prot´

otipo para S´ıntese de Software

para Sistemas Embutidos a partir de SystemC

Roberto Hartke Neto

Autor

Luiz Cl´

audio Villar dos Santos

Orientador

Lu´ıs Fernando Friedrich

Jos´

e Mazzuco Jr.

Banca examinadora

Palavras-chave

Sistemas Embutidos

S´ıntese de Software

SystemC

(3)

Resumo

Abstract

1

Introdu¸

ao

p. 8

1.1

Sistemas Embutidos

. . . .

p. 8

1.2

Requisitos de Sistemas Embutidos . . . .

p. 8

1.3

Contexto do trabalho . . . .

p. 10

1.4

Caracter´ısticas e Funcionalidades de SystemC . . . .

p. 10

2

Projeto da Representa¸

ao

p. 12

2.1

Linguagem de Montagem Como Representa¸cao Intermedi´

aria . . . .

p. 12

2.1.1

Dependˆ

encias de dados . . . .

p. 12

2.1.2

Dependˆ

encias de nome . . . .

p. 13

2.2

Grafos Como Representa¸cao Intermedi´

aria . . . .

p. 14

2.2.1

Grafo de fluxo de dados

. . . .

p. 14

2.3

Um modelo unificado para s´ıntese de hardware e software . . . .

p. 15

2.3.1

Um modelo de comportamento baseado em grafos . . . .

p. 16

2.4

ecnicas de otimiza¸c˜

ao . . . .

p. 16

2.4.1

Propaga¸c˜

ao de constantes . . . .

p. 16

2.4.2

Propaga¸c˜

ao de vari´

aveis . . . .

p. 17

2.4.3

Elimina¸c˜

ao de subexpress˜

oes comuns . . . .

p. 17

2.4.4

Elimina¸c˜

ao de c´

odigo morto . . . .

p. 18

(4)

3.1

Um prot´

otipo para o Fluxo de S´ıntese de Software . . . .

p. 21

3.1.1

Restri¸c˜

oes . . . .

p. 21

3.1.1.1

Subconjunto de SystemC

. . . .

p. 21

3.1.1.2

Otimiza¸c˜

oes . . . .

p. 24

3.1.1.3

Gera¸c˜

ao de c´

odigo . . . .

p. 24

3.1.1.4

Simulador da arquitetura MIPS . . . .

p. 24

4

Implementa¸

ao

p. 25

4.1

Pacote IOO . . . .

p. 25

4.2

Compilador . . . .

p. 26

4.3

Otimizador

. . . .

p. 27

4.4

Gerador de c´

odigo . . . .

p. 28

5

Valida¸

ao do Prot´

otipo

p. 31

5.1

Valida¸c˜

ao do Modelo da Arquitetura Alvo . . . .

p. 31

5.1.1

MIPS Cross-Toolchain . . . .

p. 32

5.1.2

Experimento . . . .

p. 32

5.2

Valida¸c˜

ao do Prot´

otipo de S´ıntese de Software . . . .

p. 32

5.2.1

Experimento . . . .

p. 33

5.2.2

Impacto das Otimiza¸c˜

oes . . . .

p. 33

6

Conclus˜

oes e Perspectivas

p. 35

6.1

Trabalhos futuros . . . .

p. 35

6.2

Conclus˜

oes finais . . . .

p. 36

(5)

Anexo A -- Ferramentas Auxiliares Implementadas

p. 38

A.1 Grafo para XML . . . .

p. 38

Anexo B -- Vis˜

ao geral da arquitetura MIPS e sua linguagem de

mon-tagem

p. 40

B.1 Processador . . . .

p. 40

B.2 Conjunto de instru¸c˜

oes . . . .

p. 40

B.3 Estrutura de um programa . . . .

p. 42

B.4 Chamadas de fun¸c˜

ao e retorno . . . .

p. 42

B.5 Chamadas de fun¸c˜

ao e a pilha . . . .

p. 42

B.5.1

Stack e frame pointer . . . .

p. 42

B.5.2

Salvar e restaurar o contexto . . . .

p. 43

B.6 Memory spilling . . . .

p. 43

Anexo C -- Ferramentas utilizadas

p. 45

C.1 ANTLR . . . .

p. 45

C.2 ArchC . . . .

p. 45

Anexo D -- Defini¸

oes de grafos

p. 46

D.1 Grafos polares . . . .

p. 46

D.2 Colora¸c˜

ao de grafos . . . .

p. 46

D.3 Grafo de intervalo . . . .

p. 46

Anexo E -- C´

odigo fonte

p. 47

E.1 Pacote IOO com suporte a hierarquia . . . .

p. 47

E.2 Compilador . . . .

p. 47

E.3 A¸c˜

oes de gera¸c˜

ao . . . .

p. 62

(6)
(7)

O objetivo deste trabalho ´

e tra¸car um modelo unificado para s´ıntese de software para

sistemas embutidos. O projeto ´

e especificado em SystemC, uma linguagem unificada que

descreve tanto o software quanto o hardware, que vem se tornando um novo padr˜

ao na ´

area

de desenvolvimento de sistemas embutidos. Este trabalho prop˜

oe um fluxo de s´ıntese de

software que usa grafos de fluxo como representa¸c˜

ao intermedi´

aria. Como grafos tˆ

em uma

base matem´

atica s´

olida, muitas otimiza¸c˜

oes de sistema podem ser feitas com algoritmos

bem conhecidos baseados em grafos.

Este trabalho tamb´

em mostra como c´

odigo de montagem pode ser gerado a partir da

representa¸c˜

ao baseada em grafos, traduzido para c´

odigo de m´

aquina e finalmente

execu-tado.

Palavras-chave: SystemC, grafos de fluxo, linguagem de montagem, ArchC, s´ıntese de

software.

(8)

The goal of this work is to pave the way to an unified model for embedded software

synthesis. The system is specified with SystemC, an unifying language describing both

hardware and software, which is becoming a new standard in the field of embedded system

design. This work proposes a software synthesis flow that uses flow graphs as

interme-diate representation. Since graphs have a solid mathematical background, many system

optimizations can be cast into well-known graph-based algorithms.

This work also shows how assembly code can be generated from the graph-based

representation, then translated into machine code and finally executed.

(9)

1

Introdu¸

ao

1.1

Sistemas Embutidos

Antes de tudo, o que seria um sistema embutido? Em uma defini¸c˜

ao superficial,

´

e qualquer dispositivo que inclui um computador program´

avel mas n˜

ao ´

e direcionado

para ser um computador de prop´

osito geral [10]. Ent˜

ao, um computador pessoal n˜

ao ´

e

um sistema embutido, mas um telefone ou microondas com um microprocessador ´

e um

sistema computacional embutido.

1.2

Requisitos de Sistemas Embutidos

Requisitos s˜

ao uma descri¸c˜

ao das necessidades ou dos desejos para um produto. O

objetivo b´

asico dos requisitos ´

e identificar e documentar o que ´

e realmente necess´

ario,

em uma forma que comunica claramente essa informa¸c˜

ao ao cliente e aos membros da

equipe de desenvolvimento. O desafio ´

e definir os requisitos de maneira n˜

ao-amb´ıgua, de

modo que os riscos sejam identificados e n˜

ao aconte¸cam surpresas quando o produto for

finalmente liberado [6].

A separa¸c˜

ao da an´

alise de requisitos da especifica¸c˜

ao do sistema ´

e geralmente

ne-cess´

aria por causa da grande lacuna entre o que os clientes podem descrever sobre o

sistema que eles querem e o que os arquitetos precisam para desenvolver o sistema.

Cli-entes de sistemas embutidos geralmente n˜

ao s˜

ao projetistas de sistemas embutidos. O

entendimento deles sobre o sistema ´

e baseado nas intera¸c˜

oes do usu´

ario com o sistema.

Eles podem ter expectativas irreais sobre o que pode ser feito com o seu or¸camento; e

tamb´

em expressar suas vontades em uma linguagem muito diferente do jarg˜

ao usado pelos

arquitetos do sistema. Capturar um conjunto consistente de requisitos e ent˜

ao transform´

a-los em uma especifica¸c˜

ao mais formal ´

e uma maneira estruturada de gerenciar o processo

de tradu¸c˜

ao da linguagem do cliente para a linguagem dos projetistas.

(10)

suficiente. Requisitos n˜

ao funcionais t´ıpicos incluem:

• Consumo de energia: energia, ´e claro, ´e importante em sistemas alimentados por

bateria e tamb´

em importante em outras aplica¸c˜

oes. Energia pode ser especificada

nos requisitos como tempo de dura¸c˜

ao da bateria — o cliente n˜

ao ser´

a capaz de

descrever coisas como voltagem.

• Custo: o custo do produto ou pre¸co de venda ´e quase sempre uma considera¸c˜

ao

importante. Os custos tˆ

em dois maiores componentes: a manufatura, que inclui os

componentes e sua montagem; e a engenharia, que incluem custos com pessoal e

outros custos do desenvolvimento.

• Desempenho: a velocidade do sistema ´e freq¨

uentemente a maior considera¸c˜

ao para

a usabilidade do sistema e para o seu custo final.

• Tamanho e peso: os aspectos f´ısicos do sistema final podem variar muito dependendo

da aplica¸c˜

ao. Um sistema para controle industrial para uma linha de montagem

pode ser desenhado para ajustar-se em uma prateleira com tamanho padr˜

ao e sem

limite de peso. J´

a um dispositivo de m˜

ao tipicamente tem requisitos de tamanho e

peso que podem se espalhar por todo o projeto do sistema.

Programas para sistemas embutidos s˜

ao em muitas maneiras mais restritos que os

programas feitos para computadores de uso geral. Funcionalidades s˜

ao importantes em

ambos, mas aplica¸c˜

oes embutidas enfrentam obst´

aculos diferentes. Por outro lado,

siste-mas computacionais embutidos tˆ

em que fornecer funcionalidades sofisticadas:

• Algoritmos complexos: as opera¸c˜

oes executadas pelo microprocessador podem ser

muito sofisticadas. Por exemplo, o microprocessador que controla o motor de um

autom´

ovel precisa executar complicadas fun¸c˜

oes de filtragem para otimizar o

desem-penho do carro enquanto precisa minimizar a polui¸c˜

ao e consumo de combust´ıvel.

• Interface com usu´

ario: microprocessadores s˜

ao freq¨

uentemente usados para controlar

interfaces com o usu´

ario que podem incluir m´

ultiplos menus e muitas op¸c˜

oes.

Para tornar as coisas mais dif´ıceis, opera¸c˜

oes computacionais `

as vezes apresentam

restri¸c˜

oes:

(11)

• Mem´

oria dispon´ıvel: em sistemas embutidos a quantidade de mem´

oria dispon´ıvel

´

e muitas vezes menor do que a de um computador de uso geral. As aplica¸c˜

oes

constru´ıdas para estes sistemas tˆ

em que levar em considera¸c˜

ao esta restri¸c˜

ao.

• Tempo real: muitas aplica¸c˜

oes embutidas precisam executar em tempo real — se o

dado n˜

ao estiver dispon´ıvel at´

e um determinado prazo, o sistema cai. Em alguns

casos, a falha de n˜

ao cumprir o prazo ´

e insegura e pode pˆ

or em risco vidas. Em

outros casos, o n˜

ao cumprimento do prazo n˜

ao cria problemas de seguran¸ca, mas

gera clientes insatisfeitos.

1.3

Contexto do trabalho

A abordagem predominante para o projeto de um sistema digital no n´ıvel de

arquite-tura ´

e descrevˆ

e-lo atrav´

es de uma linguagem de descri¸c˜

ao de hardware. Tal descri¸c˜

ao, al´

em

de servir como documenta¸c˜

ao, permite a simula¸c˜

ao da arquitetura do sistema e a s´ıntese

autom´

atica do circuito l´

ogico que implementa a arquitetura descrita. As linguagens de

descri¸c˜

ao de hardware mais populares atualmente s˜

ao VHDL e Verilog.

A ind´

ustria de EDA (Electronic Design Automation) continua reunindo esfor¸cos para

um movimento coletivo de desenvolvimento em n´ıveis mais altos de abstra¸c˜

ao do que o

n´ıvel de transferˆ

encia de registradores (Register Transfer Level ou RTL). ´

E necess´

ario uma

´

unica linguagem comum e funda¸c˜

oes de modelagem para criar um mercado de

interope-rabilidade de ferramentas de desenvolvimento, servi¸cos e fazer IP (Intellectual Property)

realidade.

Recentemente, a metodologia de projeto refor¸ca a descri¸c˜

ao em n´ıveis mais abstratos

de descri¸c˜

ao. A id´

eia ´

e descrever-se n˜

ao somente o componente de hardware como tamb´

em

sua intera¸c˜

ao com o software. Este tipo de descri¸c˜

ao ´

e referenciada como n´ıvel de sistema.

a um esfor¸co da comunidade de automa¸c˜

ao de projetos para consolidar sua linguagem

de desenvolvimento de sistemas, conhecida como SystemC [8].

1.4

Caracter´ısticas e Funcionalidades de SystemC

O padr˜

ao SystemC ´

e controlado por um grupo composto pelas treze maiores

compa-nhias das ind´

ustrias de EDA e eletrˆ

onicos.

(12)

mas (system-level designs). Pode-se usar ferramentas de desenvolvimento de SystemC e

de C++ padr˜

ao para criar um modelo de sistema, rapidamente simular para validar e

otimizar o projeto, explorar v´

arios algoritmos, e conceder a equipe de desenvolvimento

de software e de hardware uma especifica¸c˜

ao execut´

avel do sistema. Uma especifica¸c˜

ao

execut´

avel ´

e essencialmente um programa em C++ que exibe o mesmo comportamento

do sistema quando executado.

C ou C++ s˜

ao as linguagens escolhidas para algoritmos de software e especifica¸c˜

oes

de interface porque elas fornecem o controle e abstra¸c˜

oes de dados necess´

arios para

de-senvolver descri¸c˜

oes de sistema compactas e eficientes. A maioria dos projetistas est˜

ao

familiarizados com estas linguagens e a um grande n´

umero de ferramentas de

desenvolvi-mento associadas a elas.

A biblioteca de classes de SystemC fornece o necess´

ario para construir modelos da

ar-quitetura de sistemas incluindo temporiza¸c˜

ao do hardware, paralelismo, e comportamento

reativo que falta em C++ padr˜

ao. Adicionar estas constru¸c˜

oes a C exigiria extens˜

oes

pro-priet´

arias a linguagem, o que n˜

ao ´

e uma solu¸c˜

ao aceit´

avel para a ind´

ustria. A linguagem

C++ orientada a objetos provˆ

e a habilidade de estender a linguagem atrav´

es de classes,

sem adicionar novas contru¸c˜

oes sint´

aticas. SystemC fornece essas classes necess´

arias e

permite que projetistas continuem a usar a linguagem C++ e as ferramentas de

desen-volvimento.

SystemC possui entre diversas outras caracter´ısticas, a possibilidade de m´

ultiplos

n´ıveis de abstra¸c˜

ao: suporta modelos sem temporiza¸c˜

ao em diferentes n´ıveis de abstra¸c˜

ao,

abrangendo de modelos alto-n´ıvel at´

e modelos detalhados em RTL. Suporta refinamento

iterativo de modelos de n´ıveis mais altos para n´ıveis de abstra¸c˜

ao mais baixos.

(13)

2

Projeto da Representa¸

ao

Representa¸c˜

oes intermedi´

arias s˜

ao o ponto de partida do que o programador

escre-veu para o que a m´

aquina entende. Durante a tradu¸c˜

ao de uma linguagem de alto-n´ıvel

para c´

odigo de m´

aquina, um compilador otimizador analisa e transforma a representa¸c˜

ao

intermedi´

aria v´

arias vezes. Os usu´

arios do compilador querem que essas an´

alises e

trans-forma¸c˜

oes sejam r´

apidas e corretas. Os programadores do compilador querem que as

otimiza¸c˜

oes sejam simples de escrever, f´

aceis de compreender, e f´

aceis de estender. O

objetivo ent˜

ao ´

e uma representa¸c˜

ao que seja simples e leve enquanto possibilita f´

acil

ex-press˜

ao e otimiza¸c˜

oes r´

apidas.

2.1

Linguagem de Montagem Como Representa¸

cao

Intermedi´

aria

Um c´

odigo escrito em linguagem de montagem (assembly language), usado como

re-presenta¸c˜

ao intermedi´

aria entre a linguagem de alto-n´ıvel e o c´

odigo de m´

aquina, tem

diversas desvantagens e limita¸c˜

oes:

• ´

E dependente do conjunto de instru¸c˜

oes, n˜

ao pode ser utilizado em outra m´

aquina

com um conjunto de instru¸c˜

oes diferente.

• Utiliza os recursos da arquitetura para qual foi gerado. Mesmo que o c´

odigo seja

compat´ıvel com outra m´

aquina, o programa n˜

ao utilizaria recursos adicionais que

esta m´

aquina poderia ter (maior n´

umero de registradores por exemplo).

2.1.1

Dependˆ

encias de dados

Suponha duas instru¸c˜

oes, I e J, com I ocorrendo antes que J. S˜

ao poss´ıveis de ocorrer

os hazards:

(14)

• WAW (write after write) - J tenta escrever em um operando antes de I escrever. A

escrita acaba sendo feita na ordem errada, deixando o valor escrito por I no destino

em vez do valor escrito por J. Este hazard est´

a presente apenas em pipelines que

permitem escrita em mais de um est´

agio (ou permite que uma instru¸c˜

ao continue a

executar mesmo quando alguma anterior est´

a parada).

• WAR (write after read ) - J tenta escrever no destino antes que ele seja lido por

I, ent˜

ao I lˆ

e o novo valor o que ´

e incorreto. Este hazard ocorre quando existem

algumas instru¸c˜

oes que escrevem seu resultado cedo no pipeline de instru¸c˜

oes, e

outras instru¸c˜

oes que lˆ

eem tarde no pipeline.

Quando o conjunto de instru¸c˜

oes possui instru¸c˜

oes multiciclo, como multiplica¸c˜

ao,

divis˜

ao ou opera¸c˜

oes com ponto flutuante, a ocorrˆ

encia de hazards (principalmente WAW)

aumenta. Isso porque as instru¸c˜

oes n˜

ao atingem mais os est´

agios na ordem que foram

iniciadas. Por exemplo, se a instru¸c˜

ao I for uma divis˜

ao e J uma simples soma, onde I

precede J e ambos escrevem no mesmo registrador, J chegar´

a antes que I no est´

agio de

escrita e causar´

a um hazard WAW.

2.1.2

Dependˆ

encias de nome

Uma dependˆ

encia de nome ocorre quando duas instru¸c˜

oes usam o mesmo registrador

ou local de mem´

oria, chamado de nome, mas n˜

ao h´

a nenhum fluxo de dados entre as

instru¸c˜

oes associado com o nome. H´

a dois tipos de dependˆ

encias entre uma instru¸c˜

ao I

que precede uma outra instru¸c˜

ao J na ordem do programa:

• Uma antidependˆ

encia entre a instru¸c˜

ao I e a instru¸c˜

ao J ocorre quando a instru¸c˜

ao

J escreve em uma registrador ou posi¸c˜

ao de mem´

oria que a instru¸c˜

ao I lˆ

e e a instru¸c˜

ao

I ´

e executada antes. Uma antidependˆ

encia corresponde a um hazard WAR.

• Uma dependˆ

encia de sa´ıda ocorre quando a instru¸c˜

ao I e a instru¸c˜

ao J escrevem

no mesmo registrador ou posi¸c˜

ao de mem´

oria. A ordem das instru¸c˜

oes precisa ser

preservada. Dependˆ

encias de sa´ıda correspondem a hazards WAW.

Antidependˆ

encias e dependˆ

encias de sa´ıda s˜

ao dependˆ

encias de nome, ao contr´

ario de

dependˆ

encias de dados reais, porque n˜

ao h´

a valor sendo transmitido entre as instru¸c˜

oes.

(15)

Isto significa que as instru¸c˜

oes envolvidas numa dependˆ

encia de nome podem executar

simultaneamente ou serem reordenadas, se o nome (registrador ou posi¸c˜

ao de mem´

oria)

usado nas instru¸c˜

oes for mudado de tal forma que n˜

ao exista mais conflito. Este

reno-meamento pode ser feito facilmente para registradores e ´

e chamado de renomeamento de

registradores (register renaming). Pode ser feito estaticamente por um compilador ou

dinamicamente pelo hardware.

2.2

Grafos Como Representa¸

cao Intermedi´

aria

Como vantagem de utilizar grafos como linguagem intermedi´

aria, pode-se citar:

• Independente de plataforma.

• Possibilidade de realizar otimiza¸c˜

oes, utilizando algoritmos b´

asicos sobre grafos.

• Deixam expl´ıcito o paralelismo das opera¸c˜

oes.

• Grafos s˜

ao velhos conhecidos do mundo da computa¸c˜

ao, tem uma base matem´

atica

olida, e tˆ

em dispon´ıveis uma grande variedade de algoritmos.

2.2.1

Grafo de fluxo de dados

Um grafo de fluxo de dados ´

e um modelo de um programa sem condicionais. Em uma

linguagem de programa¸c˜

ao de alto-n´ıvel, um segmento de c´

odigo sem condicionais — mais

precisamente, com um ´

unico ponto de entrada e sa´ıda — ´

e conhecido como bloco b´

asico.

Antes que seja poss´ıvel desenhar o grafo de fluxo de dados para o c´

odigo, ´

e necess´

ario

modific´

a-lo um pouco. ´

E necess´

ario reescrever o c´

odigo no formato de atribui¸c˜

ao ´

unica

(single-assignment form), onde uma vari´

avel aparece apenas uma vez no lado esquerdo

de uma atribui¸c˜

ao (leia [10]). O formato de atribui¸c˜

ao ´

unica ´

e importante porque permite

identificar uma localiza¸c˜

ao ´

unica no c´

odigo onde uma vari´

avel ´

e computada. Este formato

de atribui¸c˜

ao ´

unica tamb´

em elimina as dependˆ

encias de nome das vari´

aveis.

O formato de atribui¸c˜

ao ´

unica significa que o grafo de fluxo de dados ´

e ac´ıclico. Manter

o grafo de fluxo de dados ac´ıclico ´

e importante em v´

arios tipos de an´

alises poss´ıveis de

serem feitas no grafo. H´

a mais detalhes sobre os grafos de fluxo de dados em se¸c˜

oes futuras.

A tabela 1 mostra um exemplo de c´

odigo e seu equivalente no formato de atribui¸c˜

ao ´

unica.

(16)

int x = 1;

int x = 1;

int y = 2;

int y = 2;

int z = 3;

int z = 3;

x = x ∗ y;

int x1 = x ∗ y;

y = y ∗ z;

int y1 = y ∗ z;

z = x ∗ y;

int z1 = x1 ∗ y1 ;

2.3

Um modelo unificado para s´ıntese de hardware e

software

Sistemas embutidos s˜

ao implementados como uma mistura de software e hardware.

Geralmente, software ´

e usado para proporcionar v´

arias funcionalidades e flexibilidade,

enquanto hardware ´

e usado para prover desempenho.

A metodologia atual de projeto de sistemas embutidos requer separa¸c˜

ao da

espe-cifica¸c˜

ao e desenvolvimento de hardware e software. Esta metodologia traz problemas

quando h´

a necessidade de modificar o projeto do hardware ou software, `

as vezes ´

e preciso

at´

e reprojetar o sistema. Esta metodologia ainda tem outros problemas:

• Falta de uma representa¸c˜

ao unificada do modelo de hardware e software, o que

leva a dificuldades na verifica¸c˜

ao do sistema como um todo, e consequentemente

incompatibilidades na integra¸c˜

ao software/hardware.

• Uma defini¸c˜

ao antecipada das parti¸c˜

oes, o que pode levar a projetos pouco

otimiza-dos.

• Falta de um fluxo de projeto bem definido, o que torna a revis˜

ao da especifica¸c˜

ao

dif´ıcil.

a v´

arias abordagens diferentes para resolver o problema do projeto de sistemas

em-butidos. Nesse trabalho ser´

a desenvolvida e mostrada uma metodologia para especifica¸c˜

ao

do sistema, e s´ıntese e valida¸c˜

ao do software para o sistema embutido. O projeto ´

e feito

com uma linguagem unificada que descreve tanto o software quanto o hardware, SystemC,

e com uma ´

unica abordagem de representa¸c˜

ao intermedi´

aria de software, grafo, e tendo

como produto final c´

odigo de montagem e consequente c´

odigo de m´

aquina.

(17)

2.3.1

Um modelo de comportamento baseado em grafos

A representa¸c˜

ao intermedi´

aria neste projeto ´

e ent˜

ao uma estrutura baseada em grafos

e orientada a objetos, mais precisamente grafos polares

1

de fluxo de dados.

Os v´

ertices do DFG denotam opera¸c˜

oes, parˆ

ametros, chamadas de fun¸c˜

ao, valores de

retorno, constantes ou s˜

ao usados para polarizar o grafo. As arestas podem ser de apenas

dois tipos: dados ou sequenciamento (n˜

ao transportam dados, tem custo zero).

O grafo de fluxo de dados de um c´

odigo torna a ordem em que as opera¸c˜

oes s˜

ao

executadas menos ´

obvia. Esta ´

e uma das vantagens do grafo de fluxo de dados.

Pode-se us´

a-lo para determinar reordenamentos poss´ıveis das opera¸c˜

oes, o que pode ajudar a

reduzir conflitos do pipeline e da cache. Pode-se utiliz´

a-lo tamb´

em quando a ordem exata

das opera¸c˜

oes n˜

ao importa. O grafo de fluxo de dados define uma ordem parcial das

opera¸c˜

oes no bloco b´

asico. ´

E necess´

ario garantir que um valor ´

e computado antes que

seja utilizado, mas geralmente h´

a diversos ordenamentos poss´ıveis de avaliar as express˜

oes

para satisfazer esse requisito.

2.4

ecnicas de otimiza¸

ao

Otimiza¸c˜

oes s˜

ao um conjunto de transforma¸c˜

oes que preservam a semˆ

antica e que

mi-nimizam a quantidade de informa¸c˜

ao e instru¸c˜

oes necess´

arias para executar um programa.

Otimiza¸c˜

oes podem ser implementadas de diversas maneiras. Podem ser realizadas

du-rante a etapa de an´

alise da compila¸c˜

ao, durante a gera¸c˜

ao da representa¸c˜

ao intermedi´

aria,

ou mesmo na representa¸c˜

ao intermedi´

aria.

Nas pr´

oximas se¸c˜

oes ser˜

ao explanadas algumas otimiza¸c˜

oes poss´ıveis de serem feitas

em grafos, a representa¸c˜

ao intermedi´

aria alvo deste trabalho. Elas s˜

ao transforma¸c˜

oes

baseadas no fluxo de dados, e podem ser consideradas otimiza¸c˜

oes “cl´

assicas”. As

oti-miza¸c˜

oes implementadas neste trabalho s˜

ao locais, isto ´

e, se aplicam apenas ao escopo do

bloco b´

asico.

2.4.1

Propaga¸

ao de constantes

Propaga¸c˜

ao de constantes consiste em detectar operandos constantes e pr´

e-computar

o valor da opera¸c˜

ao. Sendo o resultado outra constante, a nova constante pode ser

(18)

Figura 1: Propaga¸c˜

ao de constantes

2.4.2

Propaga¸

ao de vari´

aveis

Propaga¸c˜

ao de vari´

aveis consiste em detectar c´

opias de vari´

aveis, por exemplo, as

atribui¸c˜

oes do tipo x = y. Este tipo de otimiza¸c˜

ao s´

o pode ser feito se o valor da vari´

avel

do lado esquerdo da atribui¸c˜

ao (ou seja, a “c´

opia”) n˜

ao for alterado em alguma atribui¸c˜

ao

futura, o que ´

e verdade no formato de atribui¸c˜

ao ´

unica. Veja a tabela 2 como exemplo.

Tabela 2: Propaga¸c˜

ao de vari´

aveis

odigo original

odigo equivalente

int a = 3 + 4;

int a = 3 + 4;

int b = a;

int c = a * 3;

int c = b * 3;

2.4.3

Elimina¸

ao de subexpress˜

oes comuns

A procura por subexpress˜

oes comuns tenta encontrar padr˜

oes isom´

orficos no grafo.

Este passo ´

e simplificado se as express˜

oes aritm´

eticas tiverem apenas dois operandos, que

´

e o caso da representa¸c˜

ao intermedi´

aria adotada no trabalho. Ent˜

ao, esta transforma¸c˜

ao

consiste em selecionar um alvo, por exemplo, uma opera¸c˜

ao qualquer, e procurar outra

opera¸c˜

ao do mesmo tipo e que tenha os mesmos operandos de entrada. Veja a figura 2

como exemplo.

(19)

Figura 2: Elimina¸c˜

ao de subexpress˜

oes comuns

2.4.4

Elimina¸

ao de c´

odigo morto

odigo morto consiste em todas as opera¸c˜

oes que n˜

ao podem ser alcan¸cadas, e aquelas

que o resultado n˜

ao ´

e referenciado em nenhum outro lugar. Casos ´

obvios s˜

ao comandos

ap´

os um comando de retorno de um m´

etodo. Outros casos involvem opera¸c˜

oes que

pre-cedem o comando de retorno mas que n˜

ao tem seus resultados usados em nenhum lugar.

A figura 3 mostra um exemplo aplicado a representa¸c˜

ao intermedi´

aria usada no trabalho.

Figura 3: Elimina¸c˜

ao de c´

odigo morto

2.5

Linguagem de montagem

A linguagem de montagem ´

e equivalente a linguagem de m´

aquina, que tem instru¸c˜

oes

e vari´

aveis totalmente codificadas em bin´

ario, mas em vez da nota¸c˜

ao puramente bin´

aria

(20)

do que a linguagem de m´

aquina, ele ainda ´

e inteiramente dependente do conjunto de

instru¸c˜

oes dum dado processador, isto ´

e, n˜

ao ´

e port´

atil entre processadores de fam´ılias

diferentes.

Para converter de c´

odigo escrito em linguagem de montagem para c´

odigo de m´

aquina

utiliza-se programas chamados de montadores (assemblers).

2.5.1

Aloca¸

ao de registradores

Um dos problemas quando deseja-se escrever c´

odigo de montagem ´

e mapear vari´

aveis

e valores tempor´

arios para um conjunto fixo de registradores (juntamente com o espa¸co

dispon´ıvel na mem´

oria).

Para resolver o problema da aloca¸c˜

ao de registradores utiliza-se colora¸c˜

ao de grafos.

Cria-se um grafo de intervalo

2

, e ap´

os a colora¸c˜

ao, garante-se que um valor (representado

por um nodo) n˜

ao vai alterar o valor de outro porque n˜

ao usam o mesmo registrador caso

haja intersec¸c˜

ao no seu tempo de vida.

a v´

arios algoritmos de colora¸c˜

ao de grafos. Neste trabalho foi usado um algoritmo

simples que colore os v´

ertices sequencialmente, um de cada vez. Este algoritmo n˜

ao

garante que a colora¸cao seja m´ınima. O algoritmo e exemplos podem ser vistos em [3].

a programas onde n˜

ao ´

e poss´ıvel converter todas as vari´

aveis e tempor´

arios em

re-gistradores. Nestes casos, os valores nos registradores precisam ser salvos na mem´

oria

(t´

ecnica chamada de “memory spilling”), e quando necess´

ario, colocados em algum

regis-trador novamente.

(21)

3

Fluxo de S´

ıntese de Software

O fluxo de s´ıntese de software pode ser visto na figura 4. Os retˆ

angulos denotam

fer-ramentas. Entradas, sa´ıdas e representa¸c˜

oes intermedi´

arias s˜

ao representadas por elipses.

Figura 4: Panorama de um fluxo completo de s´ıntese de software

(22)

intermedi´

aria do fluxo e onde ser˜

ao feitas todas as otimiza¸c˜

oes desejadas. O grafo

(otimi-zado ou n˜

ao) serve de entrada para o gerador de c´

odigo, que tem como sa´ıda um arquivo

escrito em c´

odigo de montagem para o processador MIPS. Com um montador ´

e poss´ıvel

gerar c´

odigo de m´

aquina (c´

odigo bin´

ario) e executar o programa em uma m´

aquina com

processador MIPS ou em um simulador da arquitetura MIPS (ArchC [2], por exemplo).

3.1

Um prot´

otipo para o Fluxo de S´ıntese de

Soft-ware

Primeiramente, ´

e necess´

ario especificar quais funcionalidades ser˜

ao implementadas. O

fluxo de s´ıntese foi mostrado e comentado na se¸c˜

ao anterior. Na pr´

oxima, ser˜

ao mostradas

as restri¸c˜

oes impostas ao prot´

otipo para viabilizar sua implementa¸c˜

ao em tempo h´

abil.

3.1.1

Restri¸

oes

As ferramentas implementadas ou utilizadas no trabalho possuem algumas restri¸c˜

oes

ou simplifica¸c˜

oes. Nas pr´

oximas se¸c˜

oes ser˜

ao listadas algumas caracter´ısticas do

com-pilador implementado, das otimiza¸c˜

oes realizadas, do c´

odigo de montagem gerado, e do

simulador de arquitetura utilizado.

3.1.1.1

Subconjunto de SystemC

O subconjunto de SystemC implementado ´

e apresentado nessa se¸c˜

ao. Algumas

fun-cionalidades presentes em SystemC n˜

ao fazem sentido no escopo de sistemas embutidos,

outras foram retiradas para simplificar a constru¸c˜

ao das ferramentas.

A tabela 3 mostra as constru¸c˜

oes de SystemC/C++ implementadas no subconjunto.

A primeira coluna diz qual a categoria da constru¸c˜

ao, a segunda coluna mostra um

exem-plo ou palavra-chave, e a terceira coluna traz coment´

arios ou observa¸c˜

oes sobre a

imple-menta¸c˜

ao da funcionalidade, se necess´

ario.

Apenas dois tipos de dados primitivos s˜

ao implementados. Eles s˜

ao mostrados na

tabela 4.

(23)

Tabela 3: Constru¸c˜

oes aceitas pela linguagem

Categoria

Constru¸

ao

Observa¸

oes

Coment´

arios

Bloco /* */ e linha //

Identificadores

Ex.: var, var, var3

Come¸cando com letra ou

su-blinhado e seguido por

le-tras, n´

umeros ou sublinhado

Classes

SC MODULE e class

Fun¸c˜

oes

tipo nome() { }

Express˜

oes

Ex.: a + b

Arquivos inclu´ıdos

#include arquivo

Ignorados,

como

os

co-ment´

arios.

Declara¸c˜

oes

tipo nome;

Retorno de fun¸c˜

ao

return

Atribui¸c˜

oes

Ex.: a = b + c

Construtor

SC MODULE ou classe()

Modificadores de acesso

public, protected, private

ao fazem sentido na

abor-dagem de grafos, mas s˜

ao

necess´

arios em C++

Tabela 4: Tipos de dados aceitos

Categoria

Constru¸

ao

Coment´

arios

Inteiros

int

Decimais

Booleanos

bool

true ou false

mostrados na tabela 4.

Tabela 5: Operadores aceitos

Categoria

Constru¸

ao

Aritm´

eticos

/, *, +, -, %

Relacionais

!=, ==, >, <, >=, <=, !

Outras coisas importantes sobre o subconjunto da linguagem:

• Aceita instancia¸c˜

ao de objetos das classes j´

a declaradas.

• Aceita passagem de parˆ

ametros nos m´

etodos, mas somente vari´

aveis ou constantes,

ao aceita express˜

oes ou chamada de fun¸c˜

ao como parˆ

ametro.

(24)

• N˜

ao aceita parˆ

enteses em express˜

oes.

• N˜

ao h´

a precedˆ

encia das opera¸c˜

oes. As express˜

oes s˜

ao avaliadas da esquerda para a

direita.

Abaixo est´

a um exemplo de c´

odigo escrito com o subconjunto implementado.

#include "systemc.h"

int some(int x, int y) { return x + y;

}

class MinhaClasse { public:

int divide(int x, int y) { return x / y; } MinhaClasse () { } int multiply() { int x = 1; int y = 2; return x * y; } }; int main() { MinhaClasse m; int c = 9 + 4; int a = m.divide(c, 10); int a1 = -a * m.multiply(); int a2 = a1 + some(0, 5); int b = 8 % c; return a2 - b;

(25)

}

3.1.1.2

Otimiza¸

oes

A otimiza¸c˜

ao feita nos grafos ser´

a limitada, ser˜

ao implementados apenas alguns

algo-ritmos simples. Tamb´

em ser˜

ao restritas ao bloco b´

asico.

ao ´

e poss´ıvel fazer otimiza¸c˜

oes de baixo n´ıvel porque o simulador da arquitetura n˜

ao

suporta a descri¸c˜

ao do pipeline, ou seja, n˜

ao ´

e cycle-accurate.

3.1.1.3

Gera¸

ao de c´

odigo

A aloca¸c˜

ao de registradores ´

e est´

atica, feita a partir da colora¸c˜

ao do grafo de intervalo

das vari´

aveis. N˜

ao est´

a previsto escalonamento de c´

odigo.

Apenas a arquitetura MIPS ser´

a alvo deste trabalho.

3.1.1.4

Simulador da arquitetura MIPS

O simulador da arquitetura MIPS utilizado no trabalho (ArchC) n˜

ao ´

e cycle-accurate,

o que retira uma m´

etrica importante para medir o desempenho do c´

odigo final.

(26)

4

Implementa¸

ao

Todas as ferramentas foram implementadas em C++ e funcionam no sistema

ope-racional Linux. Nenhuma tem interface gr´

afica, funcionam com comandos executados a

partir do console.

Foram implementados alguns shell scripts, que chamam as ferramentas na seq¨

encia

certa, e somente se a anterior foi executada com sucesso.

Nas pr´

oximas se¸c˜

oes ser˜

ao descritas as ferramentas implementadas neste trabalho. A

figura 5 mostra o diagrama UML correspondente `

a implementa¸c˜

ao.

Figura 5: Diagrama UML das ferramentas

4.1

Pacote IOO

Para realizar a implementa¸c˜

ao das ferramentas do prot´

otipo, foram utilizadas classes

e estruturas de dados j´

a dispon´ıveis, implementadas por Felipe Vieira Klein (veja [4]).

Foram feitas algumas modifica¸c˜

oes e inclus˜

oes no c´

odigo original para suprir algumas

necessidades da implementa¸c˜

ao do prot´

otipo.

Est˜

ao inclu´ıdas no pacote classes para

grafos, tabela de hash, listas, vetores, nodos, arestas, entre outros.

(27)

4.2

Compilador

Um compilador tradicionalmente ´

e dividido em duas partes ou fases: an´

alise e gera¸c˜

ao

de c´

odigo. A fase de an´

alise pode ser divida em outras trˆ

es: an´

alise l´

exica, sint´

atica e

semˆ

antica.

O analisador l´

exico e o analisador semˆ

antico foram gerados pela ferramenta ANTLR

[1] a partir de gram´

aticas LL(k) (livres de contexto) tanto para a parte l´

exica

(tradicio-nalmente implementada com gram´

aticas regulares) quanto para a parte sint´

atica.

O analisador semˆ

antico n˜

ao foi implementado. Isso porque uma descri¸c˜

ao em SystemC

precisa incluir o arquivo de cabe¸calho “systemc.h”, e certamente o compilador geraria

erros caso fosse avaliar este arquivo porque ele implementa apenas um subconjunto de

SystemC/C++.

Para resolver o problema, um shell script chama o compilador g++ antes do

compi-lador. Ele verifica se a descri¸c˜

ao SystemC est´

a correta do ponto de vista l´

exico, sint´

atico

e semˆ

antico de SystemC/C++.

Se estiver tudo correto, o script chama o compilador implementado que faz a an´

alise

exica e sint´

atica do arquivo para verificar se as constru¸c˜

oes utilizadas est˜

ao dentro do

subconjunto que a ferramenta implementa.

Se ocorrer algum erro l´

exico ou sint´

atico o compilador mostra uma mensagem de erro

e aborta.

Junto com a an´

alise sint´

atica ´

e feita a gera¸c˜

ao dos grafos de fluxo de dados (gera¸c˜

ao

ori-entada `

a sintaxe). Cada procedimento gera um DFG. V´

ertices s˜

ao criados para opera¸c˜

oes

(aritm´

eticas e l´

ogicas), chamadas de fun¸c˜

ao, parˆ

ametros, comandos de retorno e

constan-tes. Arestas s˜

ao criadas quando h´

a fluxo de dados entre dois v´

ertices. Quando o m´

etodo

chega ao fim, s˜

ao criados os v´

ertices source e sink, usados para polarizar o grafo.

Ares-tas s˜

ao criadas do v´

ertice source para todos os outros v´

ertices que n˜

ao tenham nenhuma

aresta entrante (com exce¸c˜

ao do v´

ertice sink ). Da mesma forma, s˜

ao adicionadas arestas

de todos os v´

ertices que n˜

ao tenham nenhuma aresta saindo dele para o v´

ertice sink.

O compilador chama o otimizador de c´

odigo, caso a op¸c˜

ao de otimiza¸c˜

ao estiver

ha-bilitada. Tamb´

em gera o grafo de intervalo de vari´

aveis, que ser´

a utilizado pelo gerador

de c´

odigo para a aloca¸c˜

ao de registradores. O otimizador ´

e chamado antes da gera¸c˜

ao

do grafo de intervalo das vari´

aveis, porque durante a otimiza¸c˜

ao vari´

aveis podem ser

eliminadas.

(28)

Figura 6: DFG correspondente a fun¸c˜

ao main do c´

odigo presente na se¸c˜

ao 3.1.1.1

4.3

Otimizador

As otimiza¸c˜

oes realizadas se aplicam apenas a um DFG correspondente a um

procedi-mento e n˜

ao trocam informa¸c˜

oes com outros DFGs (outros procedimentos). S˜

ao portanto

otimiza¸c˜

oes locais, se aplicam ao bloco b´

asico.

Foram implementadas as seguintes otimiza¸c˜

oes:

(29)

• Elimina¸c˜

ao de subexpress˜

oes comuns.

• Propaga¸c˜

ao de constantes.

• Propaga¸c˜

ao de vari´

aveis.

Pode-se citar outros tipos de otimiza¸c˜

ao como:

• Multiplica¸c˜

ao por 0 retorna 0 e por 1 retorna o multiplicador diferente de 1. Essas

multiplica¸c˜

oes s˜

ao detectadas na etapa de otimiza¸c˜

ao e eliminadas.

• Soma ou subtra¸c˜

ao por 0 retorna o pr´

oprio valor.

• A constante 0 j´

a est´

a presente no conjunto de registradores, o registrador $0 (ou

$zero) do MIPS sempre retorna a constante.

As otimiza¸c˜

oes est˜

ao ativadas por padr˜

ao, mas podem ser desligadas editando-se um

arquivo de configura¸c˜

ao.

Mais detalhes e ilustra¸c˜

oes das otimiza¸c˜

oes podem ser vistas na se¸c˜

ao 2.4.

4.4

Gerador de c´

odigo

O gerador de c´

odigo transforma os grafos de fluxo em c´

odigo de montagem do MIPS.

Como discutido anteriormente, ´

e necess´

ario que um valor seja computado antes de

ser utilizado. Para garantir isso, ´

e feita uma travessia em profundidade p´

os-ordem no

grafo. Durante a travessia, os nodos s˜

ao marcados se forem folhas (n˜

ao tem nenhuma

aresta saindo dele), ou se todos os nodos alcan¸c´

aveis a partir dele j´

a foram marcados.

Esta travessia define ent˜

ao, uma ordem em que os nodos precisam ser computados. Essa

ordem ´

e inversa (o ´

ultimo nodo marcado ser´

a o primeiro a ser computado e o primeiro

nodo marcado ser´

a o ´

ultimo) `

a ordem que os nodos foram marcados. Como exemplo, veja

a figura 7.

A aloca¸c˜

ao de registradores para as vari´

aveis ´

e est´

atica, obtida a partir do grafo de

intervalos de vida gerado pelo compilador. A aloca¸c˜

ao de registradores tempor´

arios ´

e

controlada: procura-se um registrador vazio e aloca-se ele para algum valor. E sempre

ap´

os uma opera¸c˜

ao verifica-se se os registradores utilizados como operandos podem ser

liberados e marcados como livres.

(30)

Figura 7: Poss´ıvel ordem de avalia¸c˜

ao dos nodos (inversa, de 10 at´

e 1)

Quando acontecer de n˜

ao haver registradores livres, usa-se memory spilling, o valor

de um registrador ´

e salvo na mem´

oria, e ent˜

ao ele ´

e liberado para ser usado.

A tabela 6 mostra as intru¸c˜

oes utilizadas no trabalho

1

.

Para mais detalhes sobre a implementa¸c˜

ao de c´

odigo de montagem (salvamento e

recupera¸c˜

ao de contexto, passagem de parˆ

ametros, etc), veja o anexo B.

(31)

Tabela 6: Instru¸c˜

oes do MIPS utilizadas no trabalho

Opera¸

ao

Instru¸

oes

Coment´

arios

Adi¸c˜

ao (+)

addu $, $, $

Soma quando os operandos

est˜

ao em registradores

Adi¸c˜

ao (+)

addi $, $, constante

Soma com um dos

operan-dos constante

Subtra¸c˜

ao (-)

subu $, $, $

Subtra¸c˜

ao (-)

subi $, $, constante

Multiplica¸c˜

ao (*)

mult $, $

O resultado de uma

multi-plica¸c˜

ao ´

e armazenado no

mflo $

registrador Lo, e acessado

com a instru¸c˜

ao mfhi

Divis˜

ao (/)

div $, $

O quociente de uma divis˜

ao

´

e armazenado no

mflo $

registrador Lo, e acessado

com a instru¸c˜

ao mflo

odulo (%)

div $, $

O resto de uma divis˜

ao ´

e

ar-mazenado no

mfhi $

registrador Lo, e acessado

com a instru¸c˜

ao mfhi

Alterar sinal (-)

negu $, $

E (&&)

and $, $, $

Ou (||)

or $, $, $

Igual (==)

seq $, $, $

Diferente (!=)

sne $, $, $

Nega¸c˜

ao (!)

not $, $

Maior que (>)

sgt $, $, $

Menor que (<)

slt $, $, $

Maior igual que (>=)

sge $, $, $

Menor igual que (<=)

sle $, $, $

Chamada de procedimento

jal r´

otulo

Retorno de fun¸c˜

ao

jr $ra

Carregar constante

li $, constante

Carregar a constante no

re-gistrador

Carregar vari´

avel

lw $, vari´

avel

Carregar a vari´

avel

(dis-pon´ıvel no segmento de

da-dos) no registrador

Carregar da mem´

oria

lw $, constante ($)

Carregar no registrador o

valor armazenado no

en-dere¸co de mem´

oria

apon-tado por $ somado com a

constante

Salvar na mem´

oria

sw $, constante ($)

Salvar o valor do registrador

no endere¸co apontado por $

somado com a constante

(32)

5

Valida¸

ao do Prot´

otipo

A valida¸c˜

ao do prot´

otipo consiste em verificar se o sistema cumpriu com os objetivos

tra¸cados. Experimentos testam se as funcionalidades que o sistema implementa funcionam

corretamente. A valida¸c˜

ao do sistema ser´

a mostrada nas pr´

oximas se¸c˜

oes.

5.1

Valida¸

ao do Modelo da Arquitetura Alvo

A valida¸c˜

ao do modelo da arquitetura alvo ´

e um experimento que verifica se o c´

odigo

de m´

aquina gerado pelo prot´

otipo ´

e equivalente ao c´

odigo gerado por um compilador feito

para a arquitetura, no caso do experimento ser´

a usado o compilador GNU g++.

A partir do confronto entre as respostas apresentadas pelo sistema implementado e

pelo compilador GNU pode-se dizer se os c´

odigos s˜

ao equivalentes ou n˜

ao. A figura 8

ilustra o experimento.

(33)

5.1.1

MIPS Cross-Toolchain

Toolchain ´

e uma cole¸c˜

ao de programas usados para desenvolvimento e constru¸c˜

ao de

programas para uma determinada arquitetura alvo. Ela roda em uma arquitetura mas

produz c´

odigo objeto para a arquitetura alvo. Cross-Toolchain tamb´

em ´

e referenciado

como Cross-Compiler.

Um dos usos ´

e gerar programas quando n˜

ao se tem uma m´

aquina com a arquitetura

alvo ou n˜

ao ´

e poss´ıvel compilar o c´

odigo nesta m´

aquina (muitos dos casos quando

trabalha-se com sistemas embutidos).

Agradecimentos a Sandro Rigo (autor do ArchC e do simulador da arquitetura MIPS),

que cedeu os bin´

arios do Cross-Toolchain utilizados por ele na Unicamp.

5.1.2

Experimento

Foi feito um experimento onde o mesmo c´

odigo fonte (escrito em SystemC/C++) foi

submetido ao compilador GNU (presente no MIPS Cross-Toolchain apresentado

anteri-ormente) e a ferramenta prot´

otipo.

As duas ferramentas geraram como sa´ıda c´

odigo de montagem, onde foi adicionado

uma chamada ao procedimento “printf”(que imprime caracteres na sa´ıda padr˜

ao) presente

na biblioteca de C, para que o resultado final fosse mostrado no tela.

Um shell script, que toma como parˆ

ametros o arquivo assembly de entrada e o nome

desejado para o execut´

avel como sa´ıda, chama o montador e o ligador (presentes no

Cross-Toolchain) com as op¸c˜

oes e bibliotecas necess´

arias, produzindo o execut´

avel.

O simulador do MIPS executou ambos os programas e o resultado impresso na tela

foi o mesmo.

O experimento foi repetido v´

arias vezes com diferentes c´

odigos fonte de entrada (em

SystemC/C++) e o resultado final do prot´

otipo e do compilador GNU sempre foi igual.

5.2

Valida¸

ao do Prot´

otipo de S´ıntese de Software

A valida¸c˜

ao do prot´

otipo de s´ıntese de software tem como objetivo comparar o

de-sempenho do c´

odigo gerado pelo sistema com o c´

odigo gerado pelo compilador GNU.

(34)

nacci. Veja o c´

odigo fonte:

int main() {

int a = 0;

int b = 1;

int c = a + b;

int d = b + c;

int e = c + d;

int f = d + e;

int g = e + f;

int h = f + g;

int i = g + h;

int j = h + i;

int k = i + j;

return k;

}

O c´

odigo otimizado produzido pelo prot´

otipo e pelo compilador GNU s˜

ao equivalentes.

O c´

odigo do compilador GNU cont´

em mais diretivas enquanto o c´

odigo produzido pelo

prot´

otipo tem mais instru¸c˜

oes porque faz salvamento e recupera¸c˜

ao de contexto. A tabela

7 mostra os dois c´

odigos.

5.2.2

Impacto das Otimiza¸

oes

Em um programa como o anterior com apenas somas, o impacto das otimiza¸c˜

oes se

mostra muito grande. No caso do experimento anterior, a ´

unica otimiza¸c˜

ao aplicada pelo

prot´

otipo foi a propaga¸c˜

ao de constantes. O compilador GNU compilou o c´

odigo fonte

com a op¸c˜

ao de otimiza¸c˜

oes locais (“-O1”).

A tabela 8 mostra um compara¸c˜

ao de quantas instru¸c˜

oes s˜

ao executadas com ou sem

otimiza¸c˜

oes.

(35)

Tabela 7: C´

odigo assembly do experimento

odigo do prot´

otipo

odigo do compilador GNU

.text

.file 1 ”fibonacci.cpp”

.globl main

.section .mdebug.abi32

main: sw $fp, -4($sp)

.previous

sw $31, -8($sp)

.text

move $fp, $sp

.align 2

addu $sp, $sp, -8

.globl main

li $2, 55

$LFB1:

addu $sp, $sp, 8

.ent main

lw $fp, -4($sp)

main:

lw $31, -8($sp)

.frame $sp,0,$31

jr $31

.mask 0x00000000,0

.data

.fmask 0x00000000,0

.set noreorder

.set nomacro

j $31

li $2,55

.set macro

.set reorder

.end main

$LFE1:

Tabela 8: Compara¸c˜

ao de c´

odigo otimizado com n˜

ao-otimizado

umero de instru¸

oes

Compilador GNU

Prot´

otipo

ao-otimizado

43

21

Otimizado

2

9

A diferen¸ca no caso do c´

odigo otimizado foi explicada na se¸c˜

ao anterior. A diferen¸ca

no caso do c´

odigo n˜

ao-otimizado acontece porque o compilador GNU usa alguns poucos

registradores dispon´ıveis na m´

aquina apenas, e faz muito memory spilling. O prot´

otipo

trabalha somente com registradores, n˜

ao h´

a necessidade de fazer memory spilling.

(36)

6

Conclus˜

oes e Perspectivas

Neste trabalho foi apresentado um fluxo completo de s´ıntese de software para sistemas

embutidos. Foram apresentadas e justificadas as escolhas da entrada, representa¸c˜

ao

in-termedi´

aria e sa´ıda do fluxo, foram descritas as ferramentas implementadas para realizar

o que foi proposto e mostrados os resultados obtidos.

As simplifica¸c˜

oes e restri¸c˜

oes adotadas visaram viabilizar a implementa¸c˜

ao do prot´

otipo,

mas sem perda de generalidade.

6.1

Trabalhos futuros

Este trabalho pode ser complementado com a implementa¸c˜

ao de outras ferramentas,

utiliza¸c˜

ao de programas com mais funcionalidades ou com experimentos diferentes.

Pode-se citar:

• Fazer uma implementa¸c˜

ao do gerador de c´

odigo que leia a descri¸c˜

ao da arquitetura

de um arquivo de configura¸c˜

ao e gere c´

odigo.

• Incluir mais funcionalidades de SystemC.

• Um simulador de arquitetura cycle-accurate ´e necess´

ario para melhor mostrar o

desempenho do c´

odigo gerado.

• Mais algoritmos de otimiza¸c˜

ao poderiam resultar em um c´

odigo mais eficiente.

• O experimento da se¸c˜

ao 5.2 poderia ser repetido e uma compara¸c˜

ao de

desempe-nho poderia substituir a compara¸c˜

ao de equivalˆ

encia assim que o simulador

cycle-accurate estiver dispon´ıvel . Por exemplo, a latˆ

encia do pior caso poderia ser medida

em ambos os caminhos para estimar a acelera¸c˜

ao.

(37)

6.2

Conclus˜

oes finais

Pode-se citar algumas conclus˜

oes obtidas ao fim do trabalho:

• A ferramenta facilita a elabora¸c˜

ao e generaliza¸c˜

ao do modelo baseado em grafos

permitindo facilidades de visualiza¸c˜

ao e procura por erros.

• ´

E fornecida infra-estrutura para avalia¸c˜

oes de desempenho de experimentos futuros.

• O sistema tra¸ca o caminho para o desenvolvimento futuro de um fluxo completo de

s´ıntese de software.

• O impacto de otimiza¸c˜

oes simples, como a propaga¸c˜

ao de constantes, pode ser

grande no desempenho final dependendo do programa.

• O uso de grafos como representa¸c˜

ao intermedi´

aria mostrou-se uma op¸c˜

ao vi´

avel no

processo de compila¸c˜

ao.

(38)

Referˆ

encias Bibliogr´

aficas

[1] ANTLR.

ANother

Tool

for

Language

Recognition.

Dispon´ıvel

em

<http://www.antlr.org>. Acesso em 27 nov. 2003.

[2] ArchC.

The

ArchC

Architecture

Description

Language.

Dispon´ıvel

em

<http://www.archc.org>. Acesso em 05 fev. 2004.

[3] DE MICHELI, Giovanni. Synthesis and Optimization of Digital Circuits,

McGraw-Hill, 1994.

[4] KLEIN, Felipe Vieira. Modelagem de Arquiteturas de Sistemas Digitais:

Imple-menta¸c˜

ao e Ferramentas de S´ıntese Autom´

atica. Trabalho de Fim de Curso, UFSC,

ago. de 2002.

[5] HENNESSY, John L., PATTERSON, David A. Computer Architecture: A

Quanti-tative Approach. Morgan Kaufmann Publishers, second edition, 1995.

[6] LARMAN, Craig. Applying UML and Patterns - An Introduction to Object-Oriented

Analysis and Design, Prentice-Hall, 1999.

[7] SWEETMAN, Dominic. See MIPS Run. Morgan Kaufmann Publishers, 1999.

[8] SYSTEMC. SystemC Community. Dispon´ıvel em <http://www.systemc.org>.

Acesso em 27 nov. 2003.

[9] SWAN, Stuart. An Introduction to System Level Modeling in SystemC 2.0.

Dis-pon´ıvel em <http://www.cadence.com/whitepapers/systemc wp20.pdf>. Acesso em

27 nov. 2003.

[10] WOLF, Wayne. Computers as Components: Principles of Embedded Computing

Systems Design. Morgan Kaufmann Publishers, 2000.

[11] yEd.

yEd

JavaTM

Graph

Editor.

Dispon´ıvel

em

<http://www.yworks.com/en/products yed about.htm>.

Acesso

em

05

dez.

2003.

(39)

ANEXO A -- Ferramentas Auxiliares

Implementadas

A.1

Grafo para XML

Para possibilitar a visualiza¸c˜

ao do DFG graficamente foi implementada uma

ferra-menta que recebe um DFG como entrada e gera um arquivo de sa´ıda em um padr˜

ao XML

aceito pela ferramenta de visualiza¸c˜

ao de grafos yEd [11] (formato yGraphML).

A ferramenta cria nodos com cores e formatos diferentes dependendo do tipo de cada

um (opera¸c˜

ao, constante, chamada de fun¸c˜

ao, etc). Para as arestas existe apenas duas

classifica¸c˜

oes: dados e sequenciamento.

Os nodos podem possuir r´

otulos indicando melhor qual a sua fun¸c˜

ao. Para as opera¸c˜

oes

(tanto l´

ogicas quanto aritm´

eticas) o r´

otulo indica qual das opera¸c˜

oes poss´ıveis o nodo

re-presenta, por exemplo. Os nodos tem o seguinte significado:

• Quadrados cor azul: representam constantes.

• Triˆ

angulos cor verde claro: representam os argumentos do m´

etodo (entradas).

• Trap´ezio cor azul claro: representam os valores de retorno (sa´ıdas).

• C´ırculos cor amarela: representam opera¸c˜

oes aritm´

eticas.

• C´ırculos cor verde: representam opera¸c˜

oes l´

ogicas.

• C´ırculos cor rosa: representam chamadas de procedimento.

• Elipse cor laranja: representa o nodo “source”do DFG.

• Elipse cor azul escuro: representa o nodo “sink”do DFG.

(40)

a aresta no c´

odigo original (descri¸c˜

ao SystemC).

• Arestas cont´ınuas representam fluxo de dados entre dois nodos.

• Arestas hachuradas representam apenas sequenciamento do grafo (n˜

ao transportam

dados, n˜

ao tem custo nenhum).

A figura 9 mostra um exemplo com todos os tipos de nodos e arestas poss´ıveis de

visualiza¸c˜

ao.

(41)

ANEXO B -- Vis˜

ao geral da arquitetura

MIPS e sua linguagem de

montagem

Este anexo n˜

ao se destina a ensinar a escrever c´

odigo de montagem para o MIPS, ele

apenas fala um pouco sobre os conceitos e funcionalidades usadas no trabalho. Para mais

detalhes leia [7].

B.1

Processador

O processador tem 32 registradores de prop´

osito geral, todos eles de 32 bits. Eles

est˜

ao numerados de 0..31 e tamb´

em podem ser referenciados por nomes simb´

olicos, que

sugerem conven¸c˜

oes para o uso dos registradores. Dos 32 registradores, o primeiro e o

´

ultimo s˜

ao especiais:

• $0 ´e a constante 0, e n˜

ao pode ser alterada.

• $31 armazena o endere¸co de retorno de uma chamada de fun¸c˜

ao. ´

E chamado de $ra.

A tabela 9 mostra o uso convencionado para alguns registradores.

B.2

Conjunto de instru¸

oes

Instru¸c˜

oes podem ser agrupadas nas seguintes categorias:

Carregar e armazenar (load and store): carrega dados da mem´

oria em um

regis-trador, ou armazena o conte´

udo de um registrador na m´

emoria. Exemplos:

(42)

0

zero

Sempre retorna 0

2-3

v0, v1

Valor retornado por uma

su-brotina

4-7

a0-a3

(argumentos)

Primeiros

quatro parˆ

ametros de uma

subrotina

8-15

t0-t7

(temporarios)

Subrotinas

podem

utiliz´

a-los

sem

salvar

24, 25

t8, t9

16-23

s0-s7

Uma subrotina que escreve

em algum desses precisa

sal-var seu valor antigo e

res-taurar antes de retornar, de

maneira que a rotina

cha-madora tenha seus valores

preservados

29

sp

Stack pointer

30

fp

Frame pointer

31

ra

Endere¸co de retorno de uma

subrotina

lw $t0, num1 # carrega palavra num1 em $t0

sw $t0, 0($sp) # armazena o conte´

udo de $t0 na posi¸

c~

ao

# de mem´

oria apontada por $sp + constante

Opera¸

oes aritm´

eticas e l´

ogicas: realiza opera¸c˜

oes nos dados dos registradores e

armazena o resultado em um outro registrador. Exemplo:

add $t0, $t3, $t4 # $t0 = $t3 + $t4

subi $t0, $t3, 4 # $t0 = $t3 - 4

Desvios: altera o endere¸co da pr´

oxima instru¸c˜

ao a ser executada (armazenado em

um registrador denominado Program Counter ). Exemplo:

(43)

B.3

Estrutura de um programa

Um programa est´

a dividido em alguns segmentos. Entre elas:

• Segmento de dados, precedido por pela diretiva .data. Declara vari´

aveis usadas no

programa e que ser˜

ao salvas na mem´

oria.

• Segmento de c´

odigo, precedido pela diretiva .text. Cont´

em as instru¸c˜

oes do

pro-grama. O ponto inicial de execu¸c˜

ao do programa deve ser rotulado de main.

B.4

Chamadas de fun¸

ao e retorno

Quando ´

e feita uma chamada de fun¸c˜

ao normalmente deseja-se retornar ao ponto de

partida ap´

os o t´

ermino da fun¸c˜

ao chamada. O MIPS usa o registrador 31 ($ra) para

armazenar o endere¸co de retorno. H´

a duas instru¸c˜

oes envolvidas no processo. S˜

ao elas:

• jal (jump and link): salva o endere¸co atual do PC no registrador $ra e pula para

um procedimento.

• jr $ra coloca o valor de $ra no PC, fazendo a fun¸c˜

ao retornar a fun¸c˜

ao chamadora.

Como conven¸c˜

ao, ainda temos que os parˆ

ametros passados da fun¸c˜

ao chamadora para

a fun¸c˜

ao chamada s˜

ao salvos nos registradores $a0-$a3, e os valores de retorno da fun¸c˜

ao

chamada s˜

ao retornados nos registradores $v0 e $v1.

B.5

Chamadas de fun¸

ao e a pilha

A se¸c˜

ao anterior mostrou que para chamadas de fun¸c˜

ao e retorno usamos jal e jr.

Mas essa n˜

ao ´

e toda a hist´

oria, pois uma chamada de fun¸c˜

ao dentro da fun¸c˜

ao chamada

destruiria o endere¸co armazenado em $ra. Para superar este problema utiliza-se a pilha

(stack ).

B.5.1

Stack e frame pointer

O stack pointer aponta para o menor endere¸co (topo) da pilha. Ele pode aumentar e

diminuir durante a execu¸c˜

ao de um procedimento.

Referências

Documentos relacionados

Local de realização da avaliação: Centro de Aperfeiçoamento dos Profissionais da Educação - EAPE , endereço : SGAS 907 - Brasília/DF. Estamos à disposição

De seguida, vamos adaptar a nossa demonstrac¸ ˜ao da f ´ormula de M ¨untz, partindo de outras transformadas aritm ´eticas diferentes da transformada de M ¨obius, para dedu-

Promovido pelo Sindifisco Nacio- nal em parceria com o Mosap (Mo- vimento Nacional de Aposentados e Pensionistas), o Encontro ocorreu no dia 20 de março, data em que também

O desenvolvimento das interações entre os próprios alunos e entre estes e as professoras, juntamente com o reconhecimento da singularidade dos conhecimentos

O valor da reputação dos pseudônimos é igual a 0,8 devido aos fal- sos positivos do mecanismo auxiliar, que acabam por fazer com que a reputação mesmo dos usuários que enviam

A partir das análises realizadas no que tange às articulações entre processo formativo que enfatizou a ressignificação e aplicação, inferimos que a aplicação da SEA replanejada no

Apesar dos esforços para reduzir os níveis de emissão de poluentes ao longo das últimas décadas na região da cidade de Cubatão, as concentrações dos poluentes

Desse modo, podemos atentar para o fato de que a garantia dos direitos do idoso, em específico o direito à moradia digna, compreendem um rol muito mais amplo do que