SlideShare uma empresa Scribd logo
1 de 46
Baixar para ler offline
Técnicas para Diminuir o Consumo de Energia
                                          em Sistemas Embarcados


                            Edward David Moreno e Raimundo da Silva Barreto


                                               Abstract


The increase in user demands for battery-operated mobile and embedded devices requires an equi-
valent increase in processor performance, which on the other hand causes an increase in the energy
consumption of these devices. Thus, this work aims to present the importance of that problem, empha-
sizing and showing which critical components are in mobile devices. Later, this work focuses in the
main techniques, strategies, and impact in the development of low energy systems. The techniques
are presented and discussed in six levels, namely, circuit, architecture, operating system, compiler,
communication, and application. Finally, it presents a case study and a discussion about future chal-
lenges in this research area.


                                               Resumo


O incremento na demanda dos usuários de dispositivos móveis e embarcados requer um incremento
equivalente no desempenho do processador, o qual, por outro lado, causa um incremento no consumo
de energia desses dispositivos. Assim, este trabalho visa apresentar a importância do consumo de
energia e potência, enfatizando e mostrando quais são os componentes críticos em um dispositivo
móvel. Depois, foca nas principais técnicas, estratégias e o impacto na diminuição do consumo de
energia. As técnicas são apresentadas e discutidas em seis níveis, isto é, circuito, arquitetura, sistema
operacional, compilador, comunicação e aplicação. Finalmente, apresenta-se um estudo de caso e
uma discussão sobre os desafios futuros nesta área de pesquisa.

6.1. Introdução
    Esta seção apresenta definições e conceitos gerais sobre consumo de
energia e potência, além de descrever diversos métodos e técnicas para a
redução do consumo de energia em sistemas embarcados e móveis.
    Um sistema embarcado pode ser definido como um computador de propó-
sito especial, que está incorporado a outro dispositivo (que pode não ser um
computador), onde a utilização deste tem como intuito acrescentar ou otimizar
funcionalidades, executa uma função específica e possui diversas restrições
(temporais, consumo de energia e memória, peso, tamanho, etc).
    O avanço tecnológico, principalmente da micro-eletrônica, e o barateamento
de sistemas microprocessados fizeram com que ocorresse uma explosão na


                                                                                                       1
E. Moreno e R. Barreto



utilização desse tipo de sistema nas mais diversas áreas da vida humana. O
homem moderno, mesmo sem perceber, depende cada vez mais da utilização
de sistemas embarcados no seu dia-a-dia. Isto inclui não somente sistemas
críticos que operam em automóveis, estradas de ferro, aviões, naves espaciais
e na medicina, mas também automação industrial e de residências, video ga-
mes, aparelhos domésticos, telefones celulares, fornos de micro-ondas, dentre
outros.
     Atualmente, o consumo de energia é ponto de discussão e pesquisa tanto
na indústria como na academia. Isto se deve principalmente à massificação
do uso de dispositivos móveis e a exigência, cada vez maior do mercado para
que os mesmos tenham grande potencial computacional e maior grau de au-
tonomia. Devido a essa característica, o consumo de energia passou a figurar
como métrica de qualidade no contexto dos projetos de sistemas embarcados.
Além disso, tal consumo tem impacto na forma de encapsulamento do sistema,
implicando no custo final do produto.
     No mundo inteiro a utilização de dispositivos móveis está cada vez mais
crescente e, aos poucos, esses aparelhos permitem realizar mais e mais fun-
ções de forma automática, facilitando algumas atividades rotineiras do ser hu-
mano.
     A área da computação móvel depende de algumas outras sub-áreas como
microeletrônica, sistemas digitais, sistemas embarcados, automação, progra-
mação de dispositivos móveis, avaliação e simulação, desempenho, lingua-
gens de programação, redes de computadores e sistemas distribuídos, dentre
outras áreas. Essa grande diversidade de aplicações deve-se aos avanços
nessas áreas e, em especial, aos avanços na área de dispositivos eletrônicos
e ao uso da comunicação sem fio (wireless), que possibilitam a aplicação des-
ses dispositivos e ferramentas em casos em que a conexão física é um fator
limitante.
     Alguns exemplos de dispositivos móveis são os notebooks, PDA (Personal
Digital Assistants), o pager, o IPoD, os dispositivos de música MP3, os sen-
sores inteligentes, os telefones celulares e, recentemente, os smart phones.
Não obstante, ainda há vários desafios a vencer, tanto do ponto de vista de
software e hardware, principalmente com relação ao atendimento das diversas
restrições.
     Os dispositivos móveis estão com mais e mais potência computacional.
Como exemplo pode-se citar, o computador de mão conhecido como Pocket
Itsy, projetado pela HP. Este dispositivo usa o processador ARM, que possui
boas características de desempenho. A Tabela 6.1 mostra que o Pocket Itsy
possui desempenho comparável a máquinas do SGI Índigo e Pentium, quando
se usa a métrica MIPS (Milhões de Instruções Por Segundo) e quando se exe-
cuta um subconjunto de programas especificados pelo benchmark SPEC. É
importante ressaltar que esta métrica não é a única usada para comparar de-
sempenho [Patterson and Hennessy 2007, Stallings 2005].
     É importante observar que os dispositivos móveis possuem cada vez mais


2
Técnicas para Diminuir o Consumo de Energia



     Tabela 6.1. Exemplo de Desempenho Computacional de
     Dispositivos Móveis [Bartlett et al. 2000]




recursos em hardware que permitem a execução de tarefas cada vez mais
variadas e complexas. Porém, eles são fortemente dependentes do bom funci-
onamento e capacidade da bateria, que é a fonte de energia.




     Figura 6.1. Consumo de Potência de Pico em Processa-
     dores da Intel

    No lado esquerdo da Figura 6.1 é possível observar que os processadores
cada vez mais aumentam a sua freqüência de operação e usam também um
número maior de componentes em hardware (portanto, há um maior número
de transistores sendo utilizados), o que produz um aumento no desempenho
computacional, porém, aumenta-se também o consumo de pico, medido em


                                                                         3
E. Moreno e R. Barreto



watts, desses dispositivos.
    No lado direito da Figura 6.1 mostra-se o consumo da bateria de um dis-
positivo móvel. Quando não se executa nenhuma aplicação, ela começa a se
descarregar de forma natural, e a capacidade de oferecer energia diminui com
o avanço do tempo. Essa situação se torna ainda mais critica quando ela é efe-
tivamente usada, fazendo com que a sua descarga total aconteça bem antes
do tempo máximo de funcionamento (dado pelo funcionamento em standby).
Na Figura 6.1 (lado direito), por exemplo, a bateria normal teria uma duração
de 45 horas, porém quando o dispositivo começa a funcionar, ela tem uma
duração máxima de 14 horas, ou seja, em torno de 30% da sua capacidade
total.
    Obviamente esses tempos variam para cada dispositivo e para cada forma
de utilização. Assim, o mesmo dispositivo pode ter um tempo menor se exe-
cutar operações críticas, ou se possuir mais elementos de hardware do que o
necessário para uma determinada função.
    A seguir, algumas outras informações que motivam a realização de pesqui-
sas na área de otimização do consumo de energia em sistemas computacio-
nais, de acordo com [Yang et al. 2004] e [Hsu 2003]:

    • Há um aumento de consumo de energia da família de processadores
      da INTEL: de 7.9W para o processador Pentium 133MHz para 82W do
      Pentium-IV a 3GHz.
    • Em 1992 a dissipação mundial de potência dos processadores tipo PC
      foi de 160 MegaWatts. Em 2001 aumentou para 9000 MegaWatts.
    • No mesmo período, 8% da energia consumida nos Estados Unidos foi
      com o uso de Internet e estima-se que para o ano 2020 chegue a 30%.
    • O consumo aumenta os custos relacionados com o encapsulamento dos
      chips, ar condicionado, salas de refrigeração, etc. Esses custos repre-
      sentam 25% dos custos totais do projeto.
    • A Intel estima que o custo dos chips produzidos seja aumentado em mais
      de $1/W, toda vez que o consumo excede a faixa de 35 a 40 W.
    • A taxa de falhas dos chips duplica a cada 18◦ F de aumento da tempera-
      tura.

    O consumo de energia nesses dispositivos é altamente dependente das
suas características tecnológicas e arquiteturais, das características de cada
componente que compõem o dispositivo, da forma de operação, e do próprio
funcionamento. As características de funcionamento dependem também dos
aplicativos que ele consegue executar, da forma em que esses programas exe-
cutam, e até na forma em que essas aplicações são programadas. Portanto,
conhecer o consumo de energia de um dispositivo móvel é uma tarefa com-
plexa e dependente de muitas variáveis, o que a torna um desafio.


4
Técnicas para Diminuir o Consumo de Energia



    Conhecer como um dispositivo consome a energia (caracterização do con-
sumo) é um dos primeiros passos no sentido de aplicar e criar métodos e téc-
nicas com o objetivo de melhorar o consumo e permitir que esses dispositivos
sejam então usados por mais tempo e com bom desempenho.
    O objetivo geral deste capítulo é apresentar e discutir as diferentes técnicas
existentes para diminuir o consumo de energia em sistemas computacionais,
com ênfase em sistemas embarcados, ao mesmo tempo em que pretende-se
mostrar que é importante que os projetistas entendam a necessidade de levar
em consideração o consumo de energia em aplicações modernas. O capítulo
discute também assuntos e técnicas que continuam sendo alvo de pesquisa
e desenvolvimento para diminuir o consumo de energia, principalmente em
dispositivos móveis.
    Uma contribuição deste trabalho é dedicar esforços ao problema do con-
sumo de energia, o qual se torna crítico em sistemas móveis, principalmente
em sistemas de telefonia celular.

6.2. Nível de Circuito
   Nesta seção são apresentadas as principais técnicas e o estado da arte
para diminuir o consumo de energia sob o ponto de vista do projeto de circuitos.
   A Equacão 1 expressa o cálculo do consumo de potência.

                      P = αCVdd f + T αVdd Ishort f +Vdd Ileak
                             2      ˇ                                          (1)
Onde:
V dd = voltagem;
f = freqüência do relógio;
C = capacitância de carga;
α = densidade de chaveamento (ou transição);
 ˇ
T = parâmetros físicos do dispositivo que dependem do semiconductor;
Ishort = corrente de curto circuito; e
Ileak = corrente de fuga.

    Neste caso, de acordo com a Equacão 1, observa-se que o valor de potên-
cia (P) depende de variáveis como: voltagem ou tensão (Vdd ), freqüência ( f ),
densidade de chaveamento ou de transição (α ), da corrente de fuga (Ileak ), e
de algumas constantes e parâmetros físicos que dependem do material semi-
                                                   ˇ
condutor sendo usado na construção do circuito (T ).
    A potência de consumo em um circuito baseado em CMOS depende de 3
componentes principais: curto circuito, estática e dinâmica.
    • A parte de curto circuito refere-se aquela energia perdida quando a
      fonte de tensão é colocada no terra, isto é, deve-se ao fenômeno de curto
      circuito que acontece toda vez que há um processo de chaveamento dos
      circuitos. Este tempo geralmente é muito pequeno e acontece em um pe-
      queno período de tempo. Por isso, não interessa muito do ponto de vista
      computacional e sim do ponto de vista eletrônico. Segundo [Hsu 2003]


                                                                                5
E. Moreno e R. Barreto



      e [Yang et al. 2004], este valor está se tornando crítico nos circuitos na
      medida em que se diminui o tamanho dos transistores usados.
    • A parte estática captura a energia perdida devido à corrente de fuga
      (leakage), que acontece independentemente do estado das portas, isto
      é, de forma contínua. Esta corrente vem se tornando cada vez mais
      relevante, devido à tensão limiar que está sendo usada. Geralmente de-
      pende da área do circuito, da tecnologia de fabricação e do estilo usado
      no projeto do circuito. Segundo [Yang et al. 2004], para chips baseados
      na tecnologia CMOS, representa de 2% a 5% da dissipação de potencia
      total. Atualmente, esse valor encontra-se próximo de 15% e, no futuro,
      essa influência tende a aumentar.
    • A parte dinâmica mede o consumo de carga e descarga dos capacitores
      na saída de cada porta lógica quando alguma operação de computação
      é realizada. Este componente é o de maior interesse e tem sempre
      dominado o consumo em dispositivos.
    Pode-se isolar o consumo dinâmico como sendo:

                                 P = αCVdd f
                                        2
                                                                             (2)
Onde:
V dd = voltagem;
f = freqüência do relógio;
C = capacitância de carga; e
α = densidade de chaveamento (ou transição).

    Na Equação 2 pode-se notar que a voltagem é o principal componente
do consumo de potência porque é um termo quadrático. Contudo, a redução
da voltagem tem um efeito negativo no atraso e, com isso, o desempenho é
também afetado.
    Neste caso, é sugerido primeiro reduzir a potência por outros meios, e fi-
nalmente reduzir a voltagem tanto quando possível de acordo com o requisito
de desempenho [Shin and Choi 1997].
    No contexto deste capítulo, é essencial identificar a diferença entre “po-
tência” e “energia”. Apesar de serem muito próximas, referem-se a conceitos
distintos. A energia (E) é simplesmente o produto do tempo de execução pela
potência média, enquanto que potência é a taxa na qual a energia é consumida
[Tiwari et al. 1996]. Nesse caso, tem-se as seguintes equações:

                                  E = P×T                                    (3)

                                  T = N ×τ                                   (4)
Onde:
N = ciclos;


6
Técnicas para Diminuir o Consumo de Energia



T = tempo de execução;
τ = período = 1
              f

   Se as fórmulas 2, 3 e 4 forem juntadas é possível obter a seguinte expres-
são:

        V dd 2 ·C
   E=      2        ·α ·N

     Assumindo que (V dd 2 /2)C é uma constante K pode-se verificar que o con-
sumo de energia depende dos ciclos de relógio (N) e da densidade de transição
(α ). Neste caso

                                     E = K ·α ·N                             (5)



    Conseqüentemente, para diminuir o consumo dinâmico, os principais pon-
tos da análise tentarão reduzir a densidade de chaveamento α , tanto quanto
possível, por diferentes meios [Shin and Choi 1997].
    Observando a Equação 1, é possível verificar que outra forma de diminuir
a potencia energética de um circuito é diminuindo o valor da capacitância, o
qual pode ser diminuído usando algum outro material semicondutor, ou usando
técnicas mais avançadas no projeto dos transistores que são o elemento base
de todo sistema digital. Nos últimos anos as pesquisas têm sido direcionadas
para a diminuição do canal de cada elemento transistor mas, infelizmente, esse
processo traz um efeito colateral que é o aumento do valor da corrente de
fuga (Ileak ), o qual obriga a pensar em alternativas diferentes para diminuir o
consumo de energia.
    Essa técnica relaciona-se com a criação e uso de novas tecnologias di-
ferentes do tradicional uso de circuitos baseados em Silício. Essa parte das
pesquisas está mais relacionada com novos processos e com técnicas de mi-
croeletrônica. Outro destaque é a criação de circuitos que usem menos tran-
sistores, o que certamente traz redução no consumo de energia.
    Na comunidade tem-se iniciado também muitos trabalhos para projetar ou-
tros elementos base nos sistemas digitais, como é o flip-flop, com característi-
cas de baixo consumo. Busca-se que o flip-flop seja de baixa potência quando
está em seu estado normal de operação, e em baixo consumo de corrente de
fuga (leakage) quando está em seu estado de não operação.
    Isso tem sido alcançado por meio de metodologias como clock gating e data
gating [Srikantam and Martinez 2002]. Clock gating é um método para reduzir
a potência ativa durante os períodos ociosos (idle) de operação do circuito.
Não é permitido que as entradas desses blocos mudem, pois existe a ação
dos flip-flops disparados por relógio, o que evita computação desnecessária
conseguindo então diminuir o consumo desnecessário.


                                                                              7
E. Moreno e R. Barreto



    Ferramentas de projeto para ASICs são capazes de gerar sinais do tipo
clock gating e sleep, para conseguir determinar os períodos de inatividade
em um circuito [Srikantam and Martinez 2002]. Basicamente, um sinal do tipo
sleep ou do tipo enable desativa o clock não permitindo, então, que o flip-flop
consiga ter um novo dado.
    A Figura 6.2 mostra uma forma simples de ter um circuito baseado em
clock gating. Observa-se que quando o valor de enable = 0 e Clkin = 0, o flip-
flop não deixa passar qualquer dado, economizando potência. Não obstante,
esta forma é somente aplicável a flip-flops estáticos, pois o mestre é estático e
o latch escravo mantém o dado quando o clock está desativado. Esta forma de
economia apresenta os problemas de teste e cobertura de falhas [Srikantam,
2002]. Em flip-flops dinâmicos o relógio tem que estar executando de forma
contínua para o dado poder ser armazenado (latched). Se o relógio é desabili-
tado, os nós internos podem ficar em estados não definidos, uma vez que não
há re-alimentação (feedback) causando que a saída seja não definida.




     Figura 6.2. Estrutura Simples da técnica CLOCK-Gating
     [Srikantam and Martinez 2002].

     Para evitar esse problema, usa-se outra alternativa de projeto, chamada de
data gating, que consiste em parar o dado antes de ter-se um sinal de relógio,
conforme mostrado na Figura 6.3. Nesta figura observa-se que quando o sinal
enable = 0, o flip-flop mantém a saída. Quando enable = 1, um novo dado é
permitido ser usado. O efeito é o mesmo da técnica clock gating e também
não apresenta problemas de teste. Esta técnica é mais usada em projetos de
alto desempenho, pois não apresenta problemas de teste, além de ter maior
eficiência no consumo de energia.
     Outra técnica de destaque relaciona-se com o projeto de dispositivos de
memória eficientes no consumo de energia. Em [Daughton et al. 2002] é pro-
posto um circuito capaz de armazenar informação ainda em estados de baixo
consumo até que o dado seja efetivamente usado. Portanto, os autores criaram
um elemento de memória capaz de guardar o dado em um estado desligado
(off). Para tanto, eles decidiram usar uma MRAM (Megnetoresistive Random
Access Memory). Esta tecnologia usa o fenômeno de histereses, próprio de


8
Técnicas para Diminuir o Consumo de Energia




     Figura 6.3. Estrutura Simples da técnica data gating
     [Srikantam and Martinez 2002].



materiais magnéticos, para armazenar dados e as propriedades de magneto-
resistência de novos materiais para realizar operações de leitura de dados. As
células de memória são depositadas em substratos de circuitos integrados, os
quais fornecem funções de seleção de bits e de sensoriamento dos circuitos.
Segundo [Beech et al. 2000], a MRAM tem o potencial de ser ideal para todos
os propósitos, pois ela é relativamente rápida, densa e não volátil.
    Em termos práticos e gerais, observa-se que a potência consumida au-
menta de modo linear quando se aumenta a freqüência, e a potência aumenta
quadraticamente com o aumento da tensão Vdd . É bom lembrar que sempre
se deseja ter sistemas com mais desempenho e com eficiência energética. Na
tentativa de ter sistemas com melhor desempenho aumenta-se a freqüência
mas, neste caso, aumenta-se a energia consumida. Outra forma é diminuindo
os valores de tensão aplicada, mas isso faz com que exista menos energia e,
portanto, faz com que o sistema seja usado com uma duração menor, além
de ter uma possível diminuição do seu desempenho. Portanto, há um com-
promisso de projeto, e os projetistas ou os usuários devem estar cientes deste
compromisso.
    Para melhorar o consumo de energia, existem propostas baseadas em
hardware e a respectiva contrapartida daquelas baseadas em software.
    As soluções em hardware focalizam o projeto de novos componentes, a
definição de novas arquiteturas e a utilização de novas tecnologias, que con-
sumam menos potência. O re-projeto de circuitos ou componentes baseados
em software, visa criar uma nova versão de um programa que tem a mesma
funcionalidade, mas com menor consumo de potência.
    Assim, uma técnica bastante usada é conhecida como escalonamento de
voltagem (voltage scaling), a qual permite ajustar, em tempo de execução, a
freqüência do processador e a tensão fornecida, sob controle do software de
aplicação.
    Alguns resultados podem ser vistos na Figura 6.4. A figura mostra que com
o aumento da freqüência de operação, aumenta-se também a corrente consu-


                                                                            9
E. Moreno e R. Barreto



mida pelo circuito, o que produz um aumento no consumo de energia. Isso é
válido para os diferentes programas executados. O lado direito da Figura 6.4
mostra o comportamento do consumo de energia para o programa FFT. Neste
caso, verifica-se que com o aumento da tensão ou freqüência, aumenta o con-
sumo de energia medido em Joules.




     Figura 6.4. Impacto de Diminuir Voltagem e Freqüência
     [Ellis 2003]

    A técnica de usar vários valores de tensão e/ou de freqüência está se tor-
nando tão significativa, que na atualidade há vários processadores que ofere-
cem a posssibilidade de ter vários níveis de tensão, e o valor de funcionamento
pode ser selecionado pelo usuário. Por exemplo, a Figura 6.5 mostra que o pro-
cessador StrongARM permite dois valores (233 MHz e 2V e, 175 MHz e 1.5V),
enquanto o processador XScale permite cinco possíveis valores, a saber: 150
MHz e 0.75V, 400 MHz e 1.0V, 600 MHz e 1.3V, 800 MHz e 1.6V e, 1 GHz e
1.8V.
    A Figura 6.5 permite visualizar o desempenho (medido em MIPS - Milhões
de Instruções Por Segundo) e a potência consumida pelo processador (medida
em watts). Nesta figura observa-se que tanto o desempenho quanto a energia
do processador aumenta, conforme também aumenta os valores de tensão e
de freqüência.
    Na Figura 6.5 também é possível observar que o processador StrongARM
possui consumo de energia maior que o desempenho, enquanto o processador
XScale possui menor consumo de energia. Isso se deve ao fato de que a
Intel tem investido em pesquisas e técnicas para diminuição do consumo de
energia. A Tabela 6.2 mostra a política de diminuição de energia que a Intel
tem especificado para um sistema computacional, assim como para cada um
de seus principais componentes.
    Na Tabela 6.2 é possível observar que a Intel possui um projeto de cons-
trução de um notebook, o qual tem aproximadamente 50% do consumo de um


