Tecnologia Hiper-Thread
Por Ricardo Zelenovsky e Alexandre Mendonça
Introdução
Os leitores desta página devem ter notado que há muito tempo não abordamos temas de processadores. Já era hora de voltarmos a esse assunto pois, é claro, eles seguem evoluindo e muita coisa nova surgiu. A batalha pelo mercado de computadores pessoais de alto desempenho continua acirrada, porém com poucos competidores. No passado, ela era mais interessante, pois tínhamos uma grande quantidade de participantes. Hoje em dia, sentimos a ausência da Cyrix e da NextGen, além de diversas outras fábricas. Novos competidores estão aparecendo, como a nVidia, mas, mesmo assim, a disputa fica mesmo entre Intel e AMD.
Essa disputa está cada vez mais sofisticada e agora, mais do que nunca, os gigahertz do processador não são parâmetros absolutos para compararmos a velocidade de um computador. Devemos olhar o tamanho do "pipeline", a velocidade do barramento frontal (FSB), a tecnologia da memória principal, o tamanho das memórias cache L1 e L2 e a disponibilidade de unidades de processamento para trabalharem em paralelo. Há pouco tempo, a AMD começou a enfrentar a concorrência com o Pentium 4, que possui um "pipeline" de 20 estágios, o que premia a velocidade do relógio em gigahertz, sem, no entanto, oferecer o desempenho correspondente, pois um "pipeline" tão grande fica muito vulnerável aos desvios do programa. Para comparar, lembramos que o "pipeline" do Penitum III tem 10 estágios e o Athlon usa um de 11 estágios. Para fazer frente a isso, a AMD passou a rotular seus processadores Athlon XP não com a freqüência do relógio, mas com uma freqüência equivalente. Isto é justo, pois apesar o relógio inferior, os processadores AMD oferecem desempenho equivalente a um de relógio mais rápido.
No artigo deste mês, vamos abordar a tecnologia que a Intel está oferecendo com grande alarde e que, segundo ela, deve oferecer um ganho de desempenho em torno de 25% para processadores semelhantes. É a tecnologia "hiper-thread" abreviada pela sigla HT e que deve permitir espremer o máximo de desempenho do Penitum 4. Antes, entretanto vamos dar uma rápida olhada no problema do "pipeline".
Qual o Problema de um Pipeline Grande ?
O "pipeline" é como uma linha de montagem de uma fábrica e um bom exemplo é o da uma indústria automobilística. Ao visitarmos uma fábrica de automóveis, vemos uma grande quantidade de oficinas, cada uma executando uma tarefa específica. Cada oficina monta uma pequena porção do carro e, em toda a fábrica, existem vários carros sendo montados simultaneamente. Para tornar claro o conceito, vamos a um exemplo hipotético. Digamos que o tempo para se montar um carro seja igual a 5 horas. Se, para montarmos esse carro, usarmos uma linha de montagem com 10 estágios, cada estágio deverá gastar 0,5 horas. Assim, apesar de serem necessárias 5 horas para montar um carro, vemos, na saída da fábrica, um carro montado a cada meia hora. Um truque para se conseguir uma maior produção é aumentar o tamanho da linha de montagem, digamos para 20 estágios. Agora vemos um carro pronto a cada 15 minutos.
Um truque semelhante a esse usou a Intel para ter bastante folga para aumentar o relógio do Pentium 4 e assim ganhar a batalha dos gigahertz. Como o "pipeline" desse processador é muito grande (20 estágios), ele é capaz de oferecer uma maior taxa de instruções. Vemos na saída uma grande quantidade de instruções executadas por segundo. Entretanto, o truque não é assim tão simples, pois existem alguns problemas. Todo "pipeline", para ser eficiente, precisa de estar "cheio", ou seja, precisa de estar em ritmo. Uma das piores coisas para um "pipeline" de processamento é descobrir que tudo aquilo que foi antecipado precisa de ser descartado. Isso ocorre, por exemplo, com uma instrução de desvio. Voltemos à analogia com a montadora de carros. Ela só entra em ritmo após 5 horas, que é quando sai o primeiro carro montado. A partir daí, é necessário manter a linha de produção cheia. Assim acontece com o processador, se precisar perder o conteúdo do seu "pipeline", será necessário um tempo muito grande para entrar em ritmo novamente. Por isso os processadores modernos, especialmente os que têm um "pipeline" longo, possuem unidades para predição de desvios, para evitar as surpresas e os esvaziamentos do "pipeline". Essa preocupação é bastante razoável, pois as instruções de desvios são freqüentes. Dizem as estatísticas que, em média, os programas usam um desvio a cada seis instruções.
Esse tem sido um desafio para o Pentium 4, pois, apesar dos gigahertz oferecidos, seu "pipeline" extremamente longo tem dificultado seu desempenho. Com isso, a concorrência do Athlon tem-se mantido feroz. Espera-se agora, com a abordagem "hiper-thread", uma melhora.
O Que um Thread ?
Antes de estudarmos o "hiper-thread", é claro, devemos entender o que é um "thread". Para isso precisamos explicar o que é um sistema operacional (SO) multitarefa. Como o próprio nome diz, é um sistema operacional capaz de executar diversos programas (ou processos) simultaneamente, sendo que os exemplos mais comuns são o Windows e o Linux. É claro que essa simultaneidade é falsa, pois existe um único processador. Então, o que acontece é que esse processador é compartilhado entre as diversas tarefas que estão em execução. Como esse compartilhamento é muito rápido, a sensação que se tem é que todas as tarefas estão sendo executadas ao mesmo tempo. É o compartilhamento temporal do processador, ou time-slice.
Em tal sistema multitarefa, cada processo possui uma fatia de tempo. A criação de um processo envolve a geração de um espaço de endereçamento e de uma imagem do aplicativo na memória, envolvendo seção de códigos, dados e pilha. Os "threads" são tarefas que rodam independentemente uma das outras, mas dentro do contexto de um processo. Um "thread" compartilha seção de códigos e dados com o processo pai, mas cada uma tem sua própria pilha e contexto, onde está incluído o contador de programa. Assim, um "thread" requer menos recursos do sistema que um processo e, além disso, a comunicação entre eles é bem simples e rápido.
O que é a Tecnologia "Multi-Thread" ?
Os leitores já devem ter visto anúncios de computadores com dois processadores. Muitos já se perguntaram se tal computador seria um sistema paralelo. Na verdade não, pois os processadores não trabalham no mesmo programa, mas sim em tarefas diferentes. Um processamento paralelo requer a criação de processos e um de um mecanismo para comunicação entre eles de tal forma que o trabalho de processamento possa ser sincronizado. Nos computadores com dois processadores, o sistema operacional passa a ter duas CPUs para despachar suas tarefas. Assim, enquanto um processador está descompactando uma seqüência JPEG, o outro pode estar recebendo dados pela rede, ou processando um arquivo de som. Entretanto, se num dado momento for necessário somente um grande processamento matemático, uma delas trabalhará enquanto a outra ficará ociosa. Em suma, com um sistema com dois processadores é possível, na maioria das vezes, rodar dois programas simultaneamente.
A tecnologia HT permite que um processador atue como se fossem dois processadores físicos e assim engane os sistemas operacionais e outros programas, levando-os a crer que existam fisicamente dois processadores trabalhando. Por exemplo, ao apresentar imagens e sons em um sistema comum, é necessário compartilhar a CPU entre a descompactação das imagens e o processamento dos sons. Agora, com o "hiper-thread" o sistema operacional pensa que existem dois processadores e despacha a descompactação para um e o processamento de som para a outra e o usuário tem seu sistema respondendo com agilidade. Como se verá adiante, isso é muito mais rápido que ficar compartilhando a CPU entre processos distintos. O que se espera é que o usuário possa disparar um programa relativamente pesado para rodar em "background" e ainda rodar em "foreground" outro processo pesado, sem que o sistema fique lento.
A tecnologia HT fornece um segundo processador lógico em um único encapsulamento, de forma que passam a existir duas arquiteturas lógicas compartilhando um mesmo conjunto de unidades de execução (unidades de ponto flutuante, unidades de inteiros, unidades de endereçamento, etc). Do ponto de vista de software, significa que o sistema operacional e os programas de usuários podem despachar trabalhos da mesma forma que faziam em um sistema com múltiplos processadores.
A técnica HT está baseada no paralelismo a nível de "thread", o qual envolve o chaveamento da utilização dos recursos do processador para um outra "thread" quando o atual enfrentar uma operação de grande latência. Assim, ao permitir que o segundo "thread" entre em execução enquanto a operação de grande latência do primeiro termina, reduz-se a probabilidade do longo "pipeline" esvaziar. Como os dois "threads" compartilham os mesmos recursos, a tecnologia HT pode usar recursos que de outra forma estariam ociosos se somente um "thread" estivesse em execução. O resultado é uma maior utilização dos recursos de execução do processador.
Devemos lembrar que o Pentium 4 é capaz de executar até 3 instruções por ciclo. Por exemplo, enquanto uma "thread" usa o recurso de ponto-flutuante, outro pode realizar uma operação de adição com número inteiro e um carregamento, diminuindo a ociosidade do processador. Em outras palavras, o HT deve permitir espremer mais desempenho do Pentium 4. Entretanto, é preciso que fique claro que, embora o sistema operacional esteja despachando o dobro de "threads", eles ainda compartilham os recursos de execução existentes em um único processador. Isto significa que um sistema com dois processadores, cada um com seu próprio recurso de execução, é claro deverá oferecer um desempenho maior.
A figura 1 apresenta uma ilustração de três maneiras de se processarem "threads". No primeiro caso, denominado Processamento Seqüencial, a CPU executa um "thread" após o outro. No segundo caso, denominado Processamento Multitarefa, o SO compartilhou (no tempo) a CPU entre os dois "threads". Como, no caso desta ilustração, omitimos o ônus que se paga ao chavear o contexto de um "thread" para outro, o tempo de execução ficou igual ao anterior. Em ambos os casos, nota-se uma razoável ociosidade da CPU, ou seja, uma baixa utilização dos recursos de execução do processador, pois raramente aproximou-se dos 100% de ocupação da CPU. A maneira de melhor explorar-se essa ociosidade é através do processamento "hiper-thread" com o qual os recursos de execução podem ser compartilhadas entre dois "threads", aumentando assim a ocupação da CPU e, por isso, ao final há um ganho de tempo. Como existem dois "threads" em execução, sempre que houver recurso ocioso, ele será ocupado.
Figura 1. Três maneiras de se realizar o processamento de dois "threads".
Compiladores e SO
E como ficam nossos programas ? Será que serão necessários novos compiladores ? Não é essencial, pois os compiladores antigos continuarão funcionando e, mesmo com tais programas, será possível tirar partido da tecnologia HT se o SO assim o permitir. Como já dissemos, o SO pensa que existem dois processadores e despacha uma maior quantidade de "threads". O resultado é a menor ociosidade do processador. Entretanto, se os compiladores forem preparados para explorar essa nova tecnologia, é claro que os programas apresentarão um melhor desempenho. Por enquanto, só a versão XP do Windows está preparada para tirar partido do HT. Já com o Linux, existem algumas versões da Red Hat, SuSE, Red Flag e COSIX preparadas para se beneficiarem do HT.
Conclusão
Só experimentarão uma grande melhora os programas que fizerem um grande uso do processador, ou seja, os "computationally intensive programs". Como exemplo de tais programas, temos os processamentos científico, financeiro, de engenharia e o jogos. As aplicações que não fazem uso intenso do processador, como o editor de texto, planilha e correio-eletrônico não deverão sentir grandes diferenças. Vale lembrar que essas são as aplicações mais rotineiras do usuário mediano. É muito comum, enquanto se imprime um texto na impressora local, especialmente nas jatos de tinta, experimentar o computador mais lento. Isso acontece porque todo o processamento da impressão é feito no computador e ele é relativamente pesado. A tecnologia HT deve aliviar bastante esse problema. Finalmente, é bom ressaltar que, para obter-se um sistema HT, é necessário, além do processador, que o chipset, a BIOS e o SO também estejam preparados para tal ambiente.
__________________________________________
Ricardo Zelenovsky (zele@unb.br) e Alexandre Mendonça (alexmend@aquarius.ime.eb.br) são professores universitários e autores de 6 livros, dentre eles o clássico "PC: um Guia Prático de Hardware e Interfaceamento - 3a Edição".