10
Técnicas para Diminuir o Consumo de Energia




     Figura 6.5. Voltagem e freqüência no processador Intel
     XScale [Intel 2005].


sistema normal. Isso será possível usando técnicas para diminuir o consumo
da maioria dos componentes que constituem o sistema. Os componentes que
terão diminuição são: o processador, a memória cache, o subsistema gráfico,
o subsistema de áudio, a fonte de potência, e o sistema de tela. Os outros
componentes não apresentam muita diferença com os sistemas já existentes.
    Um outro ponto importante relacionado com a técnica de mudar os valores
de tensão e de freqüência, é que é possível mudar ambas variáveis ao mesmo
tempo, tendo assim um maior impacto na diminuição do consumo de energia.
Só recomenda-se ter cuidado, pois diminuir esses valores pode acarretar pro-
blemas de degradação do desempenho, conforme se observa na Figura 6.5.
    Essa mudança pode acontecer de forma estática, isto é, antes de se ini-
ciar a execução de um determinado programa. Porém, o grande desafio atual
é realizar essa mudança de forma dinâmica, isto é, em tempo de execução.
Essa técnica é conhecida como DVS - Dynamic Voltage Scaling, ou mais com-
pleta ainda DVFS, que inclui também a possível mudança dinâmica do valor da
freqüência de operação do sistema.
    Outra técnica está ligada com a otimização dos dados e/ou do código na
memória. Esta técnica pode produzir um menor uso dos componentes do sis-
tema. As otimizações de código, por exemplo, podem produzir menos tran-
sições dependendo da forma como o código é executado e, também, da or-


                                                                         11
E. Moreno e R. Barreto



     Tabela 6.2. Comparação nos Objetivos de Potência em
     Sistemas Intel [Intel, 2005]




ganização dos bits. Conseqüentemente, pode-se ter resultados diferentes no
consumo de energia dependendo, principalmente, da ordem de execução das
instruções.
    Da mesma forma, de acordo com o dado a ser enviado, pode-se ter diferen-
tes arranjos e diferentes consumos. Na Figura 6.6 tem-se que enviar 2 bytes
0xFF e 2 bytes 0x00, existem diversas formas de arranjá-los considerando que
a atividade de chaveamento (ou transição) pode variar de 1, 2, ou 3 transi-
ções. Se a preocupação principal for economia de energia, então tem-se que
procurar o melhor arranjo.




 Figura 6.6. Exemplo de atividade de chaveamento ou transição.


    Um exemplo do consumo de energia e da quantidade de energia salva pode
ser dado usando como medida a distância de Hamming [Lin and Costello 1993],


12
Técnicas para Diminuir o Consumo de Energia



que é a diferença entre duas strings binárias de mesmo tamanho. Em outras
palavras, a distância de Hamming é o número de bits que diferem na mesma
posição em duas seqüências de igual tamanho. Esta medida pode ser usada,
por exemplo, para estimar o consumo de energia e a quantidade de energia
que pode ser economizada. Supondo que é desejado transmitir os 5 bytes se-
guintes 0xB3, 0x4C, 0xAB, 0x58, 0xBE. Se o dado for transmitido na ordem
mencionada pode-se ver na Figura 6.7(a) que haverá 30 transições, ou seja,
a distância de Hamming é 30. Por outro lado, na Figura 6.7(b) o mesmo con-
junto de dados é transmitido com apenas 20 transições (a nova distância de
Hamming é 20). Neste caso, tem-se uma economia de (1 − 20 ) = 33% nas
                                                              30
transições, o que representa uma boa economia de energia.




      Figura 6.7. Seqüência de dados e código de Hamming.

    É importante ressaltar que as técnicas de DVFS e a de re-organização dos
dados estão intimamente ligadas às técnicas de diminuição de consumo de
energia pelos compiladores. Estas técnicas são melhor explicadas nas Seções
6.3 e 6.5. Entretanto, é importante ter em mente que elas produzem, também,
diminuição de energia devido aos circuitos.

6.3. Nível de Arquitetura
    Esta seção apresenta as principais considerações para diminuir consumo
de energia, sob aspectos e técnicas arquiteturais. Como exemplo pode-se
mencionar que há esforços na tentativa de definir o conjunto de instruções
de forma específica à aplicação, os conhecidos ASICs (circuitos integrados de
aplicação específica) e ASIPs (processadores de aplicação específica).
    Além disso, outra técnica é definir instruções específicas que permitam ter
as mesmas funcionalidades de uma instrução normal, porém com critérios de
menor consumo. Como exemplo, pode-se mencionar que haverá instruções
especiais para acessar memória, instruções para acesso eficiente a memória
cache, instruções que permitam realizar funcionalidades mais complexas dedi-
cadas a somas, multiplicações e outras operações aritméticas eficientes tanto
em desempenho quanto em consumo de energia.


                                                                          13
E. Moreno e R. Barreto



    Outro ponto relevante é o uso de arquiteturas reconfiguráveis, as quais
permitem reconfigurar de forma dinâmica não somente o conjunto ISA, mas
também as funcionalidades arquiteturais de um determinado circuito em função
das necessidades específicas da aplicação [Hauck 2008].
    Conforme discutido em [Silva et al. 2007], a técnica rISA (ou Reduced Bit-
width Instruction Set Architecture) é um recurso arquitetural empregado para
reduzir o tamanho do código de programas [Shrivastava et al. 2002]. Alguns
processadores possuem este recurso e executam instruções baseados em dois
conjuntos distintos. Um deles é o conjunto normal ISA do próprio processador
e o outro é o conjunto de instruções reduzidas, o qual engloba as instruções
mais freqüentes, existentes no código do programa, as quais são codificadas
em um número menor de bits. Alguns exemplos de processadores que usam
esta técnica rISA são: o processador ARM7TDMI, o TinyRISC, o ARC Tangent,
o STMicro da família ST100 e o MIPS32/16 bit.
    Segundo [Silva et al. 2007], os processadores baseados na técnica rISA,
expandem dinamicamente as instruções reduzidas em suas correspondentes
instruções normais. Conforme afirmado por [Shrivastava et al. 2002], cada ins-
trução reduzida conta com uma instrução equivalente no conjunto de instru-
ções normal, fazendo com que o processo de tradução seja simples e direto,
o que exige somente a inclusão de uma simples unidade de tradução no hard-
ware do processador. Importante observar que nenhum hardware adicional é
necessário.
    Além da redução de tamanho do código do programa, um programa com
instruções reduzidas requer menos acessos à memória de instruções quando
é executado. Conseqüentemente, há um decréscimo no consumo de ener-
gia neste subsistema. Se todo o código do programa pudesse ser expresso
em termos de instruções reduzidas, então aproximadamente 50% de redução
de tamanho seria obtida e, conseqüentemente, haveria uma proporcional redu-
ção no consumo de energia na memória de instruções [Shrivastava et al. 2004,
Silva et al. 2007].
    Segundo [Silva et al. 2007], o uso do rISA para a redução do tamanho do
código de programas e, conseqüentemente, para a redução do tamanho da
memória ROM exigida no sistema, diminui o custo do produto final. Seguindo a
linha de pesquisa de [Shrivastava et al. 2004], os processadores contemporâ-
neos que usam rISA, e suas implementações que usam instruções reduzidas,
dependem também dos formato que essas instruções seguem.
    Em [Shrivastava et al. 2002], foram empregados diversos formatos, os quais
variam na quantidade de bits que empregam para a especificação dos diferen-
tes campos da instrução (opcode, registradores e imediatos), assim como no
emprego ou não de instruções especiais, que não fazem parte do código origi-
nal do programa, e que têm como objetivo complementar informações que não
podem ser representadas com o reduzido número de bits disponível no formato
em questão.
    Segundo [Silva et al. 2007], essas instruções reduzidas especiais, como


14
Técnicas para Diminuir o Consumo de Energia



rISA extend, por exemplo, usada para completar valores imediatos, requerem
um processo de tradução mais complexo e geram um impacto negativo no de-
sempenho da aplicação, como será explicado na próxima seção. O número de
bits usados para especificar o opcode, nestes formatos abordados, é 4 e 7, o
que permite a redução de 16 e 128 instruções distintas (diferentes opcodes)
do código original, respectivamente. Eles relatam que o formato rISA-4444 (16
opcodes distintos e acesso a 16 registradores por operando) apresenta o me-
lhor resultado em termos de redução de código, levando-se em consideração o
compromisso entre a redução obtida e a complexidade da unidade de tradução.
O trabalho descrito por [Shrivastava et al. 2004], afirma que a principal vanta-
gem de rISA é a alta taxa de compressão de código e a economia de energia,
vantagens obtidas com um mínimo de alterações no hardware do processador.
    Levando em consideração as analises anteriores, [Silva et al. 2007] con-
seguiu mostrar que a existência de um algoritmo de busca para redução de
código não é suficiente para atingir os melhores resultados em termos de con-
sumo de energia, uma vez que não leva em consideração o aspecto dinâmico
de execução da aplicação. Silva mostrou e analisou também um algoritmo que
leva em consideração este aspecto dinâmico. O algoritmo foi aplicado e usado
em um processador MIPS com e sem memória cache, obtendo uma economia
média de 26% no acesso à memória de instruções em um modelo base rISA,
em uma organização sem memória cache.
    Outra técnica arquitetural relaciona-se com o tratamento da fila de execu-
ção das operações fora de ordem (out-of-order execution). Nos processadores
que adotam pipeline com a técnica de execução fora de ordem, varias instru-
ções fora da ordem normal e seqüencial podem ser executadas conforme os
dados das próximas instruções estejam disponíveis. Só que esses dados de-
vem ser armazenados em buffers especiais, o que acarreta um acréscimo no
consumo de energia.
    Em [Buyuktosunoglu et al. 2002], foi mostrado um trabalho de pesquisa di-
recionado a técnicas que significativamente diminuem a potência das filas de
execução enquanto mantém o funcionamento de alto desempenho. Eles pro-
puseram duas técnicas: a primeira é a implementação de uma estrutura CAM/-
RAM para a emissão de instruções na fila de instruções aptas para serem exe-
cutadas, e um modelo adaptativo que libera a inserção e transmissão de portas
(ver Seção 6.2, que discute os circuitos ativos ou não, em função da sua atual
necessidade de funcionamento). Segundo os autores, a utilização dessas duas
técnicas fornece um ganho de 73% na diminuição de energia consumida pelos
processadores executando o benchmark SPEC CPU 2000, com somente 3%
de degradação do desempenho.
    A Figura 6.8 mostra o impacto dessa técnica, quando comparada a técnicas
normais como aquelas que somente usam sistemas baseados em clock gating,
ou sistemas que usam a técnica de data-gating. Observa-se que a técnica
de CAM/RAM permite um ganho de até 60%, na diminuição do consumo de
energia.


                                                                            15
E. Moreno e R. Barreto




     Figura 6.8. Dissipação alternativa na emissão de instru-
     ções [Buyuktosunoglu et al. 2002].



    A idéia central baseia-se no fato de cada aplicação possuir um padrão de
execução e, portanto, pode-se ajustar a fila das instruções que podem ser exe-
cutadas. Outras técnicas baseiam-se no fato de realizar um escalonamento
estático, dando ênfase na redução da complexidade da lógica de emissão
dessas instruções [Canal and Gonzalez 2000, Folegnani and Gonzalez 2000,
Folegnani and Gonzalez 2001].
    Outra vertente de otimização do desempenho de um programa relaciona-
se com diminuição do número de instruções, o qual melhora também a energia
consumida uma vez que se diminui o número de ciclos necessários para com-
pletar uma tarefa [Grunwald 2002]. Esta técnica está intimamente ligada ao
melhoramento e eficiência de algoritmos e compiladores.
    Alguns trabalhos, por exemplo [Patterson and Hennessy 2007], têm focado
em técnicas de especulação, que é uma ferramenta fundamental em arquite-
tura de computadores, pois permite que uma implementação arquitetural al-
cance alto paralelismo de instruções e, portanto, alto desempenho, tentando
fazer predição de algum resultado de alguns eventos específicos. A maioria dos
processadores atuais implementam predição de desvios (branch) para permitir
mudanças especulativas no fluxo de controle, enquanto outros trabalhos tem
focado em predição de valores de dados para diminuir as dependências de da-
dos [Graybill and Melhem 2002, Lipasti 1997]. Importante salientar que o uso
inadequado de técnicas de especulação faz com que exista trabalho perdido, o
que pode trazer uma sobrecarga no consumo de energia.
    O trabalho de [Grunwald 2002] propôs duas técnicas para melhorar a es-
peculação. Uma das técnicas usa intervalos de confiança para implementar
melhor a técnica de pipeline gating. Intervalo de confiança é uma técnica que
permite aumentar a qualidade de uma determinada predição, enquanto pipe-
line gating é uma técnica de controle da especulação que usa intervalo de
confiança para reduzir a especulação em processadores com pipelining. A


16
Técnicas para Diminuir o Consumo de Energia



diminuição da atividade de processamento diminui o número de buscas de ins-
truções realizadas pelo processador, o que pode então diminuir a energia. A
outra técnica proposta por [Grunwald 2002] faz um maior controle da especu-
lação usando técnicas de escalonamento de voltagem (DVS).
    Como se observa, várias técnicas estão intimamente relacionadas e po-
dem ser usadas em conjunto. Interessante perceber que há novamente certo
paradoxo entre desempenho e energia. Para aumentar o desempenho, os pro-
cessadores têm incluído melhoramentos arquiteturais baseados em técnicas
agressivas de especulação, aumentando o paralelismo de instrução. Estas
melhorias têm aumentado o número de instruções por ciclo (IPC - Instructions
Per Cycle), aumentando assim o consumo de energia, o qual pode se tornar
ainda mais crítico se houver trabalho perdido, isto é, se a especulação não
for adequada. Neste sentido, quando o alvo do projeto é a energia, então é
necessário usar técnicas de pipeline gating, que visa melhorar ou diminuir a
percentagem de instruções que estimulam a especulação [Grunwald 2002].
   A Figura 6.9 mostra o consumo de potência de um processador Pentium-
Pro, o qual foi dividido em função do consumo de cada componente. Observa-
se que os componentes que mais demandam consumo são a busca e a de-
codificação, assim como a utilização das memórias cache e os componentes
para realizar o escalonamento dinâmico. Por esse motivo, pesquisadores têm
dedicado muito esforço investigando como diminuir o consumo nesses compo-
nentes.




     Figura 6.9. Consumo de Energia em um Processador
     com Pipeline [Grunwald 2002].


                                                                         17
E. Moreno e R. Barreto



    É possível observar também que há várias operações que requerem a exe-
cução de várias operações micro-arquiteturais, as quais acabam consumindo
mais energia do que a instrução de processamento desejada. Por exemplo,
quando se realiza uma soma de dois inteiros em uma máquina RISC, somente
5% do consumo total de energia é devido à circuitaria do próprio somador, o
restante é dissipado por estruturas tais como tag do cache, arranjos de dados,
TLBs, arquivos de registradores, registradores do pipeline, e lógica do controle
do pipeline [Grunwald 2002].
    Portanto, dada a consideração anterior há vários estudos que tentam mu-
dar o padrão de acesso ou o uso de alguns desses componentes, visando en-
tão diminuir o consumo sem afetar consideravelmente o desempenho. Nesse
sentido, [Grunwald 2002] propôs três técnicas, sendo duas delas arquiteturais
e uma terceira devido ao compilador.
    Uma das técnicas consiste em usar latches especiais para realizar um by-
pass exposto, com ajuda de uma arquitetura baseada em acumulador, que usa
informação do tempo de vida de um registrador (em tempo de compilação) para
reduzir o número de leituras e escritas ao arquivo de registradores realizados
em tempo de execução. Em uma computação, vários valores de registradores
possuem uma vida curta, pois são produzidos por uma instrução e consumidos
pela instrução seguinte, e nunca mais são usados novamente. A informação
do tempo de vida desses registradores pode ser codificada adicionando regis-
tradores do acumulador a registradores de propósito geral da arquitetura RISC,
permitindo então que o software passe esses valores diretamente de uma ins-
trução à próxima, sem necessidade de acessar esses registradores de propó-
sito geral. [Grunwald 2002] mostrou que essa técnica pode remover 34% de
todas as escritas em registradores e uma média de 28% dos acessos a todas
as leituras.
    A segunda técnica proposta por [Grunwald 2002] é uma otimização dos
acessos aos tags quando se faz uso da memória cache. Em processadores de
baixo consumo de energia, os acessos aos tags são responsáveis por aproxi-
madamente 50% da energia usada quando se faz um acesso ao cache. Eles
conseguiram mostrar que há casos onde se pode verificar 2 acessos ao mesmo
bloco do cache e, neste caso, se realiza então uma marcação de operações
load e store, em tempo de compilação, que fazem com que o hardware evite de
checar o tag do segundo acesso. Os autores mostraram que é possível indicar
até 70% da checagem dos tags, em experimentos realizados com programas
do SPECint95 e do benchmark Mediabench.
    Em termos de arquitetura, pode-se também pensar em adicionar instruções
especiais ao conjunto ISA do processador, que permitam realizar otimizações
aos acessos de memória, incluindo otimizações de código que permitam ter
mais dados nas memórias caches. Essas otimizações são necessárias, pois
conforme mostra [Tiwari and Lee 2005], na Tabela 6.3, os acessos a dados que
não estão no cache ou não estão na memória principal de um computador 486
DX2 são críticos em termos de consumo de energia.


18
Técnicas para Diminuir o Consumo de Energia



     Tabela 6.3. Consumo de Energia em Instruções e Opera-
     ções de Memória [Tiwari and Lee 2005].




    Os dados da Figura 6.10 foram obtidos por [Marwedel et al. 2005] a partir
da utilização do simulador CACTI. A parte superior da Figura 6.10 mostra o
comportamento do consumo de energia (medido em nJ) conforme se aumenta
o tamanho da memória. A parte intermediária da Figura 6.10 mostra a energia
por acesso a memória em função do tamanho de memória, para vários tama-
nhos de sub-bancos de memória, e a parte inferior da Figura 6.10 mostra o
tempo de acesso (ns) em função do tamanho da cache, também para vários
sub-bancos de memória. Os autores concluíram os benefícios em se usar pe-
quenas memórias, e caso a memória seja de tamanho maior, então, sugerem
o uso de sub-bancos.

6.4. Nível do Sistema Operacional
    Esta seção apresenta as principais técnicas para otimizar o consumo de
energia em sistemas embarcados, sob uma visão de mudar e otimizar as fun-
ções inerentes ao sistema operacional.
    Técnicas em hardware conhecidas como clock gating permitem ao software
colocar os recursos em um estado de hibernação quando eles se encontram
no estado ocioso (idle), e muda depois seu estado, para o de execução ou de
operação quando são novamente solicitados para alguma operação. Em geral,
essas técnicas confiam na existência de uma camada arquitetural que permite
acesso aos múltiplos modos ou configurações de potência sempre sob con-
trole do software. Esses modos de potencia têm diferentes compromissos de
desempenho e potencia. A idéia é que o software (aplicação) consiga gerenciar
esses modos satisfazendo certa demanda de desempenho enquanto reduz a
potencia da CPU (ou de outros componentes) tanto quanto seja possível.
    Interessante observar que a configuração desses modos de potência, em
função dos diferentes estados de execução da CPU, podem ser também apli-
cados a outros componentes e a dispositivos não necessariamente micropro-
cessados.
    A Figura 6.11 mostra a distribuição e uso dos diferentes estados de compo-
nentes eletrônicos. Pode se visualizar que há tempo para operação e tempos
em que esses componentes estão em estado dormente (sleeping) ou ocioso


                                                                           19
E. Moreno e R. Barreto




     Figura 6.10. Impacto da memória no consumo de ener-
     gia [Marwedel et al. 2005].


(idle), e seria interessante aproveitar esses tempos para desligar esses com-
ponentes ou aplicar alguma técnica para que nesses estados o consumo dimi-
nua.
     A Tabela 6.4 mostra duas placas de transmissão de dados onde os diferen-
tes estados possuem um consumo de energia diferente, o que valoriza ainda
mais a idéia de criar técnicas e ou mecanismos que permitam mudar o estado
de operação dos componentes visando um menor consumo. Nessa tabela é
possível verificar que o estado de menor consumo é o sleep, seguido pelo es-
tado idle. Observe que quando o componente se encontra em operação de
transmissão, o consumo de energia é bem maior (em torno de 47%) do que
quando está em operação de recebimento de dados. Assim, uma idéia se-
ria colocar, se possível, o componente em estado sleep, em invés do estado


20
Técnicas para Diminuir o Consumo de Energia




          Figura 6.11. Transição de estados de execução.


     Tabela 6.4. Consumo de Corrente para Diferentes Esta-
     dos de Execução




idle, economizando de 12 a 23 vezes o consumo desse componente (ver Ta-
bela 6.4).
    Os dados de potência para o processador StrongARM 160MHz, 2 caches-
on chip de 16kB, em função dos seus estados de funcionamento são:
   • Modo Normal Ativo: 450 mW.
   • Modo idle: 20mW, retorna ao normal, não há atrasos. Neste caso, o
     relógio interno é parado.
   • Modo sleep: 150 nW, retorna ao estado normal em 140ns. Neste caso,
     a potencia interna está desligada (off) e os circuitos de I/O permanecem
     ativos.
    Importante salientar que cada componente possui seu próprio sistema de
execução, o que faz com que tenha estados diferentes e cada um deles com
seus próprios tempos de funcionamento.
    Deve-se observar também que na transição de um estado para outro há
um tempo de atraso e esta é uma operação que também consome energia,
conforme se observa na Figura 6.12. Importante salientar que nas transições
ocorre um fenômeno conhecido como transitório elétrico (produzido quando
o sistema ou componente está funcionando em um determinado estado, sob
uma condição, e muda para outro com características físicas diferentes) que
pode ser prejudicial para o consumo de energia do circuito e para seu próprio


                                                                          21
E. Moreno e R. Barreto



funcionamento pois, dependendo do transitório, pode levar a uma falha física
do circuito. Portanto, apesar de ser aparentemente simples de implementar,
deve-se ter cuidado com a energia consumida e com os efeitos gerados nas
transições.




     Figura 6.12. Energia consumida em diferentes estados
     de uma RAMBUS [Ellis, 2003].


6.5. Nível do Complilador
    Esta seção descreve os principais métodos ou técnicas para diminuir o con-
sumo de energia considerando aspectos de otimização do compilador.
    No contexto dessa seção, um otimizador é um programa que recebe como
entrada um programa P e constrói outro programa P , equivalente a P, que é
melhor que P segundo algum critério [Rangel 2000].
    Há diversas formas de se fazer otimização em compiladores. A maneira de
tratar a otimização pode ser extremamente pragmática. Por exemplo, em um
programa grande, a execução gasta 90% em 10% do código, e 10% do tempo
nos 90% do código restantes. Nesse caso, o tempo maior de execução (“os
90%”) é gasto no laço mais interno (“os 10%”) [Aho et al. 2006]. Por isso que
as otimizações são principalmente dedicadas aos laços.
    Até pouco tempo atrás, os otimizadores do compilador enfocavam mais
a questão desempenho e tamanho do código. As otimizações tradicionais,
tais como, eliminação de sub-expressões comuns, eliminação de redundância
parcial, redução de força (strenght reduction), ou eliminação de código morto
simplesmente melhoram o desempenho de um programa por reduzir o trabalho
a ser feito durante a execução do programa [Allen and Kennedy 2001].


22
Técnicas para Diminuir o Consumo de Energia



    Com o avanço dos sistemas embarcados, principalmente os sistemas mó-
veis e sem fio, os quais são dependentes de bateria, surgiu a demanda por
aplicações com baixo consumo de energia/potência. Uma das alternativas de
solução desse problema é a otimização do compilador segundo o critério con-
sumo de energia/potência.
    É sabido que a redução da carga de trabalho (workload) pode também re-
sultar em redução de consumo de potência/energia. Por isso é que há algumas
técnicas de otimização em que o código é otimizado tanto para melhorar seu
desempenho quanto para o consumo de energia. Por exemplo, as otimizações
relacionadas com a hierarquia de memória, tais como bloqueio de laço (loop
blocking ou loop tiling) e alocação de registradores, tentam manter o dado o
mais próximo possível de modo que seja acessado rapidamente. Obviamente
que mantendo o valor na cache, no lugar da memória, ou em um registrador, no
lugar da cache, também ajuda a reduzir o consumo de potência/energia devido
a redução das atividades de chaveamento (ver Seção 6.2).
    Entretanto, existe uma diferença fundamental nos modelos e métricas usa-
dos para otimizar o desempenho das usadas para otimização de consumo de
potência/energia. Muitos modelos e/ou métricas levam em consideração o ca-
minho crítico (critical path), que pode ser definido como a seqüência de ati-
vidades que devem ser concluídas no tempo programado para que o projeto
como um todo possa ser finalizado dentro do prazo final [Woolf 2007]. O ca-
minho crítico pode também ser entendido como o pior caminho a ser seguido.
É importante entender a seqüência do caminho crítico para saber onde há ou
não flexibilidade. Por exemplo, poderá haver uma série de atividades que fo-
ram finalizadas com atraso, no entanto, o projeto como um todo ainda será
concluído dentro do prazo. Isto ocorre porque tais atividades não se encontra-
vam no caminho crítico. Portanto, se uma otimização introduz atividades fora
do caminho crítico o desempenho não é afetado. Quando essas atividades
não-críticas levar a um decremento do caminho crítico, a otimização será be-
néfica. Entretanto, no contexto de otimização de potência/energia, isto não é
verdade. Qualquer atividade, estando ou não no caminho crítico irá contribuir
para a dissipação de potência geral e uso de energia.
    A Figura 6.13 mostra um exemplo que ilustra a diferença de otimização
para potência/energia versus otimização para melhorar o desempenho, consi-
derando uma transformação de código fonte, nesse caso, a movimentação de
código de invariante de laço [Ponce 2006]. No programa exemplo, a atribuição
a = b * 2 é um invariante de laço. Para uma arquitetura escalar tradicional,
esta otimização irá mover a atribuição para fora do laço, resultando no código
da Figura 6.13(b). Em uma arquitetura VLIW (Very Long Instruction Word), o
trecho de código da Figura 6.13(a) pode ser melhor que o código em (b) se
instruções vazias estiverem disponíveis para executar a atribuição invariante
do laço para cada interação do mesmo. Embora a atribuição ocorra 10 vezes,
esta abordagem pode reduzir o caminho crítico. Dependendo da estratégia de
compilação usada, a movimentação da atribuição para fora do laço pode in-


                                                                           23
E. Moreno e R. Barreto



crementar o caminho crítico. No contexto de otimização de potência/energia,
executar computações redundantes devem ser evitadas, e portanto, mover a
atribuição invariante fora do laço tipicamente leva a uma redução do consumo
de potência/energia.

for (i=0; i<10; i++) {                a = b * 2;
  a = b * 2;                          for (i=0; i<10; i++)
  c[i] = d[i] + 2.0;                    c[i] = d[i] + 2.0;
}

           (a)                                      (b)
     Figura 6.13. Comparação entre otimizações [Ponce 2006]

     Outro exemplo onde otimizações para potência/energia pode ser diferente
daquelas relacionadas com a melhoria do desempenho é a execução especula-
tiva [Kaeli and Yew 2005]. A especulação executa atividades à frente baseado
em algumas suposições sobre o comportamento futuro do programa. Se estas
suposições forem falsas, algum trabalho adicional será necessário para desfa-
zer o impacto das atividades especuladas. Software pre-fetching é um exemplo
de tais transformações.
     O compilador pode inserir instruções de pre-fetching para acesso a memó-
ria entre desvios de controle. Essa otimização pode ser muito efetiva, assu-
mindo que a máquina alvo permita múltiplas cargas de dados. Além do mais,
se a atividade especulativa puder ser escondida no caminho de execução não-
crítico, nenhum impacto negativo no desempenho irá ocorrer. No contexto de
otimização de potência/energia cada atividade especulativa adicional tem que
ser compensada pelo benefício geral da otimização a fim de fazer com que os
resultados não sejam piores. Em outras palavras, a janela de benefício tem
que ser maior para potência/energia do que desempenho. Isto não significa
que especulação não possa ser aplicada para otimização de potência/energia,
mas sugere-se uma aplicação menos agressiva dessa transformação restrin-
gindo para casos onde o benefício é mais provável.
     Os primeiros compiladores usavam a velocidade ou tamanho do código
como métricas de otimização. Os compiladores mais modernos incluíram uma
nova métrica, o consumo de energia. A energia consumida por um processador
depende do estado anterior e da entrada atual. Nesse caso, o consumo é de-
pendente da escolha da instrução e a ordem das instruções. Reordenar as ins-
truções pode reduzir a atividade de chaveamento e conseqüentemente o con-
sumo de energia geral. Existem diversos esforços no ajuste de escalonadores
de instruções para otimizar o consumo de energia [Allen and Kennedy 2001,
Ponce 2006]. Uma observação chave nessas otimizações é que o maior deter-
minante do consumo de energia é a atividade de chaveamento (switching) no
caminho de dados (datapaths). Assim, por meio do ordenamento das instru-
ções, de tal forma a reduzir o chaveamento entre instruções sucessivas, pode


24
Técnicas para Diminuir o Consumo de Energia



ser criada uma escala de instruções cujo resultado final produz um menor con-
sumo de energia [Muchnick 1997].
   A seguir será detalhado as abordagens para redução de acesso ao barra-
mento, redução no acesso à memória, técnicas de escalonamento de instru-
ções e transformação de laços [Ponce 2006].

6.5.1. Redução no Barramento
    Com o incremento do tamanho do armazenamento de dados, ao mesmo
tempo em que os processadores estão com grandes palavras de instruções
(instruction words), hoje com 32, 64 ou 128, os barramentos de transmissão de
dados estão ganhando muita importância. É natural que com este incremento,
os barramentos passem a consumir cada vez mais potência. Por causa da lar-
gura e comprimento, barramentos contém uma grande capacitância em suas
linhas. Reduções de consumo de energia importantes podem ser atingidas
por meio da redução da atividade de chaveamento. Algumas técnicas foram
desenvolvidas para reduzir as transições nos barramentos de dados e de en-
dereço [Stan and Burleson 1995, Su et al. 1994]. Código de Gray e inversão
da codificação serão detalhadas nesta seção.




6.5.1.1. Código de Gray

   O código de Gray é devido ao físico e pesquisador da Bell Labs Frank
Gray que em 1953 registrou uma patente nos EUA sobre uma nova forma de
codificação chamada de Pulse Code Communication.
    Código de Gray é uma seqüência binária com a propriedade de que so-
mente um bit é trocado entre qualquer dois elementos consecutivos, ou seja,
os dois códigos têm distância de Hamming igual a um. Na Figura 6.14(a) pode-
se ver a codificação em binário de uma seqüência de números, e na Figura
6.14(b) a mesma seqüência codificada pelo código de Gray. Pode-se calcular
que para os 4 bits, a codificação binária vai requerer 26 transições, enquanto
que a codificação de Gray requer somente 15. Portanto, a redução seria de 11
transições, que corresponde a 42%.
    Uma vez que é comum novas aplicações acessarem grandes quantidades
de dados, é importante encontrar uma forma de endereçar a memória de tal
forma que possa-se reduzir a atividade de chaveamento. Quando o dado a
ser trazido é uma instrução, com exceção das instruções de desvio, na maioria
das vezes o acesso à memória será contínuo devido a execução seqüencial
dos programas. Nesse contexto, para reduzir a distância de Hamming entre
acessos a instruções, uma alternativa para baixo consumo de energia seria a
adoção do código de Gray [Su et al. 1994].


                                                                          25
E. Moreno e R. Barreto




              Figura 6.14. Código binário e código Gray.


6.5.1.2. Inversão de Codificação de Barramento

    Caso a distância de Hamming entre dois acessos consecutivos consecuti-
vos ao barramento seja maior do que a metade do tamanho do barramento, isto
é, mais do que a metade dos bits devem ser trocados, [Stan and Burleson 1995]
propuseram um método que provê redução na atividade de chaveamento no
barramento pela inversão da codificação do barramento. Neste caso, este mé-
todo melhora em pelo menos 50% de redução em cada utilização do barra-
mento. Entretanto, esta abordagem requer um bit extra, como um sinal, para
saber se o barramento está no modo original ou no modo invertido. Con-
seqüentemente, este bit introduz uma atividade de chaveamento adicional, em-
bora usualmente proveja uma redução na potência consumida.

6.5.2. Redução no Acesso à Memória
    Uma grande quantidade de uso do barramento é devido ao acesso à me-
mória, não somente para endereço, mas principalmente para recuperar dados.
Isto possibilita outro meio de economizar potência, uma vez que a partir da
minimização do uso do barramento, a comunicação com os dispositivos de
memória e com outros componentes é otimizada.
    Reduções no acesso a memória externa são obtidos por meio de:
     • incremento da localidade;
     • uso de registradores;


26
Técnicas para Diminuir o Consumo de Energia



   • entrelaçamento de arranjos de dados; e
   • redução de taxa de falta de cache.
    Ao executar otimizações do compilador deve-se tentar usar o máximo pos-
sível de memória interna. Portanto, a prioridade deve ser o uso de registrado-
res internos, depois cache-L1, em seguida cache-L2 e, por último, a memória
externa. Otimizando o código para usar endereços da memória interna, não
somente levará a um melhor desempenho por meio da minimização das ope-
rações de E/S, mas também menos potência devido a minimização do uso do
barramento. Para cada uma dessas opções de otimização, existem aborda-
gens específicas. Para o caso da otimização do uso de registradores, uma
alternativa seria que o compilador reorganize os registradores de tal forma que
os registradores usados em cada rotina estejam o mais próximo um do outro
quanto possível.
    Uma técnica proposta por [Delaluz et al. 2000] é entrelaçar os arranjos de
dados de tal forma que as operações executadas entre arranjos estejam tam-
bém em memória contínua. Um exemplo é mostrado na Figura 6.15. Se esses
arranjos forem constantes, será muito mais simples arranjá-los e predizer o
caminho de dados em tempo de compilação, mas este entrelaçamento pode
também ser feito por qualquer tipo de arranjo que seja usado dentro de um
programa.




         Figura 6.15. Entrelaçamento de arranjos de dados.

    Esta técnica incrementa a localidade de cache. Um programa em execu-
ção como o da Figura 6.15(a) tem uma boa localidade espacial. Entretanto, o
arranjo Better da Figura 6.15(b) é mais improvável de ser mantido fora da ca-
che. A razão é simples, se mantivermos dois arranjos separados, o endereço
base deles pode causar um conflito na cache. Usando somente um arranjo,
como combinação de dois ou três arranjos, é possível garantir que o arranjo
na cache seja usado o tempo todo. Essa arrumação reduz a taxa de falta na
cache. Portanto, o custo de potência de recuperação de novos dados é gran-
demente minimizado porque reduz o uso do barramento.

6.5.3. Escalonamento de Instruções
    Escalonamento de instruções é uma técnica de software que rearranja
seqüências de código durante a compilação com o objetivo de reduzir pos-
síveis atrasos de execução. Para escalonar as instruções usa-se um grafo


                                                                            27
E. Moreno e R. Barreto



acíclico dirigido (directed acyclic graph - DAG) onde cada vértice representa
uma instrução em um programa. Diferentes restrições podem ser usadas nos
DAGs para atingir redução de potência. Uma das otimizações mais comuns
para baixo consumo de potência é minimizar a distância de Hamming. Como
apresentado anteriormente, isto pode ser feito pela escolha da ordem de valo-
res, mas esses valores podem tratar não somente informação de dados mas
também as instruções a serem executadas.
    O procedimento para reescalonar um código é o mesmo, tanto para infor-
mações de dados quanto de controle. Este pode ser sintetizado em três passos
principais:

     1. particionar o código em blocos, de modo que o procedimento possa ser
        aplicado seqüencialmente em cada uma das partes;
     2. gerar um grafo de dependência de controle (control dependency graph
        - CDG), para instruções, e um grafo de dependência de dados (data
        dependency graph -DDG); e
     3. percorrer os grafos de dependência para selecionar a nova ordem de
        instruções e/ou dados mas sujeito às restrições escolhidas (reescalona-
        mento).

    Geralmente este escalonamento de instruções é feito pelo compilador. Só
que, nesse caso, acontece um problema. A fim de reduzir a atividade de cha-
veamento, o DDG e CDG são normalmente derivados da forma simbólica das
instruções no código. Entretanto, para calcular a atividade de chaveamento a
informação não é provida neste nível. Por exemplo, a informação do endereço
das instruções de desvio não são conhecidas até serem escalonadas e alo-
cadas nos registradores. Por outro lado, quando a montagem é feita antes do
escalonamento das instruções, perde-se muita flexibilidade no escalonamento.
    As principais abordagens de escalonamento de instruções são: cold sche-
duling, escalonamento horizontal e escalonamento vertical.


6.5.3.1. Cold Scheduling

    Cold Sheduling [Su et al. 1994, Tiwari et al. 1994] é uma técnica de escalo-
namento de instruções executada como uma fase da compilação que prioriza a
seleção de cada instrução baseada no custo da energia de se colocar esta ins-
trução como a próxima instrução a ser executada. Esta técnica visa, portanto,
reduzir o consumo de energia minimizando as atividades de troca ocorridas no
circuito do processador durante a transição entre duas instruções consecutivas.
As entradas para o cold scheduling são o DDG e o custo de potência entre duas
instruções consecutivas. Este escalonamento foi testado por [Su et al. 1994] e
teve reduções de consumo de energia de 20% a 30% com uma redução de
desempenho de somente 2% a 4%.


28
Técnicas para Diminuir o Consumo de Energia



    Uma vez que o DDG tenha sido gerado, o custo de potência entre duas
instruções pode ser calculado por sua distância de Hamming. Nesse caso,
quanto menor for a distância de Hamming menor será o consumo de potência.
    A idéia pode ser sumarizada da seguinte forma: cada instrução é assumida
ter um custo base (denotando o seu consumo de energia médio). Uma aresta
ponderada entre nodos i e j fornece a energia consumida pela atividade de
chaveamento da instrução i para a instrução j. Esta aresta é também chamada
de custo interinstrução (ou custo do estado do circuito, do inglês circuit-state
cost). Uma vez que o tipo e número de instruções são fixos antes do esca-
lonamento das instruções, um algoritmo de escalonamento pode reduzir com
sucesso o custo total inter-instrução.
    O algoritmo de escalonamento é um processo iterativo que funciona como
descrito abaixo:

    • para cada bloco de instruções, enquanto houver instruções do bloco a
      serem escalonadas:

         – dada a lista de instruções prontas para executar (obtidas do grafo
           de dependência) e a última instrução da escala: selecione a ins-
           trução da lista que exija menor troca de bits em relação à última
           instrução executada de acordo com a tabela de custos de ativida-
           des de troca;
         – adicione a instrução selecionada da lista à nova escala de instru-
           ções;
         – adicione à lista de instruções prontas para execução aquelas que
           estavam dependendo da instrução que foi escolhida nesta iteração
           utilizando o grafo de dependências.


6.5.3.2. Escalonamento Horizontal

    O escalonamento horizontal necessita de alguma forma de execução pa-
ralela de instruções, portanto, é comumente usado em arquitetura VLIW (very
large instruction word) [Lee et al. 2003]. A idéia inicial da arquitetura VLIW sur-
giu nos estudos de computação paralela feitas por Alan Turing, em 1946, e no
trabalho de microprogramação de Maurice Wilkes, em 1951 [Wilkes 1986].
    Uma CPU microprogramada está relacionada a macroinstruções, as quais
representam as instruções do programa em si. Cada macroinstrução é, por sua
vez, composta por uma seqüência de microinstruções, cada qual associada di-
retamente a alguma unidade funcional do processador (por exemplo, a ALU).
Esta organização é denominada microprogramação horizontal [Dasgupta 1977]
e é a base das arquiteturas VLIW. Ela se contrapõe à microprogramação ver-
tical, onde os campos das instruções devem ser decodificados para produzir
os respectivos sinais de controle. Assim, a microprogramação horizontal per-
mite que todas as possíveis combinações de sinais (e, portanto, operações)


                                                                                29
E. Moreno e R. Barreto



sejam expressas diretamente como instruções, evitando-se que a lógica de si-
nais seja concentrada em apenas uma única unidade de decodificação. Desta
forma, uma conseqüência natural da microprogramação horizontal é a neces-
sidade de uma palavra maior para cada instrução.
    A filosofia VLIW propõe a utilização de técnicas de escalonamento estático
efetuadas exclusivamente pelo compilador, onde múltiplas operações indepen-
dentes são compactadas em apenas uma palavra longa, conseguindo-se o
despacho simultâneo de mais de uma instrução [Phillips White Papers 2003].
    Por exemplo, considerando um barramento de macroinstruções de 128 bits,
este pode encaixar quatro microinstruções de 32 bits, e com quatro unidades
de processamento (uma para cada microinstrução) cada uma dessas microins-
truções escalonadas na palavra de 128 bits podem ser executadas simultane-
amente.
    A idéia do escalonamento horizontal é reescalonar as microinstruções de
uma macroinstrução para minimizar atividades de chaveamento de barramento
de instrução. O objetivo é encontrar um escalonamento de instrução tal que a
distância de Hamming total de n instruções VLIW consecutivas seja minimi-
zada e, adicionalmente, cada macroinstrução seja uma permutação de suas
microinstruções.
    O escalonamento horizontal move as microinstruções horizontalmente den-
tro de uma única macroinstrução.


6.5.3.3. Escalonamento Vertical

    No escalonamento vertical a execução das instruções são trocadas entre
si (antes ou depois) levando em consideração que o resultado deve ser sem-
pre o mesmo e, ao mesmo tempo, tentando não degradar o desempenho da
execução [Allen and Kennedy 2001] . Este escalonamento tem complexidade
NP-difícil.
    Na Figura 6.16 tem-se códigos que podem ser escritos de diferentes for-
mas sem alterar o seu significado. Entretanto, este rearranjo deve ser feito em
código assembly, de tal forma que o compilador possa efetuar as otimizações
necessárias para que seja escolhido o melhor arranjo dos bits, com o intuito de
minimizar a distância de Hamming [Ponce 2006].
    No escalonamento vertical as microinstruções se movem entre diversas
instruções. Usualmente este escalonamento ocorre somente dentro de um
bloco básico, que tem um grafo de dependência de dados e uma quantidade
de ciclos total. Obviamente que a nova escala tem que obedecer o grafo de
dependência original e que o novo tempo de ciclo seja menor ou igual que o
tempo de ciclo original.

6.5.4. Transformações de Laços
   As transformações de laços têm um papel importante na melhoria do de-
sempenho da cache e no uso efetivo da capacidade de processamento para-


30
Técnicas para Diminuir o Consumo de Energia




          Figura 6.16. Exemplo de escalonamento vertical.



lelo. Estudos comprovam que a maior parte do tempo de um programa cien-
tífico é gasto em laços [Aho et al. 2006]. Conseqüentemente, a maioria das
análises e otimizações dos compiladores foram desenvolvidas para fazer com
que a execução de laços sejam mais rápidas.
    Existem algumas otimizações sugeridas em [Kandemir et al. 2000] para im-
plementar transformação de laços. Isto pode causar uma melhoria na taxa de
acerto da cache, resultando em diminuição do consumo de potência. O prin-
cípio da localidade é reforçado, no sentido de forçar o uso de variáveis locais
e, portanto, reutilização de registradores. As transformações de laços linear
básicas são:

   • extensão de laços (loop unrolling).

   • fusão de laços (loop fusion).

   • separação de laços (loop tiling).



6.5.4.1. Extensão de Laços (Loop Unrolling)

     Esta técnica tenta salvar tempo por meio da redução do número de instru-
ções adicionais que são executadas em laços, reduz as instruções de desvio
e incrementa a taxa de acerto da cache [Davidson and Jinturkar 1995]. Além
disso, esta também ajuda na escala de execução de arquiteturas paralelas. In-
felizmente, o uso de registradores em cada interação é incrementado, o que
pode ser uma desvantagem em aplicações embarcadas, que usualmente pos-
suem severas restrições de memória e registradores.
     A Figura 6.17 apresenta um código original e o respectivo código após a
extensão do laço. Nesse exemplo, o código da Figura 6.17(b) terá somente 20
interações. O algoritmo fará 5 vezes menos instruções de desvio, e ainda fazer
o mesmo trabalho. Com a disponibilidade do paralelismo, cada uma das linhas
poderia ser atribuída a cinco diferentes processadores e o escalonamento ho-
rizontal poderá ser aplicado de acordo com o dado a ser usado.


                                                                            31
E. Moreno e R. Barreto




                   Figura 6.17. Extensão de Laços.



6.5.4.2. Fusão de Laço (Loop Fusion)

    Esta técnica junta dois laços em um único laço com a garantia de que a
mesma tarefa (mesma semântica) é executada [Qian et al. 2002]. Na fusão de
laços da Figura 6.18, instruções adicionais foram evitadas uma vez que o laço
ocorreu uma única vez mas ainda assim gerou ambos arranjos a e b. A fusão
de laços usualmente melhora o reúso de dados e, portanto, reduz a potência
consumida.




                     Figura 6.18. Fusão de Laços.




6.5.4.3. Divisão de Laço (Loop Tiling)

    Arranjos que não se encaixam na cache são divididos em peças menores
de tal forma que cada uma possa se ajustar na cache [Song and Li 1999]. Um
dos objetivos da redução de potência é evitar a situação de falta do dado na
cache, além de tentar fazer um melhor reúso de dados. Por outro lado, quando
um código é dividido, dois ou mais laços são necessários para percorrer o
mesmo código original. Portanto, deve ser tomado cuidado para determinar se
o resultado será de diminuição ou aumento de potência.


32
Técnicas para Diminuir o Consumo de Energia



6.5.5. Considerações Finais
    Esta seção mostrou as principais técnicas de otimização do compilador
considerando o critério de economia de energia. Algumas otimizações com
esse fim também otimizam o desempenho, mas não todas. O objetivo maior
dessa otimização é reduzir a distância de Hamming entre dois códigos suces-
sivos.

6.6. Nível de Comunicação
    Os sistemas móveis são operados a bateria e, usualmente, fazem parte de
uma grande rede onde a comunicação ocorre sem fio com outros sistemas. As
técnicas convencionais de projeto com baixo consumo de energia com foco no
circuito e na computação são inadequadas para este tipo de sistema em rede.
Apesar de ser usada em parcelas menores de tempo, a comunicação consome
alta potência de pico, o qual é muito maior que o custo de potência associado
com computações.
   A interface de rede sem fio de um computador móvel consome uma fração
substancial da energia total. Medidas mostram que em aplicações típicas, tipo
navegador web ou email, a energia consumida quando a interface está ligada
e ociosa é mais do que o custo de receber pacotes. Além do mais, o chave-
amento entre estados (desligado, ocioso, recebendo e transmitindo) consome
tempo e energia.
    A arquitetura de uma rede de computadores é formada por camadas (ou ní-
veis), interfaces e protocolos [Tanenbaum 2003]. As camadas são processos,
implementados por hardware ou software, que se comunicam com o processo
correspondente na outra máquina. Cada camada oferece um conjunto de ser-
viços ao nível superior, usando funções realizadas no próprio nível e serviços
disponíveis nos níveis inferiores. Nesta arquitetura, os dados transferidos em
uma comunicação de um nível específico não são enviados diretamente ao
processo do mesmo nível na outra máquina, mas são repassados para a ca-
mada inferior da máquina transmissora até o nível mais baixo (inicial), onde é
transmitido, para depois subir através de cada camada adjacente da máquina
receptora. Os protocolos são conjuntos de regras e formatos que permitem a
comunicação entre as camadas nas diferentes máquinas. Em cada camada
podem ser definidos um ou mais protocolos. Já as interfaces representam a
fronteira entre cada nível adjacente onde uma camada consegue compreender
as informações vindas de outra camada.
    Inicialmente, nesta seção, será visto como reduzir o consumo de energia
nas camadas física, enlace, rede e camada de transporte. Depois será apre-
sentado algumas formas específicas para redução do consumo de energia de-
vido à comunicação, a saber: (a) decomposição do sistema; (b) tratamento
dos erros de transmissão; (c) modo dormindo; (d) modificação no protocolo de
acesso ao meio.


                                                                           33
E. Moreno e R. Barreto



6.6.1. Camada Física
     Na camada física, sinalização low-swing está sendo investigada para redu-
zir a energia da comunicação em interconexões [Zhang et al. 2000]. No caso
de um simples CMOS driver, a sinalização low-swing é alcançada baixando a
voltagem fornecida (Vdd ) do driver. Infelizmente, redução de swing no transmis-
sor complica o projeto do receptor. Sensibilidade incrementada e imunidade à
ruídos são necessários para garantir recepção de dados confiáveis. Recepto-
res diferenciais têm sensibilidade e robustês superiores, mas requerem o do-
bro da largura de banda do barramento. Para reduzir os overheads, esquemas
pseudo-diferenciais foram propostos, onde um sinal de referência é comparti-
lhado entre muitas linhas de barramentos e receptores, e o dado de entrada é
comparado com a referência em cada receptor.
     Outra questão chave da camada física é a sincronização. A comunicação
tradicional tem sido baseada na suposição síncrona, que implica na presença
de um sinal de sincronização global, isto é relógios, que definem instantes de
amostragem dos dados. Infelizmente, relógios são extremamente ineficientes
energeticamente, e são responsáveis por uma significante fração da potência.
Assim, sincronização global não é uma escolha ótima do ponto de vista ener-
gético.

6.6.2. Camada de Enlace
     Na camada de enlace, uma característica chave é atingir o nível de confia-
bilidade da comunicação com o gasto mínimo de energia.
     Considere duas técnicas de melhoria da confiabilidade: (i) código de cor-
reção de erros; e (ii) código de detecção de erros com retransmissão. Ambas
abordagens são baseadas na transmissão de informação redundante, mas cor-
reção de erro demanda mais do que a detecção de erros em termos de redun-
dância e complexidade de decodificação. Conseqüentemente, pode-se esperar
que a transmissão com correção de erros venha a consumir mais potência do
que no caso da transmissão sem erros. Entretanto, quando ocorre um erro, os
esquemas de detecção de erros requerem retransmissões do dado corrompido.
Dependendo da arquitetura da rede, retransmissões podem ser muito custosas
em termos da energia (e desempenho). Claramente, escolha entre o custo da
correção de erros e a penalidade de energia das retransmissões devem ser cui-
dadosamente exploradas quando projetando redes eficientes energeticamente.
     O artigo [Bertolozzi et al. 2002] investiga como lidar com erros de barra-
mentos on-chip (por exemplo, ruídos, radiação e atrasos) de modo eficiente do
ponto de vista de consumo de energia e usando o código de Hamming. Código
de Hamming é um código de detecção que permite não apenas detectar erro de
um bit, mas também a localização do bit errado através da inserção de alguns
bits de paridade. Se a palavra for de 8 bits, o código de Hamming acrescenta
4 bits adicionais, formando o código de Hamming de 12 bits. Mais informa-
ções sobre o código de Hamming pode ser encontrada em [Tanenbaum 2003].
Usando a correção de erros de Hamming implica em um decodificador um


34
Técnicas para Diminuir o Consumo de Energia



pouco mais complexo, mas com uma penalidade temporal pequena. Se, por
outro lado, o código de Hamming for usado para detecção de erros a retrans-
missão tem que ser disparada no barramento caso uma transferência errônea
seja detectada. Este método conta com decodificadores simples e uma boa
capacidade de detecção, mas gera um grande número de transições no bar-
ramento e, conseqüentemente, degrada o desempenho por causa do atraso
associado. Em [Bertolozzi et al. 2002] mostrado que, com a condição de que
a penalidade de atraso temporal possa ser tolerada, as estratégias de retrans-
missão são mais efetivas do que as que tratam de correção de erros do ponto
de vista de consumo de energia, principalmente por causa da grande capaci-
dade de detecção e menor complexidade de decodificação. A análise foi feita
usando diversas variantes do código de Hamming em um modelo VHDL de
um processador baseado no Sparc V8, e explorando as características de um
barramento AMBA. A análise considerou um nível pré-definido de tolerância a
ruídos em uma dissipação mínima de potência. Os resultados consideraram
um barramento sem qualquer codificação e, também, com o tradicional código
de um bit de paridade.
    No caso de links de redes de meio compartilhado (tais como barramentos),
a função de controle de acesso ao meio da camada de enlace é também crí-
tica para a eficiência energética. Atualmente, esquemas de multiplexação por
divisão do tempo centralizado (centralized time-division multiplexing schemes)
são muito adotados. Nestes esquemas, um simples circuito árbitro decide que
transmissor acessa o barramento em cada slot de tempo. Infelizmente, a pobre
escalabilidade da arbitragem centralizada indica que esta abordagem é prova-
velmente ineficiente energeticamente com o crescimento da rede.
    Esquemas de arbitragem distribuída assim como abordagens alternativas
de multiplexação, tais como multiplexação por divisão do código (code division
multiplexing) tem sido extensivamente estudados, mas muito trabalho ainda
precisa ser feito.

6.6.3. Camada de Rede
    A arquitetura da rede influencia fortemente a energia da comunicação. Sabe-
se que os barramentos são a escolha mais comum, embora seja intuitivamente
claro que barramentos não são eficientes do ponto de vista energético quando
a rede cresce. Na comunicação baseada em barramentos, o dado é sempre
difundido (broadcasted) de um transmissor para todos os possíveis receptores,
enquanto que as mensagens são destinadas a somente um receptor (ou um
pequeno grupo de receptores). Contenção do barramento, com o overhead da
arbitração, contribui para o aumento do consumo de energia.
    Estudos preliminares indicam que arquiteturas hierárquicas e heterogêneas
são muito mais eficientes energeticamente que barramentos. Em seu trabalho,
[Zhang et al. 1999] desenvolveram uma rede em malha generalizada e hierár-
quica (hierarchical generalized mesh) onde nodos com alto requisito de largura
de banda são agrupados e conectados por meio de uma malha generalizada


                                                                           35
E. Moreno e R. Barreto



programável consistindo de diversos canais de comunicação juntos com swit-
ches programáveis. Os agrupamentos (clusters) são então conectados por
meio de uma malha generalizada de canais de comunicação mais longos e
globais. Tal arquitetura é heterogênea porque o custo de energia da comunica-
ção intra-cluster é muito menor que a comunicação inter-cluster.

6.6.4. Camada de Transporte
     Acima da camada de rede, a abstração da comunicação é uma conexão
fim-a-fim. A camada de transporte está interessada em otimizar o uso de re-
cursos de redes e prover a qualidade de serviço requerida. A energia pode ser
vista como um recurso de rede ou um componente na métrica da qualidade
de serviço. Um exemplo de questão de projeto da camada de transporte é a
escolha entre protocolo com e sem conexão. A eficiência energética pode ser
grandemente impactada por esta decisão. De fato, protocolos com conexão po-
dem ser energeticamente ineficientes sob condições de tráfego intenso porque
eles tendem a incrementar o número de re-transmissões. Por outro lado, en-
trega de dados fora de ordem (que pode ser o caso do protocolo sem conexão)
implica em trabalho adicional no receptor, que por sua vez, causa um adicional
no consumo de energia.
     Outra tarefa da camada de transporte com grandes implicações de energia
é o controle de fluxo. Quando muitos transmissores competem por recursos
limitados, a rede torna-se congestionada, e o custo por bit transmitido incre-
menta por causa do incremento na contenção e overhead da resolução da con-
tenção. Controle de fluxo pode reduzir o efeito do congestionamento pela regu-
lação da quantidade de dados que entram na rede sob o preço de alguma pe-
nalidade de processamento (throughput). A redução de energia via o controle
de fluxo tem sido estudado para redes sem fio [Walrand and Varaiya 2000].

6.6.5. Decomposição do Sistema
    Usualmente, a pilha de protocolo de redes locais executam no processa-
dor principal. Conseqüentemente, a interface de redes e o processador devem
estar sempre ligados para que a rede local esteja ativa. Como quase todos os
dados são transportados por meio do processador, desempenho e consumo de
energia pode ser um problema. A decomposição da pilha de protocolo da rede
e o fluxo de dados do sistema podem reduzir o consumo de energia. Primeiro,
porque quando o sistema é construído a partir de componentes independen-
tes que implementam diferentes camadas da pilha de comunicação, cópias de
dados desnecessários são eliminados. Segundo, porque um hardware dedi-
cado pode fazer o processamento de sinais básicos e podem mover os dados
diretamente para o destino, mantendo cópias dos dados longe do barramento.
Finalmente, um processador específico para a comunicação pode ser usado
para tratar a maioria dos aspectos de baixo nível da pilha de protocolo, sem so-
brecarregar o processador principal, ao mesmo tempo em que possibilita que
o mesmo possa dormir por maior período de tempo sem afetar o desempenho
e/ou funcionalidades.


36
Técnicas para Diminuir o Consumo de Energia



6.6.6. Taxas de Erros
    Redes sem fio têm uma taxa de erros muito maior do que redes com fio.
Na presença de altas taxas de erros de pacotes, alguns protocolos de redes
(tais como o TCP) pode reagir exageradamente confundindo com congestiona-
mento. Isto leva a retornar a uma taxa de transferência muito baixa, o que incre-
menta o consumo de energia porque leva a um tempo de transferência muito
maior. Qualquer protocolo que deixa um receptor móvel ocioso desnecessari-
amente desperdiça energia. As limitações do TCP podem ser superadas por
um controle de congestionamento mais adequado durante erros de pacotes.
A colocação de dados em buffers das estações base podem ser usadas para
executar somente retransmissões locais que são causadas por erros na rede
sem fio.

6.6.7. Modo Dormindo
    Os protocolos de rede podem ser modificados para suportar conectividade
total enquanto estão em modo desligado (power down). O esquema store-and-
forward para redes sem fio, tal como o IEEE 802.11, propôs o modo dormindo,
que não somente possibilita que a interface de rede entre no modo dormindo
mas também possa executar retransmissões locais não envolvendo camadas
de protocolo de rede superiores. Entretanto, tais esquemas têm a desvantagem
de requerer uma estação base para atuar como uma interface de armazena-
mento temporário em buffers.

6.6.8. Protocolo de Acesso ao Meio
    Usualmente, as redes sem fio atuais não atentam para o consumo de ener-
gia, mas principalmente focam na maximização do throughput. Em um sistema
sem fio, o protocolo de acesso ao meio (MAC) pode ser adaptado e sintoni-
zado (tuned) para melhorar a eficiência energética. O objetivo básico é que o
protocolo consiga minimizar as ações da interface de redes, ou seja, minimizar
o tempo de transmissão assim como da recepção.
    Um exemplo de protocolo MAC com eficiência energética é o LPMAC (Low-
Power Medium Access Protocol) [Mangione-Smith 1996], que usa um esquema
ponto-a-ponto para reduzir o consumo de energia dentro de uma rede. Uma
vantagem desse esquema é o incremento efetivo da largura de banda disponí-
vel na rede.
    Todo o controle do tráfego é estruturado a partir da definição de super-
quadros, como mostrado na Figura 6.19, onde cada quadro tem uma certa
quantidade de células de dados e células de controle de tráfego. Um terminal
da rede local deve ser designado como o coordenador da rede (também conhe-
cido como estação-base), e este terminal é responsável por adaptar e manter
essa estrutura de super-quadros. Cada super-quadro inicia com uma escala
de tráfego, que indica os terminais que tem tráfego. Tal escala é gerenciada
pelo coordenador da rede.
    Os terminais que tenham sido escalonados para tráfegar são indicados em
uma lista ordenada. Obviamente que os outros computadores que não estive-


                                                                              37
E. Moreno e R. Barreto



rem nessa lista, portanto sem tráfego, podem rapidamente desligar os recepto-
res e transmissores e, com isso, reduzir potência.
    Usando o escalonamento explícito de todas as transferências de dados, o
LPMAC possibilita que um terminal “cochile” (e desligue o receptor) dentro de
um quadro durante uma comunicação ativa, assim como, reativar o transmissor
ou receptor somente no tempo da escala.
    Um pequeno período de tempo dentro de cada super-quadro é reservado
para tráfego baseado em contenção, por exemplo, usando esquemas baseados
em CSMA/CD. Este período permite que novos terminais, que não estavam
participando de qualquer comunicação, enviem uma mensagem de requisição
ao coordenador da rede. Como nesse período não ocorre tráfego de dados,
a mensagem pode ser pequena e, conseqüentemente, largura de banda pode
ser conservada.
    Algo que precisa ser considerado nesses esquemas é que o chaveamento
entre estados (desligado, ocioso, recebendo, transmitindo) consome tempo e
energia. Portanto, o número de transições de estados têm que ser minimizado.



           Escala do           Comunicações ponto-a-ponto     Período de
            Tráfego                                           Contenção




          Figura 6.19. Estrutura do super-quadro LPMAC.


6.7. Nível de Aplicação
    Os sistemas computacionais possuem diversas camadas de software que
executam sobre o hardware. O software não consome energia por si só, mas
é a execução e armazenamento do software que requerem consumo de ener-
gia do hardware. Neste caso, a execução do software envolve dissipação de
potência na computação, armazenagem e comunicação. Entretanto, a energia
gasta para armazenar programas é usualmente baixa (com a escolha de com-
ponentes apropriados) e previsível em tempo de projeto. Contudo, a redução
do tamanho do programa armazenado é benéfico. Como já apresentado, isto
pode ser alcançado pelo compilador e compressão de código. No último caso,
o código é comprimido antes de ser armazenado. Em tempo de execução, o
código é descomprimido o mais rápido possível [Benini and De Micheli 2002].
    Os sistemas embarcados são dedicados a uma aplicação específica. Neste
caso, o objetivo é prover a qualidade do serviço requisitado dentro das restri-
ções. Se for considerado, por exemplo, um terminal de video móvel e sem fio, a
qualidade de serviço estará relacionada com a qualidade do vídeo, que implica
em níveis de desempenho específicos tanto de computação quanto de arma-
zenamento e comunicação. As restrições podem estar na relação sinal/ruído


38
Técnicas para Diminuir o Consumo de Energia



do sinal de radio-freqüência e da energia disponível na bateria. Conseqüen-
temente, a maior tarefa do software será prover alto desempenho por meio
da orquestração do processamento de informações ao mesmo tempo em que
provê o melhor fluxo de informação. Além do mais, esta tarefa deve ser feita
mantendo um consumo mínimo de energia.
    Esta seção descreverá formas para diminuir o consumo de energia a partir
das aplicações. É importante que no nível de aplicação o sistema seja mo-
delado e seja aplicada alguma técnica de análise, seja analítica ou simulada.
Interfaces de programação de aplicações (ou APIs) também são usadas para
que as aplicações gerenciem o consumo de energia de componentes de hard-
ware e software, onde decisões podem ser tomadas, por exemplo, para permitir
que aplicações desliguem certos componentes quando os mesmos não estão
mais sendo usados.
    Uma das estratégias para atingir esse objetivo é o gerenciamento dinâmico
de potência dos componentes (do inglês dynamic power management - DPM).
O gerenciamento dinâmico de potência (DPM) é uma característica do ambi-
ente de tempo de execução que dinamicamente reconfigura o ambiente para
prover o serviço requisitado e desempenho com o número mínimo de compo-
nentes ativos ou um nível mínimo de atividades nesses componentes. DPM
engloba um conjunto de técnicas que provê a computação com eficiência de
energia, desligando (ou reduzindo o desempenho) de componentes do sistema
quando estão ociosos (ou parcialmente inexplorados). DPM também é rea-
lizado por meio da diminuição da freqüência do processador (algumas vezes
até parando o relógio) e/ou reduzindo a voltagem [Benini and De Micheli 2002].
    A premissa para aplicabilidade do DPM é que o sistema (e seus compo-
nentes) possuam cargas de trabalho não-uniformes. Uma segunda suposição
é que seja possível prever, com certo grau de precisão, a flutuação da carga de
trabalho. É necessário, entretanto, que a observação de carga e previsão não
consuma energia significante. O projeto de um sistema com gerenciamento
de potência engloba diversas tarefas, incluindo a seleção dos componentes a
serem gerenciados, determinação da política de gerenciamento, e implementa-
ção dessa política em um nível apropriado do software. A forma mais simples
de implementação de uma política é como um filter driver, ou seja, um pro-
grama anexo ao driver de um componente específico. Nesse caso, o driver
monitora o tráfego de/para o componente e tem acesso ao estado do compo-
nente. Contudo, o driver tem uma visão limitada de outros componentes e,
conseqüentemente, tal implementação pode sofrer de localidade excessiva.
    Outra alternativa seria se a política de gerenciamento fosse implementada
em kernels e estivesse altamente acoplada ao gerenciamento de processos.
De fato, o gerente de processos tem conhecimento das tarefas que estão em
execução e as tarefas que virão para serem executadas. Gerentes de pro-
cessos também sabem que componentes (dispositivos) são necessários para
cada tarefa. Assim, a implementação da política desfrutaria tanto da visão glo-
bal quanto de uma perspectiva da operação do sistema em um futuro próximo.


                                                                            39
E. Moreno e R. Barreto



Deste modo, é possível “acordar” componentes de forma preditiva pelo conhe-
cimento das tarefas a chegar e dos componentes necessários.
    O software pode ser projetado para melhorar a efetividade do gerencia-
mento de potência. Gerenciamento de potência explora tempos ociosos de
componentes. Nesse caso, o escalonador pode sequencializar tarefas para
execução com o objeitvo adicional de agrupar operações sobre componentes,
de tal forma a atingir períodos mais longos de ociosidade.
    Algo que é muito importante enfatizar é que o projeto de sistema requer a
coordenação de vários componentes de hardware e software. Dessa forma, a
avaliação dos programas não podem ser feitos de forma isolada. Técnicas para
traçar o perfil (profile) podem e devem ser usadas para determinar a distribui-
ção de freqüência dos valores da entrada para os programas e sub-programas.
Tais informações são de grande importância para se obter software de aplica-
ção que seja eficiente no consumo de energia dentro do ambiente específico
onde será executado. É também importante notar que, dado um perfil de um
ambiente especifico, o software pode ser re-estruturado tal que consumo baixo
de energia pode ser atingido ao preço de latência um pouco mais alta.
    Síntese de software é um termo usado com diferentes conotações. Neste
contexto, síntese de software é um procedimento automático que gera código
fonte que possa ser compilado. Síntese de software é freqüentemente neces-
sário porque o consumo de energia de programas depende do estilo e cons-
truções usadas. É importante lembrar que os programas são escritos com
somente funcionalidade e/ou desempenho em mente, e raramente considera
consumo de energia. Além do mais, em aplicações embarcadas é uma prá-
tica comum usar código legado, o que pode levar a uma grande penalidade do
ponto de vista de consumo de energia [Benini and De Micheli 2002].
    A busca por software com baixo custo energético leva a uma sintonia fina
(tuning) de programas de aplicação. A proposta é que os próprios programas
de aplicação controlem os níveis de serviço e custo energético dos compo-
nentes de hardware. O problema com este método é que ele compromete a
portabilidade da aplicação e força o programador desta a adquirir informação
detalhada sobre o hardware que está se utilizando.
    Outra alternativa foi proposta por [Benini and De Micheli 2002]. Os progra-
mas de aplicação contém chamadas ao sistema (system calls) que solicitam o
software para controlar um componente de hardware, por exemplo, ligando ou
desligando, ou requerendo uma voltagem ou freqüência específica. O pedido
pode ser aceito ou recusado pelo sistema operacional, que tem acesso a in-
formação da escala das tarefas e dos níveis operacionais dos componentes. A
vantagem dessa abordagem é que o gerenciamento de potência é melhorado
no sentido de que o pedido de serviço é mais detalhado pelas aplicações e,
assim, em uma posição de tomar melhores decisões.
    É usual que políticas para gerenciamento do consumo de energia anali-
zem dinamicamente o comportamento do sistema para determinar quando um
componente de hardware deve modificar seu modo de operação. Contudo, a


40
Jai2008 energia-capitulo
Jai2008 energia-capitulo
Jai2008 energia-capitulo
Jai2008 energia-capitulo
Jai2008 energia-capitulo
Jai2008 energia-capitulo

Mais conteúdo relacionado

Destaque

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Destaque (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Jai2008 energia-capitulo

  • 1. Técnicas para Diminuir o Consumo de Energia em Sistemas Embarcados Edward David Moreno e Raimundo da Silva Barreto Abstract The increase in user demands for battery-operated mobile and embedded devices requires an equi- valent increase in processor performance, which on the other hand causes an increase in the energy consumption of these devices. Thus, this work aims to present the importance of that problem, empha- sizing and showing which critical components are in mobile devices. Later, this work focuses in the main techniques, strategies, and impact in the development of low energy systems. The techniques are presented and discussed in six levels, namely, circuit, architecture, operating system, compiler, communication, and application. Finally, it presents a case study and a discussion about future chal- lenges in this research area. Resumo O incremento na demanda dos usuários de dispositivos móveis e embarcados requer um incremento equivalente no desempenho do processador, o qual, por outro lado, causa um incremento no consumo de energia desses dispositivos. Assim, este trabalho visa apresentar a importância do consumo de energia e potência, enfatizando e mostrando quais são os componentes críticos em um dispositivo móvel. Depois, foca nas principais técnicas, estratégias e o impacto na diminuição do consumo de energia. As técnicas são apresentadas e discutidas em seis níveis, isto é, circuito, arquitetura, sistema operacional, compilador, comunicação e aplicação. Finalmente, apresenta-se um estudo de caso e uma discussão sobre os desafios futuros nesta área de pesquisa. 6.1. Introdução Esta seção apresenta definições e conceitos gerais sobre consumo de energia e potência, além de descrever diversos métodos e técnicas para a redução do consumo de energia em sistemas embarcados e móveis. Um sistema embarcado pode ser definido como um computador de propó- sito especial, que está incorporado a outro dispositivo (que pode não ser um computador), onde a utilização deste tem como intuito acrescentar ou otimizar funcionalidades, executa uma função específica e possui diversas restrições (temporais, consumo de energia e memória, peso, tamanho, etc). O avanço tecnológico, principalmente da micro-eletrônica, e o barateamento de sistemas microprocessados fizeram com que ocorresse uma explosão na 1
  • 2. E. Moreno e R. Barreto utilização desse tipo de sistema nas mais diversas áreas da vida humana. O homem moderno, mesmo sem perceber, depende cada vez mais da utilização de sistemas embarcados no seu dia-a-dia. Isto inclui não somente sistemas críticos que operam em automóveis, estradas de ferro, aviões, naves espaciais e na medicina, mas também automação industrial e de residências, video ga- mes, aparelhos domésticos, telefones celulares, fornos de micro-ondas, dentre outros. Atualmente, o consumo de energia é ponto de discussão e pesquisa tanto na indústria como na academia. Isto se deve principalmente à massificação do uso de dispositivos móveis e a exigência, cada vez maior do mercado para que os mesmos tenham grande potencial computacional e maior grau de au- tonomia. Devido a essa característica, o consumo de energia passou a figurar como métrica de qualidade no contexto dos projetos de sistemas embarcados. Além disso, tal consumo tem impacto na forma de encapsulamento do sistema, implicando no custo final do produto. No mundo inteiro a utilização de dispositivos móveis está cada vez mais crescente e, aos poucos, esses aparelhos permitem realizar mais e mais fun- ções de forma automática, facilitando algumas atividades rotineiras do ser hu- mano. A área da computação móvel depende de algumas outras sub-áreas como microeletrônica, sistemas digitais, sistemas embarcados, automação, progra- mação de dispositivos móveis, avaliação e simulação, desempenho, lingua- gens de programação, redes de computadores e sistemas distribuídos, dentre outras áreas. Essa grande diversidade de aplicações deve-se aos avanços nessas áreas e, em especial, aos avanços na área de dispositivos eletrônicos e ao uso da comunicação sem fio (wireless), que possibilitam a aplicação des- ses dispositivos e ferramentas em casos em que a conexão física é um fator limitante. Alguns exemplos de dispositivos móveis são os notebooks, PDA (Personal Digital Assistants), o pager, o IPoD, os dispositivos de música MP3, os sen- sores inteligentes, os telefones celulares e, recentemente, os smart phones. Não obstante, ainda há vários desafios a vencer, tanto do ponto de vista de software e hardware, principalmente com relação ao atendimento das diversas restrições. Os dispositivos móveis estão com mais e mais potência computacional. Como exemplo pode-se citar, o computador de mão conhecido como Pocket Itsy, projetado pela HP. Este dispositivo usa o processador ARM, que possui boas características de desempenho. A Tabela 6.1 mostra que o Pocket Itsy possui desempenho comparável a máquinas do SGI Índigo e Pentium, quando se usa a métrica MIPS (Milhões de Instruções Por Segundo) e quando se exe- cuta um subconjunto de programas especificados pelo benchmark SPEC. É importante ressaltar que esta métrica não é a única usada para comparar de- sempenho [Patterson and Hennessy 2007, Stallings 2005]. É importante observar que os dispositivos móveis possuem cada vez mais 2
  • 3. Técnicas para Diminuir o Consumo de Energia Tabela 6.1. Exemplo de Desempenho Computacional de Dispositivos Móveis [Bartlett et al. 2000] recursos em hardware que permitem a execução de tarefas cada vez mais variadas e complexas. Porém, eles são fortemente dependentes do bom funci- onamento e capacidade da bateria, que é a fonte de energia. Figura 6.1. Consumo de Potência de Pico em Processa- dores da Intel No lado esquerdo da Figura 6.1 é possível observar que os processadores cada vez mais aumentam a sua freqüência de operação e usam também um número maior de componentes em hardware (portanto, há um maior número de transistores sendo utilizados), o que produz um aumento no desempenho computacional, porém, aumenta-se também o consumo de pico, medido em 3
  • 4. E. Moreno e R. Barreto watts, desses dispositivos. No lado direito da Figura 6.1 mostra-se o consumo da bateria de um dis- positivo móvel. Quando não se executa nenhuma aplicação, ela começa a se descarregar de forma natural, e a capacidade de oferecer energia diminui com o avanço do tempo. Essa situação se torna ainda mais critica quando ela é efe- tivamente usada, fazendo com que a sua descarga total aconteça bem antes do tempo máximo de funcionamento (dado pelo funcionamento em standby). Na Figura 6.1 (lado direito), por exemplo, a bateria normal teria uma duração de 45 horas, porém quando o dispositivo começa a funcionar, ela tem uma duração máxima de 14 horas, ou seja, em torno de 30% da sua capacidade total. Obviamente esses tempos variam para cada dispositivo e para cada forma de utilização. Assim, o mesmo dispositivo pode ter um tempo menor se exe- cutar operações críticas, ou se possuir mais elementos de hardware do que o necessário para uma determinada função. A seguir, algumas outras informações que motivam a realização de pesqui- sas na área de otimização do consumo de energia em sistemas computacio- nais, de acordo com [Yang et al. 2004] e [Hsu 2003]: • Há um aumento de consumo de energia da família de processadores da INTEL: de 7.9W para o processador Pentium 133MHz para 82W do Pentium-IV a 3GHz. • Em 1992 a dissipação mundial de potência dos processadores tipo PC foi de 160 MegaWatts. Em 2001 aumentou para 9000 MegaWatts. • No mesmo período, 8% da energia consumida nos Estados Unidos foi com o uso de Internet e estima-se que para o ano 2020 chegue a 30%. • O consumo aumenta os custos relacionados com o encapsulamento dos chips, ar condicionado, salas de refrigeração, etc. Esses custos repre- sentam 25% dos custos totais do projeto. • A Intel estima que o custo dos chips produzidos seja aumentado em mais de $1/W, toda vez que o consumo excede a faixa de 35 a 40 W. • A taxa de falhas dos chips duplica a cada 18◦ F de aumento da tempera- tura. O consumo de energia nesses dispositivos é altamente dependente das suas características tecnológicas e arquiteturais, das características de cada componente que compõem o dispositivo, da forma de operação, e do próprio funcionamento. As características de funcionamento dependem também dos aplicativos que ele consegue executar, da forma em que esses programas exe- cutam, e até na forma em que essas aplicações são programadas. Portanto, conhecer o consumo de energia de um dispositivo móvel é uma tarefa com- plexa e dependente de muitas variáveis, o que a torna um desafio. 4
  • 5. Técnicas para Diminuir o Consumo de Energia Conhecer como um dispositivo consome a energia (caracterização do con- sumo) é um dos primeiros passos no sentido de aplicar e criar métodos e téc- nicas com o objetivo de melhorar o consumo e permitir que esses dispositivos sejam então usados por mais tempo e com bom desempenho. O objetivo geral deste capítulo é apresentar e discutir as diferentes técnicas existentes para diminuir o consumo de energia em sistemas computacionais, com ênfase em sistemas embarcados, ao mesmo tempo em que pretende-se mostrar que é importante que os projetistas entendam a necessidade de levar em consideração o consumo de energia em aplicações modernas. O capítulo discute também assuntos e técnicas que continuam sendo alvo de pesquisa e desenvolvimento para diminuir o consumo de energia, principalmente em dispositivos móveis. Uma contribuição deste trabalho é dedicar esforços ao problema do con- sumo de energia, o qual se torna crítico em sistemas móveis, principalmente em sistemas de telefonia celular. 6.2. Nível de Circuito Nesta seção são apresentadas as principais técnicas e o estado da arte para diminuir o consumo de energia sob o ponto de vista do projeto de circuitos. A Equacão 1 expressa o cálculo do consumo de potência. P = αCVdd f + T αVdd Ishort f +Vdd Ileak 2 ˇ (1) Onde: V dd = voltagem; f = freqüência do relógio; C = capacitância de carga; α = densidade de chaveamento (ou transição); ˇ T = parâmetros físicos do dispositivo que dependem do semiconductor; Ishort = corrente de curto circuito; e Ileak = corrente de fuga. Neste caso, de acordo com a Equacão 1, observa-se que o valor de potên- cia (P) depende de variáveis como: voltagem ou tensão (Vdd ), freqüência ( f ), densidade de chaveamento ou de transição (α ), da corrente de fuga (Ileak ), e de algumas constantes e parâmetros físicos que dependem do material semi- ˇ condutor sendo usado na construção do circuito (T ). A potência de consumo em um circuito baseado em CMOS depende de 3 componentes principais: curto circuito, estática e dinâmica. • A parte de curto circuito refere-se aquela energia perdida quando a fonte de tensão é colocada no terra, isto é, deve-se ao fenômeno de curto circuito que acontece toda vez que há um processo de chaveamento dos circuitos. Este tempo geralmente é muito pequeno e acontece em um pe- queno período de tempo. Por isso, não interessa muito do ponto de vista computacional e sim do ponto de vista eletrônico. Segundo [Hsu 2003] 5
  • 6. E. Moreno e R. Barreto e [Yang et al. 2004], este valor está se tornando crítico nos circuitos na medida em que se diminui o tamanho dos transistores usados. • A parte estática captura a energia perdida devido à corrente de fuga (leakage), que acontece independentemente do estado das portas, isto é, de forma contínua. Esta corrente vem se tornando cada vez mais relevante, devido à tensão limiar que está sendo usada. Geralmente de- pende da área do circuito, da tecnologia de fabricação e do estilo usado no projeto do circuito. Segundo [Yang et al. 2004], para chips baseados na tecnologia CMOS, representa de 2% a 5% da dissipação de potencia total. Atualmente, esse valor encontra-se próximo de 15% e, no futuro, essa influência tende a aumentar. • A parte dinâmica mede o consumo de carga e descarga dos capacitores na saída de cada porta lógica quando alguma operação de computação é realizada. Este componente é o de maior interesse e tem sempre dominado o consumo em dispositivos. Pode-se isolar o consumo dinâmico como sendo: P = αCVdd f 2 (2) Onde: V dd = voltagem; f = freqüência do relógio; C = capacitância de carga; e α = densidade de chaveamento (ou transição). Na Equação 2 pode-se notar que a voltagem é o principal componente do consumo de potência porque é um termo quadrático. Contudo, a redução da voltagem tem um efeito negativo no atraso e, com isso, o desempenho é também afetado. Neste caso, é sugerido primeiro reduzir a potência por outros meios, e fi- nalmente reduzir a voltagem tanto quando possível de acordo com o requisito de desempenho [Shin and Choi 1997]. No contexto deste capítulo, é essencial identificar a diferença entre “po- tência” e “energia”. Apesar de serem muito próximas, referem-se a conceitos distintos. A energia (E) é simplesmente o produto do tempo de execução pela potência média, enquanto que potência é a taxa na qual a energia é consumida [Tiwari et al. 1996]. Nesse caso, tem-se as seguintes equações: E = P×T (3) T = N ×τ (4) Onde: N = ciclos; 6
  • 7. Técnicas para Diminuir o Consumo de Energia T = tempo de execução; τ = período = 1 f Se as fórmulas 2, 3 e 4 forem juntadas é possível obter a seguinte expres- são: V dd 2 ·C E= 2 ·α ·N Assumindo que (V dd 2 /2)C é uma constante K pode-se verificar que o con- sumo de energia depende dos ciclos de relógio (N) e da densidade de transição (α ). Neste caso E = K ·α ·N (5) Conseqüentemente, para diminuir o consumo dinâmico, os principais pon- tos da análise tentarão reduzir a densidade de chaveamento α , tanto quanto possível, por diferentes meios [Shin and Choi 1997]. Observando a Equação 1, é possível verificar que outra forma de diminuir a potencia energética de um circuito é diminuindo o valor da capacitância, o qual pode ser diminuído usando algum outro material semicondutor, ou usando técnicas mais avançadas no projeto dos transistores que são o elemento base de todo sistema digital. Nos últimos anos as pesquisas têm sido direcionadas para a diminuição do canal de cada elemento transistor mas, infelizmente, esse processo traz um efeito colateral que é o aumento do valor da corrente de fuga (Ileak ), o qual obriga a pensar em alternativas diferentes para diminuir o consumo de energia. Essa técnica relaciona-se com a criação e uso de novas tecnologias di- ferentes do tradicional uso de circuitos baseados em Silício. Essa parte das pesquisas está mais relacionada com novos processos e com técnicas de mi- croeletrônica. Outro destaque é a criação de circuitos que usem menos tran- sistores, o que certamente traz redução no consumo de energia. Na comunidade tem-se iniciado também muitos trabalhos para projetar ou- tros elementos base nos sistemas digitais, como é o flip-flop, com característi- cas de baixo consumo. Busca-se que o flip-flop seja de baixa potência quando está em seu estado normal de operação, e em baixo consumo de corrente de fuga (leakage) quando está em seu estado de não operação. Isso tem sido alcançado por meio de metodologias como clock gating e data gating [Srikantam and Martinez 2002]. Clock gating é um método para reduzir a potência ativa durante os períodos ociosos (idle) de operação do circuito. Não é permitido que as entradas desses blocos mudem, pois existe a ação dos flip-flops disparados por relógio, o que evita computação desnecessária conseguindo então diminuir o consumo desnecessário. 7
  • 8. E. Moreno e R. Barreto Ferramentas de projeto para ASICs são capazes de gerar sinais do tipo clock gating e sleep, para conseguir determinar os períodos de inatividade em um circuito [Srikantam and Martinez 2002]. Basicamente, um sinal do tipo sleep ou do tipo enable desativa o clock não permitindo, então, que o flip-flop consiga ter um novo dado. A Figura 6.2 mostra uma forma simples de ter um circuito baseado em clock gating. Observa-se que quando o valor de enable = 0 e Clkin = 0, o flip- flop não deixa passar qualquer dado, economizando potência. Não obstante, esta forma é somente aplicável a flip-flops estáticos, pois o mestre é estático e o latch escravo mantém o dado quando o clock está desativado. Esta forma de economia apresenta os problemas de teste e cobertura de falhas [Srikantam, 2002]. Em flip-flops dinâmicos o relógio tem que estar executando de forma contínua para o dado poder ser armazenado (latched). Se o relógio é desabili- tado, os nós internos podem ficar em estados não definidos, uma vez que não há re-alimentação (feedback) causando que a saída seja não definida. Figura 6.2. Estrutura Simples da técnica CLOCK-Gating [Srikantam and Martinez 2002]. Para evitar esse problema, usa-se outra alternativa de projeto, chamada de data gating, que consiste em parar o dado antes de ter-se um sinal de relógio, conforme mostrado na Figura 6.3. Nesta figura observa-se que quando o sinal enable = 0, o flip-flop mantém a saída. Quando enable = 1, um novo dado é permitido ser usado. O efeito é o mesmo da técnica clock gating e também não apresenta problemas de teste. Esta técnica é mais usada em projetos de alto desempenho, pois não apresenta problemas de teste, além de ter maior eficiência no consumo de energia. Outra técnica de destaque relaciona-se com o projeto de dispositivos de memória eficientes no consumo de energia. Em [Daughton et al. 2002] é pro- posto um circuito capaz de armazenar informação ainda em estados de baixo consumo até que o dado seja efetivamente usado. Portanto, os autores criaram um elemento de memória capaz de guardar o dado em um estado desligado (off). Para tanto, eles decidiram usar uma MRAM (Megnetoresistive Random Access Memory). Esta tecnologia usa o fenômeno de histereses, próprio de 8
  • 9. Técnicas para Diminuir o Consumo de Energia Figura 6.3. Estrutura Simples da técnica data gating [Srikantam and Martinez 2002]. materiais magnéticos, para armazenar dados e as propriedades de magneto- resistência de novos materiais para realizar operações de leitura de dados. As células de memória são depositadas em substratos de circuitos integrados, os quais fornecem funções de seleção de bits e de sensoriamento dos circuitos. Segundo [Beech et al. 2000], a MRAM tem o potencial de ser ideal para todos os propósitos, pois ela é relativamente rápida, densa e não volátil. Em termos práticos e gerais, observa-se que a potência consumida au- menta de modo linear quando se aumenta a freqüência, e a potência aumenta quadraticamente com o aumento da tensão Vdd . É bom lembrar que sempre se deseja ter sistemas com mais desempenho e com eficiência energética. Na tentativa de ter sistemas com melhor desempenho aumenta-se a freqüência mas, neste caso, aumenta-se a energia consumida. Outra forma é diminuindo os valores de tensão aplicada, mas isso faz com que exista menos energia e, portanto, faz com que o sistema seja usado com uma duração menor, além de ter uma possível diminuição do seu desempenho. Portanto, há um com- promisso de projeto, e os projetistas ou os usuários devem estar cientes deste compromisso. Para melhorar o consumo de energia, existem propostas baseadas em hardware e a respectiva contrapartida daquelas baseadas em software. As soluções em hardware focalizam o projeto de novos componentes, a definição de novas arquiteturas e a utilização de novas tecnologias, que con- sumam menos potência. O re-projeto de circuitos ou componentes baseados em software, visa criar uma nova versão de um programa que tem a mesma funcionalidade, mas com menor consumo de potência. Assim, uma técnica bastante usada é conhecida como escalonamento de voltagem (voltage scaling), a qual permite ajustar, em tempo de execução, a freqüência do processador e a tensão fornecida, sob controle do software de aplicação. Alguns resultados podem ser vistos na Figura 6.4. A figura mostra que com o aumento da freqüência de operação, aumenta-se também a corrente consu- 9
  • 10. E. Moreno e R. Barreto mida pelo circuito, o que produz um aumento no consumo de energia. Isso é válido para os diferentes programas executados. O lado direito da Figura 6.4 mostra o comportamento do consumo de energia para o programa FFT. Neste caso, verifica-se que com o aumento da tensão ou freqüência, aumenta o con- sumo de energia medido em Joules. Figura 6.4. Impacto de Diminuir Voltagem e Freqüência [Ellis 2003] A técnica de usar vários valores de tensão e/ou de freqüência está se tor- nando tão significativa, que na atualidade há vários processadores que ofere- cem a posssibilidade de ter vários níveis de tensão, e o valor de funcionamento pode ser selecionado pelo usuário. Por exemplo, a Figura 6.5 mostra que o pro- cessador StrongARM permite dois valores (233 MHz e 2V e, 175 MHz e 1.5V), enquanto o processador XScale permite cinco possíveis valores, a saber: 150 MHz e 0.75V, 400 MHz e 1.0V, 600 MHz e 1.3V, 800 MHz e 1.6V e, 1 GHz e 1.8V. A Figura 6.5 permite visualizar o desempenho (medido em MIPS - Milhões de Instruções Por Segundo) e a potência consumida pelo processador (medida em watts). Nesta figura observa-se que tanto o desempenho quanto a energia do processador aumenta, conforme também aumenta os valores de tensão e de freqüência. Na Figura 6.5 também é possível observar que o processador StrongARM possui consumo de energia maior que o desempenho, enquanto o processador XScale possui menor consumo de energia. Isso se deve ao fato de que a Intel tem investido em pesquisas e técnicas para diminuição do consumo de energia. A Tabela 6.2 mostra a política de diminuição de energia que a Intel tem especificado para um sistema computacional, assim como para cada um de seus principais componentes. Na Tabela 6.2 é possível observar que a Intel possui um projeto de cons- trução de um notebook, o qual tem aproximadamente 50% do consumo de um 10
  • 11. Técnicas para Diminuir o Consumo de Energia Figura 6.5. Voltagem e freqüência no processador Intel XScale [Intel 2005]. sistema normal. Isso será possível usando técnicas para diminuir o consumo da maioria dos componentes que constituem o sistema. Os componentes que terão diminuição são: o processador, a memória cache, o subsistema gráfico, o subsistema de áudio, a fonte de potência, e o sistema de tela. Os outros componentes não apresentam muita diferença com os sistemas já existentes. Um outro ponto importante relacionado com a técnica de mudar os valores de tensão e de freqüência, é que é possível mudar ambas variáveis ao mesmo tempo, tendo assim um maior impacto na diminuição do consumo de energia. Só recomenda-se ter cuidado, pois diminuir esses valores pode acarretar pro- blemas de degradação do desempenho, conforme se observa na Figura 6.5. Essa mudança pode acontecer de forma estática, isto é, antes de se ini- ciar a execução de um determinado programa. Porém, o grande desafio atual é realizar essa mudança de forma dinâmica, isto é, em tempo de execução. Essa técnica é conhecida como DVS - Dynamic Voltage Scaling, ou mais com- pleta ainda DVFS, que inclui também a possível mudança dinâmica do valor da freqüência de operação do sistema. Outra técnica está ligada com a otimização dos dados e/ou do código na memória. Esta técnica pode produzir um menor uso dos componentes do sis- tema. As otimizações de código, por exemplo, podem produzir menos tran- sições dependendo da forma como o código é executado e, também, da or- 11
  • 12. E. Moreno e R. Barreto Tabela 6.2. Comparação nos Objetivos de Potência em Sistemas Intel [Intel, 2005] ganização dos bits. Conseqüentemente, pode-se ter resultados diferentes no consumo de energia dependendo, principalmente, da ordem de execução das instruções. Da mesma forma, de acordo com o dado a ser enviado, pode-se ter diferen- tes arranjos e diferentes consumos. Na Figura 6.6 tem-se que enviar 2 bytes 0xFF e 2 bytes 0x00, existem diversas formas de arranjá-los considerando que a atividade de chaveamento (ou transição) pode variar de 1, 2, ou 3 transi- ções. Se a preocupação principal for economia de energia, então tem-se que procurar o melhor arranjo. Figura 6.6. Exemplo de atividade de chaveamento ou transição. Um exemplo do consumo de energia e da quantidade de energia salva pode ser dado usando como medida a distância de Hamming [Lin and Costello 1993], 12
  • 13. Técnicas para Diminuir o Consumo de Energia que é a diferença entre duas strings binárias de mesmo tamanho. Em outras palavras, a distância de Hamming é o número de bits que diferem na mesma posição em duas seqüências de igual tamanho. Esta medida pode ser usada, por exemplo, para estimar o consumo de energia e a quantidade de energia que pode ser economizada. Supondo que é desejado transmitir os 5 bytes se- guintes 0xB3, 0x4C, 0xAB, 0x58, 0xBE. Se o dado for transmitido na ordem mencionada pode-se ver na Figura 6.7(a) que haverá 30 transições, ou seja, a distância de Hamming é 30. Por outro lado, na Figura 6.7(b) o mesmo con- junto de dados é transmitido com apenas 20 transições (a nova distância de Hamming é 20). Neste caso, tem-se uma economia de (1 − 20 ) = 33% nas 30 transições, o que representa uma boa economia de energia. Figura 6.7. Seqüência de dados e código de Hamming. É importante ressaltar que as técnicas de DVFS e a de re-organização dos dados estão intimamente ligadas às técnicas de diminuição de consumo de energia pelos compiladores. Estas técnicas são melhor explicadas nas Seções 6.3 e 6.5. Entretanto, é importante ter em mente que elas produzem, também, diminuição de energia devido aos circuitos. 6.3. Nível de Arquitetura Esta seção apresenta as principais considerações para diminuir consumo de energia, sob aspectos e técnicas arquiteturais. Como exemplo pode-se mencionar que há esforços na tentativa de definir o conjunto de instruções de forma específica à aplicação, os conhecidos ASICs (circuitos integrados de aplicação específica) e ASIPs (processadores de aplicação específica). Além disso, outra técnica é definir instruções específicas que permitam ter as mesmas funcionalidades de uma instrução normal, porém com critérios de menor consumo. Como exemplo, pode-se mencionar que haverá instruções especiais para acessar memória, instruções para acesso eficiente a memória cache, instruções que permitam realizar funcionalidades mais complexas dedi- cadas a somas, multiplicações e outras operações aritméticas eficientes tanto em desempenho quanto em consumo de energia. 13
  • 14. E. Moreno e R. Barreto Outro ponto relevante é o uso de arquiteturas reconfiguráveis, as quais permitem reconfigurar de forma dinâmica não somente o conjunto ISA, mas também as funcionalidades arquiteturais de um determinado circuito em função das necessidades específicas da aplicação [Hauck 2008]. Conforme discutido em [Silva et al. 2007], a técnica rISA (ou Reduced Bit- width Instruction Set Architecture) é um recurso arquitetural empregado para reduzir o tamanho do código de programas [Shrivastava et al. 2002]. Alguns processadores possuem este recurso e executam instruções baseados em dois conjuntos distintos. Um deles é o conjunto normal ISA do próprio processador e o outro é o conjunto de instruções reduzidas, o qual engloba as instruções mais freqüentes, existentes no código do programa, as quais são codificadas em um número menor de bits. Alguns exemplos de processadores que usam esta técnica rISA são: o processador ARM7TDMI, o TinyRISC, o ARC Tangent, o STMicro da família ST100 e o MIPS32/16 bit. Segundo [Silva et al. 2007], os processadores baseados na técnica rISA, expandem dinamicamente as instruções reduzidas em suas correspondentes instruções normais. Conforme afirmado por [Shrivastava et al. 2002], cada ins- trução reduzida conta com uma instrução equivalente no conjunto de instru- ções normal, fazendo com que o processo de tradução seja simples e direto, o que exige somente a inclusão de uma simples unidade de tradução no hard- ware do processador. Importante observar que nenhum hardware adicional é necessário. Além da redução de tamanho do código do programa, um programa com instruções reduzidas requer menos acessos à memória de instruções quando é executado. Conseqüentemente, há um decréscimo no consumo de ener- gia neste subsistema. Se todo o código do programa pudesse ser expresso em termos de instruções reduzidas, então aproximadamente 50% de redução de tamanho seria obtida e, conseqüentemente, haveria uma proporcional redu- ção no consumo de energia na memória de instruções [Shrivastava et al. 2004, Silva et al. 2007]. Segundo [Silva et al. 2007], o uso do rISA para a redução do tamanho do código de programas e, conseqüentemente, para a redução do tamanho da memória ROM exigida no sistema, diminui o custo do produto final. Seguindo a linha de pesquisa de [Shrivastava et al. 2004], os processadores contemporâ- neos que usam rISA, e suas implementações que usam instruções reduzidas, dependem também dos formato que essas instruções seguem. Em [Shrivastava et al. 2002], foram empregados diversos formatos, os quais variam na quantidade de bits que empregam para a especificação dos diferen- tes campos da instrução (opcode, registradores e imediatos), assim como no emprego ou não de instruções especiais, que não fazem parte do código origi- nal do programa, e que têm como objetivo complementar informações que não podem ser representadas com o reduzido número de bits disponível no formato em questão. Segundo [Silva et al. 2007], essas instruções reduzidas especiais, como 14
  • 15. Técnicas para Diminuir o Consumo de Energia rISA extend, por exemplo, usada para completar valores imediatos, requerem um processo de tradução mais complexo e geram um impacto negativo no de- sempenho da aplicação, como será explicado na próxima seção. O número de bits usados para especificar o opcode, nestes formatos abordados, é 4 e 7, o que permite a redução de 16 e 128 instruções distintas (diferentes opcodes) do código original, respectivamente. Eles relatam que o formato rISA-4444 (16 opcodes distintos e acesso a 16 registradores por operando) apresenta o me- lhor resultado em termos de redução de código, levando-se em consideração o compromisso entre a redução obtida e a complexidade da unidade de tradução. O trabalho descrito por [Shrivastava et al. 2004], afirma que a principal vanta- gem de rISA é a alta taxa de compressão de código e a economia de energia, vantagens obtidas com um mínimo de alterações no hardware do processador. Levando em consideração as analises anteriores, [Silva et al. 2007] con- seguiu mostrar que a existência de um algoritmo de busca para redução de código não é suficiente para atingir os melhores resultados em termos de con- sumo de energia, uma vez que não leva em consideração o aspecto dinâmico de execução da aplicação. Silva mostrou e analisou também um algoritmo que leva em consideração este aspecto dinâmico. O algoritmo foi aplicado e usado em um processador MIPS com e sem memória cache, obtendo uma economia média de 26% no acesso à memória de instruções em um modelo base rISA, em uma organização sem memória cache. Outra técnica arquitetural relaciona-se com o tratamento da fila de execu- ção das operações fora de ordem (out-of-order execution). Nos processadores que adotam pipeline com a técnica de execução fora de ordem, varias instru- ções fora da ordem normal e seqüencial podem ser executadas conforme os dados das próximas instruções estejam disponíveis. Só que esses dados de- vem ser armazenados em buffers especiais, o que acarreta um acréscimo no consumo de energia. Em [Buyuktosunoglu et al. 2002], foi mostrado um trabalho de pesquisa di- recionado a técnicas que significativamente diminuem a potência das filas de execução enquanto mantém o funcionamento de alto desempenho. Eles pro- puseram duas técnicas: a primeira é a implementação de uma estrutura CAM/- RAM para a emissão de instruções na fila de instruções aptas para serem exe- cutadas, e um modelo adaptativo que libera a inserção e transmissão de portas (ver Seção 6.2, que discute os circuitos ativos ou não, em função da sua atual necessidade de funcionamento). Segundo os autores, a utilização dessas duas técnicas fornece um ganho de 73% na diminuição de energia consumida pelos processadores executando o benchmark SPEC CPU 2000, com somente 3% de degradação do desempenho. A Figura 6.8 mostra o impacto dessa técnica, quando comparada a técnicas normais como aquelas que somente usam sistemas baseados em clock gating, ou sistemas que usam a técnica de data-gating. Observa-se que a técnica de CAM/RAM permite um ganho de até 60%, na diminuição do consumo de energia. 15
  • 16. E. Moreno e R. Barreto Figura 6.8. Dissipação alternativa na emissão de instru- ções [Buyuktosunoglu et al. 2002]. A idéia central baseia-se no fato de cada aplicação possuir um padrão de execução e, portanto, pode-se ajustar a fila das instruções que podem ser exe- cutadas. Outras técnicas baseiam-se no fato de realizar um escalonamento estático, dando ênfase na redução da complexidade da lógica de emissão dessas instruções [Canal and Gonzalez 2000, Folegnani and Gonzalez 2000, Folegnani and Gonzalez 2001]. Outra vertente de otimização do desempenho de um programa relaciona- se com diminuição do número de instruções, o qual melhora também a energia consumida uma vez que se diminui o número de ciclos necessários para com- pletar uma tarefa [Grunwald 2002]. Esta técnica está intimamente ligada ao melhoramento e eficiência de algoritmos e compiladores. Alguns trabalhos, por exemplo [Patterson and Hennessy 2007], têm focado em técnicas de especulação, que é uma ferramenta fundamental em arquite- tura de computadores, pois permite que uma implementação arquitetural al- cance alto paralelismo de instruções e, portanto, alto desempenho, tentando fazer predição de algum resultado de alguns eventos específicos. A maioria dos processadores atuais implementam predição de desvios (branch) para permitir mudanças especulativas no fluxo de controle, enquanto outros trabalhos tem focado em predição de valores de dados para diminuir as dependências de da- dos [Graybill and Melhem 2002, Lipasti 1997]. Importante salientar que o uso inadequado de técnicas de especulação faz com que exista trabalho perdido, o que pode trazer uma sobrecarga no consumo de energia. O trabalho de [Grunwald 2002] propôs duas técnicas para melhorar a es- peculação. Uma das técnicas usa intervalos de confiança para implementar melhor a técnica de pipeline gating. Intervalo de confiança é uma técnica que permite aumentar a qualidade de uma determinada predição, enquanto pipe- line gating é uma técnica de controle da especulação que usa intervalo de confiança para reduzir a especulação em processadores com pipelining. A 16
  • 17. Técnicas para Diminuir o Consumo de Energia diminuição da atividade de processamento diminui o número de buscas de ins- truções realizadas pelo processador, o que pode então diminuir a energia. A outra técnica proposta por [Grunwald 2002] faz um maior controle da especu- lação usando técnicas de escalonamento de voltagem (DVS). Como se observa, várias técnicas estão intimamente relacionadas e po- dem ser usadas em conjunto. Interessante perceber que há novamente certo paradoxo entre desempenho e energia. Para aumentar o desempenho, os pro- cessadores têm incluído melhoramentos arquiteturais baseados em técnicas agressivas de especulação, aumentando o paralelismo de instrução. Estas melhorias têm aumentado o número de instruções por ciclo (IPC - Instructions Per Cycle), aumentando assim o consumo de energia, o qual pode se tornar ainda mais crítico se houver trabalho perdido, isto é, se a especulação não for adequada. Neste sentido, quando o alvo do projeto é a energia, então é necessário usar técnicas de pipeline gating, que visa melhorar ou diminuir a percentagem de instruções que estimulam a especulação [Grunwald 2002]. A Figura 6.9 mostra o consumo de potência de um processador Pentium- Pro, o qual foi dividido em função do consumo de cada componente. Observa- se que os componentes que mais demandam consumo são a busca e a de- codificação, assim como a utilização das memórias cache e os componentes para realizar o escalonamento dinâmico. Por esse motivo, pesquisadores têm dedicado muito esforço investigando como diminuir o consumo nesses compo- nentes. Figura 6.9. Consumo de Energia em um Processador com Pipeline [Grunwald 2002]. 17
  • 18. E. Moreno e R. Barreto É possível observar também que há várias operações que requerem a exe- cução de várias operações micro-arquiteturais, as quais acabam consumindo mais energia do que a instrução de processamento desejada. Por exemplo, quando se realiza uma soma de dois inteiros em uma máquina RISC, somente 5% do consumo total de energia é devido à circuitaria do próprio somador, o restante é dissipado por estruturas tais como tag do cache, arranjos de dados, TLBs, arquivos de registradores, registradores do pipeline, e lógica do controle do pipeline [Grunwald 2002]. Portanto, dada a consideração anterior há vários estudos que tentam mu- dar o padrão de acesso ou o uso de alguns desses componentes, visando en- tão diminuir o consumo sem afetar consideravelmente o desempenho. Nesse sentido, [Grunwald 2002] propôs três técnicas, sendo duas delas arquiteturais e uma terceira devido ao compilador. Uma das técnicas consiste em usar latches especiais para realizar um by- pass exposto, com ajuda de uma arquitetura baseada em acumulador, que usa informação do tempo de vida de um registrador (em tempo de compilação) para reduzir o número de leituras e escritas ao arquivo de registradores realizados em tempo de execução. Em uma computação, vários valores de registradores possuem uma vida curta, pois são produzidos por uma instrução e consumidos pela instrução seguinte, e nunca mais são usados novamente. A informação do tempo de vida desses registradores pode ser codificada adicionando regis- tradores do acumulador a registradores de propósito geral da arquitetura RISC, permitindo então que o software passe esses valores diretamente de uma ins- trução à próxima, sem necessidade de acessar esses registradores de propó- sito geral. [Grunwald 2002] mostrou que essa técnica pode remover 34% de todas as escritas em registradores e uma média de 28% dos acessos a todas as leituras. A segunda técnica proposta por [Grunwald 2002] é uma otimização dos acessos aos tags quando se faz uso da memória cache. Em processadores de baixo consumo de energia, os acessos aos tags são responsáveis por aproxi- madamente 50% da energia usada quando se faz um acesso ao cache. Eles conseguiram mostrar que há casos onde se pode verificar 2 acessos ao mesmo bloco do cache e, neste caso, se realiza então uma marcação de operações load e store, em tempo de compilação, que fazem com que o hardware evite de checar o tag do segundo acesso. Os autores mostraram que é possível indicar até 70% da checagem dos tags, em experimentos realizados com programas do SPECint95 e do benchmark Mediabench. Em termos de arquitetura, pode-se também pensar em adicionar instruções especiais ao conjunto ISA do processador, que permitam realizar otimizações aos acessos de memória, incluindo otimizações de código que permitam ter mais dados nas memórias caches. Essas otimizações são necessárias, pois conforme mostra [Tiwari and Lee 2005], na Tabela 6.3, os acessos a dados que não estão no cache ou não estão na memória principal de um computador 486 DX2 são críticos em termos de consumo de energia. 18
  • 19. Técnicas para Diminuir o Consumo de Energia Tabela 6.3. Consumo de Energia em Instruções e Opera- ções de Memória [Tiwari and Lee 2005]. Os dados da Figura 6.10 foram obtidos por [Marwedel et al. 2005] a partir da utilização do simulador CACTI. A parte superior da Figura 6.10 mostra o comportamento do consumo de energia (medido em nJ) conforme se aumenta o tamanho da memória. A parte intermediária da Figura 6.10 mostra a energia por acesso a memória em função do tamanho de memória, para vários tama- nhos de sub-bancos de memória, e a parte inferior da Figura 6.10 mostra o tempo de acesso (ns) em função do tamanho da cache, também para vários sub-bancos de memória. Os autores concluíram os benefícios em se usar pe- quenas memórias, e caso a memória seja de tamanho maior, então, sugerem o uso de sub-bancos. 6.4. Nível do Sistema Operacional Esta seção apresenta as principais técnicas para otimizar o consumo de energia em sistemas embarcados, sob uma visão de mudar e otimizar as fun- ções inerentes ao sistema operacional. Técnicas em hardware conhecidas como clock gating permitem ao software colocar os recursos em um estado de hibernação quando eles se encontram no estado ocioso (idle), e muda depois seu estado, para o de execução ou de operação quando são novamente solicitados para alguma operação. Em geral, essas técnicas confiam na existência de uma camada arquitetural que permite acesso aos múltiplos modos ou configurações de potência sempre sob con- trole do software. Esses modos de potencia têm diferentes compromissos de desempenho e potencia. A idéia é que o software (aplicação) consiga gerenciar esses modos satisfazendo certa demanda de desempenho enquanto reduz a potencia da CPU (ou de outros componentes) tanto quanto seja possível. Interessante observar que a configuração desses modos de potência, em função dos diferentes estados de execução da CPU, podem ser também apli- cados a outros componentes e a dispositivos não necessariamente micropro- cessados. A Figura 6.11 mostra a distribuição e uso dos diferentes estados de compo- nentes eletrônicos. Pode se visualizar que há tempo para operação e tempos em que esses componentes estão em estado dormente (sleeping) ou ocioso 19
  • 20. E. Moreno e R. Barreto Figura 6.10. Impacto da memória no consumo de ener- gia [Marwedel et al. 2005]. (idle), e seria interessante aproveitar esses tempos para desligar esses com- ponentes ou aplicar alguma técnica para que nesses estados o consumo dimi- nua. A Tabela 6.4 mostra duas placas de transmissão de dados onde os diferen- tes estados possuem um consumo de energia diferente, o que valoriza ainda mais a idéia de criar técnicas e ou mecanismos que permitam mudar o estado de operação dos componentes visando um menor consumo. Nessa tabela é possível verificar que o estado de menor consumo é o sleep, seguido pelo es- tado idle. Observe que quando o componente se encontra em operação de transmissão, o consumo de energia é bem maior (em torno de 47%) do que quando está em operação de recebimento de dados. Assim, uma idéia se- ria colocar, se possível, o componente em estado sleep, em invés do estado 20
  • 21. Técnicas para Diminuir o Consumo de Energia Figura 6.11. Transição de estados de execução. Tabela 6.4. Consumo de Corrente para Diferentes Esta- dos de Execução idle, economizando de 12 a 23 vezes o consumo desse componente (ver Ta- bela 6.4). Os dados de potência para o processador StrongARM 160MHz, 2 caches- on chip de 16kB, em função dos seus estados de funcionamento são: • Modo Normal Ativo: 450 mW. • Modo idle: 20mW, retorna ao normal, não há atrasos. Neste caso, o relógio interno é parado. • Modo sleep: 150 nW, retorna ao estado normal em 140ns. Neste caso, a potencia interna está desligada (off) e os circuitos de I/O permanecem ativos. Importante salientar que cada componente possui seu próprio sistema de execução, o que faz com que tenha estados diferentes e cada um deles com seus próprios tempos de funcionamento. Deve-se observar também que na transição de um estado para outro há um tempo de atraso e esta é uma operação que também consome energia, conforme se observa na Figura 6.12. Importante salientar que nas transições ocorre um fenômeno conhecido como transitório elétrico (produzido quando o sistema ou componente está funcionando em um determinado estado, sob uma condição, e muda para outro com características físicas diferentes) que pode ser prejudicial para o consumo de energia do circuito e para seu próprio 21
  • 22. E. Moreno e R. Barreto funcionamento pois, dependendo do transitório, pode levar a uma falha física do circuito. Portanto, apesar de ser aparentemente simples de implementar, deve-se ter cuidado com a energia consumida e com os efeitos gerados nas transições. Figura 6.12. Energia consumida em diferentes estados de uma RAMBUS [Ellis, 2003]. 6.5. Nível do Complilador Esta seção descreve os principais métodos ou técnicas para diminuir o con- sumo de energia considerando aspectos de otimização do compilador. No contexto dessa seção, um otimizador é um programa que recebe como entrada um programa P e constrói outro programa P , equivalente a P, que é melhor que P segundo algum critério [Rangel 2000]. Há diversas formas de se fazer otimização em compiladores. A maneira de tratar a otimização pode ser extremamente pragmática. Por exemplo, em um programa grande, a execução gasta 90% em 10% do código, e 10% do tempo nos 90% do código restantes. Nesse caso, o tempo maior de execução (“os 90%”) é gasto no laço mais interno (“os 10%”) [Aho et al. 2006]. Por isso que as otimizações são principalmente dedicadas aos laços. Até pouco tempo atrás, os otimizadores do compilador enfocavam mais a questão desempenho e tamanho do código. As otimizações tradicionais, tais como, eliminação de sub-expressões comuns, eliminação de redundância parcial, redução de força (strenght reduction), ou eliminação de código morto simplesmente melhoram o desempenho de um programa por reduzir o trabalho a ser feito durante a execução do programa [Allen and Kennedy 2001]. 22
  • 23. Técnicas para Diminuir o Consumo de Energia Com o avanço dos sistemas embarcados, principalmente os sistemas mó- veis e sem fio, os quais são dependentes de bateria, surgiu a demanda por aplicações com baixo consumo de energia/potência. Uma das alternativas de solução desse problema é a otimização do compilador segundo o critério con- sumo de energia/potência. É sabido que a redução da carga de trabalho (workload) pode também re- sultar em redução de consumo de potência/energia. Por isso é que há algumas técnicas de otimização em que o código é otimizado tanto para melhorar seu desempenho quanto para o consumo de energia. Por exemplo, as otimizações relacionadas com a hierarquia de memória, tais como bloqueio de laço (loop blocking ou loop tiling) e alocação de registradores, tentam manter o dado o mais próximo possível de modo que seja acessado rapidamente. Obviamente que mantendo o valor na cache, no lugar da memória, ou em um registrador, no lugar da cache, também ajuda a reduzir o consumo de potência/energia devido a redução das atividades de chaveamento (ver Seção 6.2). Entretanto, existe uma diferença fundamental nos modelos e métricas usa- dos para otimizar o desempenho das usadas para otimização de consumo de potência/energia. Muitos modelos e/ou métricas levam em consideração o ca- minho crítico (critical path), que pode ser definido como a seqüência de ati- vidades que devem ser concluídas no tempo programado para que o projeto como um todo possa ser finalizado dentro do prazo final [Woolf 2007]. O ca- minho crítico pode também ser entendido como o pior caminho a ser seguido. É importante entender a seqüência do caminho crítico para saber onde há ou não flexibilidade. Por exemplo, poderá haver uma série de atividades que fo- ram finalizadas com atraso, no entanto, o projeto como um todo ainda será concluído dentro do prazo. Isto ocorre porque tais atividades não se encontra- vam no caminho crítico. Portanto, se uma otimização introduz atividades fora do caminho crítico o desempenho não é afetado. Quando essas atividades não-críticas levar a um decremento do caminho crítico, a otimização será be- néfica. Entretanto, no contexto de otimização de potência/energia, isto não é verdade. Qualquer atividade, estando ou não no caminho crítico irá contribuir para a dissipação de potência geral e uso de energia. A Figura 6.13 mostra um exemplo que ilustra a diferença de otimização para potência/energia versus otimização para melhorar o desempenho, consi- derando uma transformação de código fonte, nesse caso, a movimentação de código de invariante de laço [Ponce 2006]. No programa exemplo, a atribuição a = b * 2 é um invariante de laço. Para uma arquitetura escalar tradicional, esta otimização irá mover a atribuição para fora do laço, resultando no código da Figura 6.13(b). Em uma arquitetura VLIW (Very Long Instruction Word), o trecho de código da Figura 6.13(a) pode ser melhor que o código em (b) se instruções vazias estiverem disponíveis para executar a atribuição invariante do laço para cada interação do mesmo. Embora a atribuição ocorra 10 vezes, esta abordagem pode reduzir o caminho crítico. Dependendo da estratégia de compilação usada, a movimentação da atribuição para fora do laço pode in- 23
  • 24. E. Moreno e R. Barreto crementar o caminho crítico. No contexto de otimização de potência/energia, executar computações redundantes devem ser evitadas, e portanto, mover a atribuição invariante fora do laço tipicamente leva a uma redução do consumo de potência/energia. for (i=0; i<10; i++) { a = b * 2; a = b * 2; for (i=0; i<10; i++) c[i] = d[i] + 2.0; c[i] = d[i] + 2.0; } (a) (b) Figura 6.13. Comparação entre otimizações [Ponce 2006] Outro exemplo onde otimizações para potência/energia pode ser diferente daquelas relacionadas com a melhoria do desempenho é a execução especula- tiva [Kaeli and Yew 2005]. A especulação executa atividades à frente baseado em algumas suposições sobre o comportamento futuro do programa. Se estas suposições forem falsas, algum trabalho adicional será necessário para desfa- zer o impacto das atividades especuladas. Software pre-fetching é um exemplo de tais transformações. O compilador pode inserir instruções de pre-fetching para acesso a memó- ria entre desvios de controle. Essa otimização pode ser muito efetiva, assu- mindo que a máquina alvo permita múltiplas cargas de dados. Além do mais, se a atividade especulativa puder ser escondida no caminho de execução não- crítico, nenhum impacto negativo no desempenho irá ocorrer. No contexto de otimização de potência/energia cada atividade especulativa adicional tem que ser compensada pelo benefício geral da otimização a fim de fazer com que os resultados não sejam piores. Em outras palavras, a janela de benefício tem que ser maior para potência/energia do que desempenho. Isto não significa que especulação não possa ser aplicada para otimização de potência/energia, mas sugere-se uma aplicação menos agressiva dessa transformação restrin- gindo para casos onde o benefício é mais provável. Os primeiros compiladores usavam a velocidade ou tamanho do código como métricas de otimização. Os compiladores mais modernos incluíram uma nova métrica, o consumo de energia. A energia consumida por um processador depende do estado anterior e da entrada atual. Nesse caso, o consumo é de- pendente da escolha da instrução e a ordem das instruções. Reordenar as ins- truções pode reduzir a atividade de chaveamento e conseqüentemente o con- sumo de energia geral. Existem diversos esforços no ajuste de escalonadores de instruções para otimizar o consumo de energia [Allen and Kennedy 2001, Ponce 2006]. Uma observação chave nessas otimizações é que o maior deter- minante do consumo de energia é a atividade de chaveamento (switching) no caminho de dados (datapaths). Assim, por meio do ordenamento das instru- ções, de tal forma a reduzir o chaveamento entre instruções sucessivas, pode 24
  • 25. Técnicas para Diminuir o Consumo de Energia ser criada uma escala de instruções cujo resultado final produz um menor con- sumo de energia [Muchnick 1997]. A seguir será detalhado as abordagens para redução de acesso ao barra- mento, redução no acesso à memória, técnicas de escalonamento de instru- ções e transformação de laços [Ponce 2006]. 6.5.1. Redução no Barramento Com o incremento do tamanho do armazenamento de dados, ao mesmo tempo em que os processadores estão com grandes palavras de instruções (instruction words), hoje com 32, 64 ou 128, os barramentos de transmissão de dados estão ganhando muita importância. É natural que com este incremento, os barramentos passem a consumir cada vez mais potência. Por causa da lar- gura e comprimento, barramentos contém uma grande capacitância em suas linhas. Reduções de consumo de energia importantes podem ser atingidas por meio da redução da atividade de chaveamento. Algumas técnicas foram desenvolvidas para reduzir as transições nos barramentos de dados e de en- dereço [Stan and Burleson 1995, Su et al. 1994]. Código de Gray e inversão da codificação serão detalhadas nesta seção. 6.5.1.1. Código de Gray O código de Gray é devido ao físico e pesquisador da Bell Labs Frank Gray que em 1953 registrou uma patente nos EUA sobre uma nova forma de codificação chamada de Pulse Code Communication. Código de Gray é uma seqüência binária com a propriedade de que so- mente um bit é trocado entre qualquer dois elementos consecutivos, ou seja, os dois códigos têm distância de Hamming igual a um. Na Figura 6.14(a) pode- se ver a codificação em binário de uma seqüência de números, e na Figura 6.14(b) a mesma seqüência codificada pelo código de Gray. Pode-se calcular que para os 4 bits, a codificação binária vai requerer 26 transições, enquanto que a codificação de Gray requer somente 15. Portanto, a redução seria de 11 transições, que corresponde a 42%. Uma vez que é comum novas aplicações acessarem grandes quantidades de dados, é importante encontrar uma forma de endereçar a memória de tal forma que possa-se reduzir a atividade de chaveamento. Quando o dado a ser trazido é uma instrução, com exceção das instruções de desvio, na maioria das vezes o acesso à memória será contínuo devido a execução seqüencial dos programas. Nesse contexto, para reduzir a distância de Hamming entre acessos a instruções, uma alternativa para baixo consumo de energia seria a adoção do código de Gray [Su et al. 1994]. 25
  • 26. E. Moreno e R. Barreto Figura 6.14. Código binário e código Gray. 6.5.1.2. Inversão de Codificação de Barramento Caso a distância de Hamming entre dois acessos consecutivos consecuti- vos ao barramento seja maior do que a metade do tamanho do barramento, isto é, mais do que a metade dos bits devem ser trocados, [Stan and Burleson 1995] propuseram um método que provê redução na atividade de chaveamento no barramento pela inversão da codificação do barramento. Neste caso, este mé- todo melhora em pelo menos 50% de redução em cada utilização do barra- mento. Entretanto, esta abordagem requer um bit extra, como um sinal, para saber se o barramento está no modo original ou no modo invertido. Con- seqüentemente, este bit introduz uma atividade de chaveamento adicional, em- bora usualmente proveja uma redução na potência consumida. 6.5.2. Redução no Acesso à Memória Uma grande quantidade de uso do barramento é devido ao acesso à me- mória, não somente para endereço, mas principalmente para recuperar dados. Isto possibilita outro meio de economizar potência, uma vez que a partir da minimização do uso do barramento, a comunicação com os dispositivos de memória e com outros componentes é otimizada. Reduções no acesso a memória externa são obtidos por meio de: • incremento da localidade; • uso de registradores; 26
  • 27. Técnicas para Diminuir o Consumo de Energia • entrelaçamento de arranjos de dados; e • redução de taxa de falta de cache. Ao executar otimizações do compilador deve-se tentar usar o máximo pos- sível de memória interna. Portanto, a prioridade deve ser o uso de registrado- res internos, depois cache-L1, em seguida cache-L2 e, por último, a memória externa. Otimizando o código para usar endereços da memória interna, não somente levará a um melhor desempenho por meio da minimização das ope- rações de E/S, mas também menos potência devido a minimização do uso do barramento. Para cada uma dessas opções de otimização, existem aborda- gens específicas. Para o caso da otimização do uso de registradores, uma alternativa seria que o compilador reorganize os registradores de tal forma que os registradores usados em cada rotina estejam o mais próximo um do outro quanto possível. Uma técnica proposta por [Delaluz et al. 2000] é entrelaçar os arranjos de dados de tal forma que as operações executadas entre arranjos estejam tam- bém em memória contínua. Um exemplo é mostrado na Figura 6.15. Se esses arranjos forem constantes, será muito mais simples arranjá-los e predizer o caminho de dados em tempo de compilação, mas este entrelaçamento pode também ser feito por qualquer tipo de arranjo que seja usado dentro de um programa. Figura 6.15. Entrelaçamento de arranjos de dados. Esta técnica incrementa a localidade de cache. Um programa em execu- ção como o da Figura 6.15(a) tem uma boa localidade espacial. Entretanto, o arranjo Better da Figura 6.15(b) é mais improvável de ser mantido fora da ca- che. A razão é simples, se mantivermos dois arranjos separados, o endereço base deles pode causar um conflito na cache. Usando somente um arranjo, como combinação de dois ou três arranjos, é possível garantir que o arranjo na cache seja usado o tempo todo. Essa arrumação reduz a taxa de falta na cache. Portanto, o custo de potência de recuperação de novos dados é gran- demente minimizado porque reduz o uso do barramento. 6.5.3. Escalonamento de Instruções Escalonamento de instruções é uma técnica de software que rearranja seqüências de código durante a compilação com o objetivo de reduzir pos- síveis atrasos de execução. Para escalonar as instruções usa-se um grafo 27
  • 28. E. Moreno e R. Barreto acíclico dirigido (directed acyclic graph - DAG) onde cada vértice representa uma instrução em um programa. Diferentes restrições podem ser usadas nos DAGs para atingir redução de potência. Uma das otimizações mais comuns para baixo consumo de potência é minimizar a distância de Hamming. Como apresentado anteriormente, isto pode ser feito pela escolha da ordem de valo- res, mas esses valores podem tratar não somente informação de dados mas também as instruções a serem executadas. O procedimento para reescalonar um código é o mesmo, tanto para infor- mações de dados quanto de controle. Este pode ser sintetizado em três passos principais: 1. particionar o código em blocos, de modo que o procedimento possa ser aplicado seqüencialmente em cada uma das partes; 2. gerar um grafo de dependência de controle (control dependency graph - CDG), para instruções, e um grafo de dependência de dados (data dependency graph -DDG); e 3. percorrer os grafos de dependência para selecionar a nova ordem de instruções e/ou dados mas sujeito às restrições escolhidas (reescalona- mento). Geralmente este escalonamento de instruções é feito pelo compilador. Só que, nesse caso, acontece um problema. A fim de reduzir a atividade de cha- veamento, o DDG e CDG são normalmente derivados da forma simbólica das instruções no código. Entretanto, para calcular a atividade de chaveamento a informação não é provida neste nível. Por exemplo, a informação do endereço das instruções de desvio não são conhecidas até serem escalonadas e alo- cadas nos registradores. Por outro lado, quando a montagem é feita antes do escalonamento das instruções, perde-se muita flexibilidade no escalonamento. As principais abordagens de escalonamento de instruções são: cold sche- duling, escalonamento horizontal e escalonamento vertical. 6.5.3.1. Cold Scheduling Cold Sheduling [Su et al. 1994, Tiwari et al. 1994] é uma técnica de escalo- namento de instruções executada como uma fase da compilação que prioriza a seleção de cada instrução baseada no custo da energia de se colocar esta ins- trução como a próxima instrução a ser executada. Esta técnica visa, portanto, reduzir o consumo de energia minimizando as atividades de troca ocorridas no circuito do processador durante a transição entre duas instruções consecutivas. As entradas para o cold scheduling são o DDG e o custo de potência entre duas instruções consecutivas. Este escalonamento foi testado por [Su et al. 1994] e teve reduções de consumo de energia de 20% a 30% com uma redução de desempenho de somente 2% a 4%. 28
  • 29. Técnicas para Diminuir o Consumo de Energia Uma vez que o DDG tenha sido gerado, o custo de potência entre duas instruções pode ser calculado por sua distância de Hamming. Nesse caso, quanto menor for a distância de Hamming menor será o consumo de potência. A idéia pode ser sumarizada da seguinte forma: cada instrução é assumida ter um custo base (denotando o seu consumo de energia médio). Uma aresta ponderada entre nodos i e j fornece a energia consumida pela atividade de chaveamento da instrução i para a instrução j. Esta aresta é também chamada de custo interinstrução (ou custo do estado do circuito, do inglês circuit-state cost). Uma vez que o tipo e número de instruções são fixos antes do esca- lonamento das instruções, um algoritmo de escalonamento pode reduzir com sucesso o custo total inter-instrução. O algoritmo de escalonamento é um processo iterativo que funciona como descrito abaixo: • para cada bloco de instruções, enquanto houver instruções do bloco a serem escalonadas: – dada a lista de instruções prontas para executar (obtidas do grafo de dependência) e a última instrução da escala: selecione a ins- trução da lista que exija menor troca de bits em relação à última instrução executada de acordo com a tabela de custos de ativida- des de troca; – adicione a instrução selecionada da lista à nova escala de instru- ções; – adicione à lista de instruções prontas para execução aquelas que estavam dependendo da instrução que foi escolhida nesta iteração utilizando o grafo de dependências. 6.5.3.2. Escalonamento Horizontal O escalonamento horizontal necessita de alguma forma de execução pa- ralela de instruções, portanto, é comumente usado em arquitetura VLIW (very large instruction word) [Lee et al. 2003]. A idéia inicial da arquitetura VLIW sur- giu nos estudos de computação paralela feitas por Alan Turing, em 1946, e no trabalho de microprogramação de Maurice Wilkes, em 1951 [Wilkes 1986]. Uma CPU microprogramada está relacionada a macroinstruções, as quais representam as instruções do programa em si. Cada macroinstrução é, por sua vez, composta por uma seqüência de microinstruções, cada qual associada di- retamente a alguma unidade funcional do processador (por exemplo, a ALU). Esta organização é denominada microprogramação horizontal [Dasgupta 1977] e é a base das arquiteturas VLIW. Ela se contrapõe à microprogramação ver- tical, onde os campos das instruções devem ser decodificados para produzir os respectivos sinais de controle. Assim, a microprogramação horizontal per- mite que todas as possíveis combinações de sinais (e, portanto, operações) 29
  • 30. E. Moreno e R. Barreto sejam expressas diretamente como instruções, evitando-se que a lógica de si- nais seja concentrada em apenas uma única unidade de decodificação. Desta forma, uma conseqüência natural da microprogramação horizontal é a neces- sidade de uma palavra maior para cada instrução. A filosofia VLIW propõe a utilização de técnicas de escalonamento estático efetuadas exclusivamente pelo compilador, onde múltiplas operações indepen- dentes são compactadas em apenas uma palavra longa, conseguindo-se o despacho simultâneo de mais de uma instrução [Phillips White Papers 2003]. Por exemplo, considerando um barramento de macroinstruções de 128 bits, este pode encaixar quatro microinstruções de 32 bits, e com quatro unidades de processamento (uma para cada microinstrução) cada uma dessas microins- truções escalonadas na palavra de 128 bits podem ser executadas simultane- amente. A idéia do escalonamento horizontal é reescalonar as microinstruções de uma macroinstrução para minimizar atividades de chaveamento de barramento de instrução. O objetivo é encontrar um escalonamento de instrução tal que a distância de Hamming total de n instruções VLIW consecutivas seja minimi- zada e, adicionalmente, cada macroinstrução seja uma permutação de suas microinstruções. O escalonamento horizontal move as microinstruções horizontalmente den- tro de uma única macroinstrução. 6.5.3.3. Escalonamento Vertical No escalonamento vertical a execução das instruções são trocadas entre si (antes ou depois) levando em consideração que o resultado deve ser sem- pre o mesmo e, ao mesmo tempo, tentando não degradar o desempenho da execução [Allen and Kennedy 2001] . Este escalonamento tem complexidade NP-difícil. Na Figura 6.16 tem-se códigos que podem ser escritos de diferentes for- mas sem alterar o seu significado. Entretanto, este rearranjo deve ser feito em código assembly, de tal forma que o compilador possa efetuar as otimizações necessárias para que seja escolhido o melhor arranjo dos bits, com o intuito de minimizar a distância de Hamming [Ponce 2006]. No escalonamento vertical as microinstruções se movem entre diversas instruções. Usualmente este escalonamento ocorre somente dentro de um bloco básico, que tem um grafo de dependência de dados e uma quantidade de ciclos total. Obviamente que a nova escala tem que obedecer o grafo de dependência original e que o novo tempo de ciclo seja menor ou igual que o tempo de ciclo original. 6.5.4. Transformações de Laços As transformações de laços têm um papel importante na melhoria do de- sempenho da cache e no uso efetivo da capacidade de processamento para- 30
  • 31. Técnicas para Diminuir o Consumo de Energia Figura 6.16. Exemplo de escalonamento vertical. lelo. Estudos comprovam que a maior parte do tempo de um programa cien- tífico é gasto em laços [Aho et al. 2006]. Conseqüentemente, a maioria das análises e otimizações dos compiladores foram desenvolvidas para fazer com que a execução de laços sejam mais rápidas. Existem algumas otimizações sugeridas em [Kandemir et al. 2000] para im- plementar transformação de laços. Isto pode causar uma melhoria na taxa de acerto da cache, resultando em diminuição do consumo de potência. O prin- cípio da localidade é reforçado, no sentido de forçar o uso de variáveis locais e, portanto, reutilização de registradores. As transformações de laços linear básicas são: • extensão de laços (loop unrolling). • fusão de laços (loop fusion). • separação de laços (loop tiling). 6.5.4.1. Extensão de Laços (Loop Unrolling) Esta técnica tenta salvar tempo por meio da redução do número de instru- ções adicionais que são executadas em laços, reduz as instruções de desvio e incrementa a taxa de acerto da cache [Davidson and Jinturkar 1995]. Além disso, esta também ajuda na escala de execução de arquiteturas paralelas. In- felizmente, o uso de registradores em cada interação é incrementado, o que pode ser uma desvantagem em aplicações embarcadas, que usualmente pos- suem severas restrições de memória e registradores. A Figura 6.17 apresenta um código original e o respectivo código após a extensão do laço. Nesse exemplo, o código da Figura 6.17(b) terá somente 20 interações. O algoritmo fará 5 vezes menos instruções de desvio, e ainda fazer o mesmo trabalho. Com a disponibilidade do paralelismo, cada uma das linhas poderia ser atribuída a cinco diferentes processadores e o escalonamento ho- rizontal poderá ser aplicado de acordo com o dado a ser usado. 31
  • 32. E. Moreno e R. Barreto Figura 6.17. Extensão de Laços. 6.5.4.2. Fusão de Laço (Loop Fusion) Esta técnica junta dois laços em um único laço com a garantia de que a mesma tarefa (mesma semântica) é executada [Qian et al. 2002]. Na fusão de laços da Figura 6.18, instruções adicionais foram evitadas uma vez que o laço ocorreu uma única vez mas ainda assim gerou ambos arranjos a e b. A fusão de laços usualmente melhora o reúso de dados e, portanto, reduz a potência consumida. Figura 6.18. Fusão de Laços. 6.5.4.3. Divisão de Laço (Loop Tiling) Arranjos que não se encaixam na cache são divididos em peças menores de tal forma que cada uma possa se ajustar na cache [Song and Li 1999]. Um dos objetivos da redução de potência é evitar a situação de falta do dado na cache, além de tentar fazer um melhor reúso de dados. Por outro lado, quando um código é dividido, dois ou mais laços são necessários para percorrer o mesmo código original. Portanto, deve ser tomado cuidado para determinar se o resultado será de diminuição ou aumento de potência. 32
  • 33. Técnicas para Diminuir o Consumo de Energia 6.5.5. Considerações Finais Esta seção mostrou as principais técnicas de otimização do compilador considerando o critério de economia de energia. Algumas otimizações com esse fim também otimizam o desempenho, mas não todas. O objetivo maior dessa otimização é reduzir a distância de Hamming entre dois códigos suces- sivos. 6.6. Nível de Comunicação Os sistemas móveis são operados a bateria e, usualmente, fazem parte de uma grande rede onde a comunicação ocorre sem fio com outros sistemas. As técnicas convencionais de projeto com baixo consumo de energia com foco no circuito e na computação são inadequadas para este tipo de sistema em rede. Apesar de ser usada em parcelas menores de tempo, a comunicação consome alta potência de pico, o qual é muito maior que o custo de potência associado com computações. A interface de rede sem fio de um computador móvel consome uma fração substancial da energia total. Medidas mostram que em aplicações típicas, tipo navegador web ou email, a energia consumida quando a interface está ligada e ociosa é mais do que o custo de receber pacotes. Além do mais, o chave- amento entre estados (desligado, ocioso, recebendo e transmitindo) consome tempo e energia. A arquitetura de uma rede de computadores é formada por camadas (ou ní- veis), interfaces e protocolos [Tanenbaum 2003]. As camadas são processos, implementados por hardware ou software, que se comunicam com o processo correspondente na outra máquina. Cada camada oferece um conjunto de ser- viços ao nível superior, usando funções realizadas no próprio nível e serviços disponíveis nos níveis inferiores. Nesta arquitetura, os dados transferidos em uma comunicação de um nível específico não são enviados diretamente ao processo do mesmo nível na outra máquina, mas são repassados para a ca- mada inferior da máquina transmissora até o nível mais baixo (inicial), onde é transmitido, para depois subir através de cada camada adjacente da máquina receptora. Os protocolos são conjuntos de regras e formatos que permitem a comunicação entre as camadas nas diferentes máquinas. Em cada camada podem ser definidos um ou mais protocolos. Já as interfaces representam a fronteira entre cada nível adjacente onde uma camada consegue compreender as informações vindas de outra camada. Inicialmente, nesta seção, será visto como reduzir o consumo de energia nas camadas física, enlace, rede e camada de transporte. Depois será apre- sentado algumas formas específicas para redução do consumo de energia de- vido à comunicação, a saber: (a) decomposição do sistema; (b) tratamento dos erros de transmissão; (c) modo dormindo; (d) modificação no protocolo de acesso ao meio. 33
  • 34. E. Moreno e R. Barreto 6.6.1. Camada Física Na camada física, sinalização low-swing está sendo investigada para redu- zir a energia da comunicação em interconexões [Zhang et al. 2000]. No caso de um simples CMOS driver, a sinalização low-swing é alcançada baixando a voltagem fornecida (Vdd ) do driver. Infelizmente, redução de swing no transmis- sor complica o projeto do receptor. Sensibilidade incrementada e imunidade à ruídos são necessários para garantir recepção de dados confiáveis. Recepto- res diferenciais têm sensibilidade e robustês superiores, mas requerem o do- bro da largura de banda do barramento. Para reduzir os overheads, esquemas pseudo-diferenciais foram propostos, onde um sinal de referência é comparti- lhado entre muitas linhas de barramentos e receptores, e o dado de entrada é comparado com a referência em cada receptor. Outra questão chave da camada física é a sincronização. A comunicação tradicional tem sido baseada na suposição síncrona, que implica na presença de um sinal de sincronização global, isto é relógios, que definem instantes de amostragem dos dados. Infelizmente, relógios são extremamente ineficientes energeticamente, e são responsáveis por uma significante fração da potência. Assim, sincronização global não é uma escolha ótima do ponto de vista ener- gético. 6.6.2. Camada de Enlace Na camada de enlace, uma característica chave é atingir o nível de confia- bilidade da comunicação com o gasto mínimo de energia. Considere duas técnicas de melhoria da confiabilidade: (i) código de cor- reção de erros; e (ii) código de detecção de erros com retransmissão. Ambas abordagens são baseadas na transmissão de informação redundante, mas cor- reção de erro demanda mais do que a detecção de erros em termos de redun- dância e complexidade de decodificação. Conseqüentemente, pode-se esperar que a transmissão com correção de erros venha a consumir mais potência do que no caso da transmissão sem erros. Entretanto, quando ocorre um erro, os esquemas de detecção de erros requerem retransmissões do dado corrompido. Dependendo da arquitetura da rede, retransmissões podem ser muito custosas em termos da energia (e desempenho). Claramente, escolha entre o custo da correção de erros e a penalidade de energia das retransmissões devem ser cui- dadosamente exploradas quando projetando redes eficientes energeticamente. O artigo [Bertolozzi et al. 2002] investiga como lidar com erros de barra- mentos on-chip (por exemplo, ruídos, radiação e atrasos) de modo eficiente do ponto de vista de consumo de energia e usando o código de Hamming. Código de Hamming é um código de detecção que permite não apenas detectar erro de um bit, mas também a localização do bit errado através da inserção de alguns bits de paridade. Se a palavra for de 8 bits, o código de Hamming acrescenta 4 bits adicionais, formando o código de Hamming de 12 bits. Mais informa- ções sobre o código de Hamming pode ser encontrada em [Tanenbaum 2003]. Usando a correção de erros de Hamming implica em um decodificador um 34
  • 35. Técnicas para Diminuir o Consumo de Energia pouco mais complexo, mas com uma penalidade temporal pequena. Se, por outro lado, o código de Hamming for usado para detecção de erros a retrans- missão tem que ser disparada no barramento caso uma transferência errônea seja detectada. Este método conta com decodificadores simples e uma boa capacidade de detecção, mas gera um grande número de transições no bar- ramento e, conseqüentemente, degrada o desempenho por causa do atraso associado. Em [Bertolozzi et al. 2002] mostrado que, com a condição de que a penalidade de atraso temporal possa ser tolerada, as estratégias de retrans- missão são mais efetivas do que as que tratam de correção de erros do ponto de vista de consumo de energia, principalmente por causa da grande capaci- dade de detecção e menor complexidade de decodificação. A análise foi feita usando diversas variantes do código de Hamming em um modelo VHDL de um processador baseado no Sparc V8, e explorando as características de um barramento AMBA. A análise considerou um nível pré-definido de tolerância a ruídos em uma dissipação mínima de potência. Os resultados consideraram um barramento sem qualquer codificação e, também, com o tradicional código de um bit de paridade. No caso de links de redes de meio compartilhado (tais como barramentos), a função de controle de acesso ao meio da camada de enlace é também crí- tica para a eficiência energética. Atualmente, esquemas de multiplexação por divisão do tempo centralizado (centralized time-division multiplexing schemes) são muito adotados. Nestes esquemas, um simples circuito árbitro decide que transmissor acessa o barramento em cada slot de tempo. Infelizmente, a pobre escalabilidade da arbitragem centralizada indica que esta abordagem é prova- velmente ineficiente energeticamente com o crescimento da rede. Esquemas de arbitragem distribuída assim como abordagens alternativas de multiplexação, tais como multiplexação por divisão do código (code division multiplexing) tem sido extensivamente estudados, mas muito trabalho ainda precisa ser feito. 6.6.3. Camada de Rede A arquitetura da rede influencia fortemente a energia da comunicação. Sabe- se que os barramentos são a escolha mais comum, embora seja intuitivamente claro que barramentos não são eficientes do ponto de vista energético quando a rede cresce. Na comunicação baseada em barramentos, o dado é sempre difundido (broadcasted) de um transmissor para todos os possíveis receptores, enquanto que as mensagens são destinadas a somente um receptor (ou um pequeno grupo de receptores). Contenção do barramento, com o overhead da arbitração, contribui para o aumento do consumo de energia. Estudos preliminares indicam que arquiteturas hierárquicas e heterogêneas são muito mais eficientes energeticamente que barramentos. Em seu trabalho, [Zhang et al. 1999] desenvolveram uma rede em malha generalizada e hierár- quica (hierarchical generalized mesh) onde nodos com alto requisito de largura de banda são agrupados e conectados por meio de uma malha generalizada 35
  • 36. E. Moreno e R. Barreto programável consistindo de diversos canais de comunicação juntos com swit- ches programáveis. Os agrupamentos (clusters) são então conectados por meio de uma malha generalizada de canais de comunicação mais longos e globais. Tal arquitetura é heterogênea porque o custo de energia da comunica- ção intra-cluster é muito menor que a comunicação inter-cluster. 6.6.4. Camada de Transporte Acima da camada de rede, a abstração da comunicação é uma conexão fim-a-fim. A camada de transporte está interessada em otimizar o uso de re- cursos de redes e prover a qualidade de serviço requerida. A energia pode ser vista como um recurso de rede ou um componente na métrica da qualidade de serviço. Um exemplo de questão de projeto da camada de transporte é a escolha entre protocolo com e sem conexão. A eficiência energética pode ser grandemente impactada por esta decisão. De fato, protocolos com conexão po- dem ser energeticamente ineficientes sob condições de tráfego intenso porque eles tendem a incrementar o número de re-transmissões. Por outro lado, en- trega de dados fora de ordem (que pode ser o caso do protocolo sem conexão) implica em trabalho adicional no receptor, que por sua vez, causa um adicional no consumo de energia. Outra tarefa da camada de transporte com grandes implicações de energia é o controle de fluxo. Quando muitos transmissores competem por recursos limitados, a rede torna-se congestionada, e o custo por bit transmitido incre- menta por causa do incremento na contenção e overhead da resolução da con- tenção. Controle de fluxo pode reduzir o efeito do congestionamento pela regu- lação da quantidade de dados que entram na rede sob o preço de alguma pe- nalidade de processamento (throughput). A redução de energia via o controle de fluxo tem sido estudado para redes sem fio [Walrand and Varaiya 2000]. 6.6.5. Decomposição do Sistema Usualmente, a pilha de protocolo de redes locais executam no processa- dor principal. Conseqüentemente, a interface de redes e o processador devem estar sempre ligados para que a rede local esteja ativa. Como quase todos os dados são transportados por meio do processador, desempenho e consumo de energia pode ser um problema. A decomposição da pilha de protocolo da rede e o fluxo de dados do sistema podem reduzir o consumo de energia. Primeiro, porque quando o sistema é construído a partir de componentes independen- tes que implementam diferentes camadas da pilha de comunicação, cópias de dados desnecessários são eliminados. Segundo, porque um hardware dedi- cado pode fazer o processamento de sinais básicos e podem mover os dados diretamente para o destino, mantendo cópias dos dados longe do barramento. Finalmente, um processador específico para a comunicação pode ser usado para tratar a maioria dos aspectos de baixo nível da pilha de protocolo, sem so- brecarregar o processador principal, ao mesmo tempo em que possibilita que o mesmo possa dormir por maior período de tempo sem afetar o desempenho e/ou funcionalidades. 36
  • 37. Técnicas para Diminuir o Consumo de Energia 6.6.6. Taxas de Erros Redes sem fio têm uma taxa de erros muito maior do que redes com fio. Na presença de altas taxas de erros de pacotes, alguns protocolos de redes (tais como o TCP) pode reagir exageradamente confundindo com congestiona- mento. Isto leva a retornar a uma taxa de transferência muito baixa, o que incre- menta o consumo de energia porque leva a um tempo de transferência muito maior. Qualquer protocolo que deixa um receptor móvel ocioso desnecessari- amente desperdiça energia. As limitações do TCP podem ser superadas por um controle de congestionamento mais adequado durante erros de pacotes. A colocação de dados em buffers das estações base podem ser usadas para executar somente retransmissões locais que são causadas por erros na rede sem fio. 6.6.7. Modo Dormindo Os protocolos de rede podem ser modificados para suportar conectividade total enquanto estão em modo desligado (power down). O esquema store-and- forward para redes sem fio, tal como o IEEE 802.11, propôs o modo dormindo, que não somente possibilita que a interface de rede entre no modo dormindo mas também possa executar retransmissões locais não envolvendo camadas de protocolo de rede superiores. Entretanto, tais esquemas têm a desvantagem de requerer uma estação base para atuar como uma interface de armazena- mento temporário em buffers. 6.6.8. Protocolo de Acesso ao Meio Usualmente, as redes sem fio atuais não atentam para o consumo de ener- gia, mas principalmente focam na maximização do throughput. Em um sistema sem fio, o protocolo de acesso ao meio (MAC) pode ser adaptado e sintoni- zado (tuned) para melhorar a eficiência energética. O objetivo básico é que o protocolo consiga minimizar as ações da interface de redes, ou seja, minimizar o tempo de transmissão assim como da recepção. Um exemplo de protocolo MAC com eficiência energética é o LPMAC (Low- Power Medium Access Protocol) [Mangione-Smith 1996], que usa um esquema ponto-a-ponto para reduzir o consumo de energia dentro de uma rede. Uma vantagem desse esquema é o incremento efetivo da largura de banda disponí- vel na rede. Todo o controle do tráfego é estruturado a partir da definição de super- quadros, como mostrado na Figura 6.19, onde cada quadro tem uma certa quantidade de células de dados e células de controle de tráfego. Um terminal da rede local deve ser designado como o coordenador da rede (também conhe- cido como estação-base), e este terminal é responsável por adaptar e manter essa estrutura de super-quadros. Cada super-quadro inicia com uma escala de tráfego, que indica os terminais que tem tráfego. Tal escala é gerenciada pelo coordenador da rede. Os terminais que tenham sido escalonados para tráfegar são indicados em uma lista ordenada. Obviamente que os outros computadores que não estive- 37
  • 38. E. Moreno e R. Barreto rem nessa lista, portanto sem tráfego, podem rapidamente desligar os recepto- res e transmissores e, com isso, reduzir potência. Usando o escalonamento explícito de todas as transferências de dados, o LPMAC possibilita que um terminal “cochile” (e desligue o receptor) dentro de um quadro durante uma comunicação ativa, assim como, reativar o transmissor ou receptor somente no tempo da escala. Um pequeno período de tempo dentro de cada super-quadro é reservado para tráfego baseado em contenção, por exemplo, usando esquemas baseados em CSMA/CD. Este período permite que novos terminais, que não estavam participando de qualquer comunicação, enviem uma mensagem de requisição ao coordenador da rede. Como nesse período não ocorre tráfego de dados, a mensagem pode ser pequena e, conseqüentemente, largura de banda pode ser conservada. Algo que precisa ser considerado nesses esquemas é que o chaveamento entre estados (desligado, ocioso, recebendo, transmitindo) consome tempo e energia. Portanto, o número de transições de estados têm que ser minimizado. Escala do Comunicações ponto-a-ponto Período de Tráfego Contenção Figura 6.19. Estrutura do super-quadro LPMAC. 6.7. Nível de Aplicação Os sistemas computacionais possuem diversas camadas de software que executam sobre o hardware. O software não consome energia por si só, mas é a execução e armazenamento do software que requerem consumo de ener- gia do hardware. Neste caso, a execução do software envolve dissipação de potência na computação, armazenagem e comunicação. Entretanto, a energia gasta para armazenar programas é usualmente baixa (com a escolha de com- ponentes apropriados) e previsível em tempo de projeto. Contudo, a redução do tamanho do programa armazenado é benéfico. Como já apresentado, isto pode ser alcançado pelo compilador e compressão de código. No último caso, o código é comprimido antes de ser armazenado. Em tempo de execução, o código é descomprimido o mais rápido possível [Benini and De Micheli 2002]. Os sistemas embarcados são dedicados a uma aplicação específica. Neste caso, o objetivo é prover a qualidade do serviço requisitado dentro das restri- ções. Se for considerado, por exemplo, um terminal de video móvel e sem fio, a qualidade de serviço estará relacionada com a qualidade do vídeo, que implica em níveis de desempenho específicos tanto de computação quanto de arma- zenamento e comunicação. As restrições podem estar na relação sinal/ruído 38
  • 39. Técnicas para Diminuir o Consumo de Energia do sinal de radio-freqüência e da energia disponível na bateria. Conseqüen- temente, a maior tarefa do software será prover alto desempenho por meio da orquestração do processamento de informações ao mesmo tempo em que provê o melhor fluxo de informação. Além do mais, esta tarefa deve ser feita mantendo um consumo mínimo de energia. Esta seção descreverá formas para diminuir o consumo de energia a partir das aplicações. É importante que no nível de aplicação o sistema seja mo- delado e seja aplicada alguma técnica de análise, seja analítica ou simulada. Interfaces de programação de aplicações (ou APIs) também são usadas para que as aplicações gerenciem o consumo de energia de componentes de hard- ware e software, onde decisões podem ser tomadas, por exemplo, para permitir que aplicações desliguem certos componentes quando os mesmos não estão mais sendo usados. Uma das estratégias para atingir esse objetivo é o gerenciamento dinâmico de potência dos componentes (do inglês dynamic power management - DPM). O gerenciamento dinâmico de potência (DPM) é uma característica do ambi- ente de tempo de execução que dinamicamente reconfigura o ambiente para prover o serviço requisitado e desempenho com o número mínimo de compo- nentes ativos ou um nível mínimo de atividades nesses componentes. DPM engloba um conjunto de técnicas que provê a computação com eficiência de energia, desligando (ou reduzindo o desempenho) de componentes do sistema quando estão ociosos (ou parcialmente inexplorados). DPM também é rea- lizado por meio da diminuição da freqüência do processador (algumas vezes até parando o relógio) e/ou reduzindo a voltagem [Benini and De Micheli 2002]. A premissa para aplicabilidade do DPM é que o sistema (e seus compo- nentes) possuam cargas de trabalho não-uniformes. Uma segunda suposição é que seja possível prever, com certo grau de precisão, a flutuação da carga de trabalho. É necessário, entretanto, que a observação de carga e previsão não consuma energia significante. O projeto de um sistema com gerenciamento de potência engloba diversas tarefas, incluindo a seleção dos componentes a serem gerenciados, determinação da política de gerenciamento, e implementa- ção dessa política em um nível apropriado do software. A forma mais simples de implementação de uma política é como um filter driver, ou seja, um pro- grama anexo ao driver de um componente específico. Nesse caso, o driver monitora o tráfego de/para o componente e tem acesso ao estado do compo- nente. Contudo, o driver tem uma visão limitada de outros componentes e, conseqüentemente, tal implementação pode sofrer de localidade excessiva. Outra alternativa seria se a política de gerenciamento fosse implementada em kernels e estivesse altamente acoplada ao gerenciamento de processos. De fato, o gerente de processos tem conhecimento das tarefas que estão em execução e as tarefas que virão para serem executadas. Gerentes de pro- cessos também sabem que componentes (dispositivos) são necessários para cada tarefa. Assim, a implementação da política desfrutaria tanto da visão glo- bal quanto de uma perspectiva da operação do sistema em um futuro próximo. 39
  • 40. E. Moreno e R. Barreto Deste modo, é possível “acordar” componentes de forma preditiva pelo conhe- cimento das tarefas a chegar e dos componentes necessários. O software pode ser projetado para melhorar a efetividade do gerencia- mento de potência. Gerenciamento de potência explora tempos ociosos de componentes. Nesse caso, o escalonador pode sequencializar tarefas para execução com o objeitvo adicional de agrupar operações sobre componentes, de tal forma a atingir períodos mais longos de ociosidade. Algo que é muito importante enfatizar é que o projeto de sistema requer a coordenação de vários componentes de hardware e software. Dessa forma, a avaliação dos programas não podem ser feitos de forma isolada. Técnicas para traçar o perfil (profile) podem e devem ser usadas para determinar a distribui- ção de freqüência dos valores da entrada para os programas e sub-programas. Tais informações são de grande importância para se obter software de aplica- ção que seja eficiente no consumo de energia dentro do ambiente específico onde será executado. É também importante notar que, dado um perfil de um ambiente especifico, o software pode ser re-estruturado tal que consumo baixo de energia pode ser atingido ao preço de latência um pouco mais alta. Síntese de software é um termo usado com diferentes conotações. Neste contexto, síntese de software é um procedimento automático que gera código fonte que possa ser compilado. Síntese de software é freqüentemente neces- sário porque o consumo de energia de programas depende do estilo e cons- truções usadas. É importante lembrar que os programas são escritos com somente funcionalidade e/ou desempenho em mente, e raramente considera consumo de energia. Além do mais, em aplicações embarcadas é uma prá- tica comum usar código legado, o que pode levar a uma grande penalidade do ponto de vista de consumo de energia [Benini and De Micheli 2002]. A busca por software com baixo custo energético leva a uma sintonia fina (tuning) de programas de aplicação. A proposta é que os próprios programas de aplicação controlem os níveis de serviço e custo energético dos compo- nentes de hardware. O problema com este método é que ele compromete a portabilidade da aplicação e força o programador desta a adquirir informação detalhada sobre o hardware que está se utilizando. Outra alternativa foi proposta por [Benini and De Micheli 2002]. Os progra- mas de aplicação contém chamadas ao sistema (system calls) que solicitam o software para controlar um componente de hardware, por exemplo, ligando ou desligando, ou requerendo uma voltagem ou freqüência específica. O pedido pode ser aceito ou recusado pelo sistema operacional, que tem acesso a in- formação da escala das tarefas e dos níveis operacionais dos componentes. A vantagem dessa abordagem é que o gerenciamento de potência é melhorado no sentido de que o pedido de serviço é mais detalhado pelas aplicações e, assim, em uma posição de tomar melhores decisões. É usual que políticas para gerenciamento do consumo de energia anali- zem dinamicamente o comportamento do sistema para determinar quando um componente de hardware deve modificar seu modo de operação. Contudo, a 40