:. HyperThreading no Pentium 4? Cuidado com os obstáculos :-)

 Por Carlos E. Morimoto
 http://www.guiadohardware.net
 10/09/2002


O Pentium 4 possui nada menos que 6 unidades de execução de inteiros e mais duas de ponto flutuante. Mas, boa parte destas unidades permanecem ociosas a cada ciclo de clock. O motivo é simples: as instruções contidas nos programas precisam ser executadas em uma ordem determinada. Para diminuir esta lacuna, os processadores modernos incorporam vários recursos, como a capacidade de executar instruções fora de ordem, o circuito de branch prediction que permite "adivinhar" o resultado de operações de tomada de decisão e assim por diante. Mesmo assim o desperdício ainda é grande.

Com o Pentium 4, a Intel introduziu mais um truque, o HyperThreading, também conhecido como tecnologia Jackson. A idéia é que os programas são divididos em blocos menores, os threads. Eles são abertos a todo tempo, para carregar uma simples página Web temos um para abrir uma imagem em jpg, outro para exibir uma animação em flash, outro para exibir o texto com a fonte correta e assim por diante. No Linux a forma preferencial é simplesmente abrir novos processos, já que o Kernel é capaz de cria-los e destruí-los muito rápido. De qualquer forma, o objetivo é o mesmo.

:. O que é um Thread?

Um thread é um pequeno programa que trabalha como um sub-sistema independente de um programa maior, executando alguma tarefa específica. Um programa dividido em vários threads pode rodar mais rápido que um programa monolítico, pois várias tarefas podem ser executadas simultaneamente. Os vários threads de um programa podem trocar dados entre sí e compartilhar os recursos do sistema.

Para o programador, existem vantagens e desvantagens em dividir um programa em vários threads. Por um lado isso facilita o desenvolvimento, pois é possível desenvolver o programa em módulos, testando-os isoladamente, ao invés de escrever um único bloco de código. Mas, por outro lado, com vários threads o trabalho torna-se mais complexo, devido à interação entre eles.

Existem diferenças na maneira como os sistemas operacionais executam processos e threads. Por exemplo, o Windows têm mais facilidade para gerenciar programas com apenas um processo e vários threads, do que com vários processos e poucos threads, pois Windows o tempo para criar um processo e alternar entre eles é muito grande. O Linux e outros sistemas baseados no Unix por sua vez é capaz de criar novos processos muito rápido, o que explica o fato de alguns aplicativos, como por exemplo o Apache, rodarem muito mais rápido no Linux do que no Windows, ao serem portados para ele. Porém, ao serem alterados, os mesmos programas podem apresentar um desempenho semelhante nos dois sistemas.

Tradicionalmente o processador executa um thread ou processo de cada vez, chaveando entre eles várias vezes por segundo para nos dar a impressão de que todos estão sendo executados ao mesmo tempo.

O HyperThreading utiliza o tempo ocioso do processador para executar instruções de um segundo thread. Ou seja, o processador passa a se comportar como se fosse um sistema dual, o que naturalmente significa mais instruções processadas por ciclo e mais desempenho.

Programas de escritório, navegadores, etc. utilizam quase que exclusivamente instruções de inteiros, enquanto jogos, aplicativos gráficos, etc. se concentram nas unidades de ponto flutuante. Mesmo que você esteja rodando o OpenOffice e o Maya, ambos não compartilharão os mesmos ciclos de processamento, fazendo com que hora o coprocessador, ora as unidades de inteiros fiquem ociosas. No HyperThreading, o sistema operacional terá a chance de aproveitar todos estes ciclos ociosos, dividindo as tarefas entre os dois processadores virtuais. Esta apresentação da Intel dá uma idéia de como isto funciona:

A teoria é bela, mas na prática esta solução não está livre de problemas. Em primeiro lugar, o sistema operacional não é capaz de saber quais unidades de execução estão livres ou ocupadas a cada instante. Ele simplesmente enxerga dois processadores e divide o trabalho entre eles, como se fosse realmente um sistema dual. Dentro do processador, o circuito responsável pelo HyperThreading é que examina as tarefas recebidas e tanta executa-las da melhor forma possível. Mas, novamente, não é possível prever o que está sendo executado a cada instante. O processador é muito complexo e as insformaçõesdemoram para serem transmitidas de um ponto a outro. Não é possível monitorar o que está sendo executado em cada estágio de pipeline, dentro de cada unidade de execução sem perda de performance.

Ou seja, a divisão é feita às cegas, com base numa tabela de probabilidades. Isto faz com que passem a ocorrer "conflitos", situações em que duas instruções diferentes são enviadas para a mesma unidade de execução, fazendo com que ambas sejam abortadas. Outro problema é que ao ativar o HyperThreading o sistema operacional passa a ter o trabalho adicional de analisar os threads ativos e dividí-los entre os dois processadores virtuais, da mesma forma que faria num sistema dual. Assim como em algumas tarefas um sistema dual pode ser mais lento que outro com um único processador, justamente por causa desta carga extra, o mesmo fenômeno ocorre no HyperThreading.

Olhando com atenção os diagramas do Pentium 4 Willamette (a primeira versão) divulgados pela Intel, dá para perceber facilmente uma área que aparentemente não tem função alguma. Estamos falando de cerca de 10% da área do processador, o que não é pouca coisa. Esta área corresponde justamente aos circuitos responsáveis pelo HyperThreading, desabilitado ainda em fábrica em todos os processadores Pentium 4 atuais. Ou seja, é uma arma "secreta" que a Intel reservou para utilizar no momento oportuno, quando a concorrência apertasse.

O primeiro processador a vir com o recurso ativado foi o Xeon Prestonia, lançado em Dezembro de 2002. Como o Prestonia nada mais é do que um Pentium 4 com mais cache e suporte a SMP com quatro processadores por placa (e graças a este último recurso também um soquete diferente), o HyperThreading foi uma forma de diferenciá-lo do Pentium 4 doméstico.

Agora, chegou a vez do Pentium 4. Tenho boas e más notícias.

A boa é que a Intel irá habilitar o HyperThreading em todos os Pentium 4 de 3.06 GHz em diante. A concorrência com a AMD não está fácil, então resolveram finalmente encarar a briga usando todas as armas.

Segundo a Intel o HyperThreading é capaz de melhorar o desempenho do processador em até 30%. Porém, isto é muito relativo. Em aplicativos não otimizados para multiprocessamento os pontos negativos do HyperThreading ou seja, as colisões e o overhead do multiprocessamento ganham destaque, fazendo com que o sistema fique mais lento do que ficaria com o recurso desabilitado.

Por outro lado, em ambientes multitarefa, com muitos aplicativos abertos simultâneamente ou aplicativos que abrem muitos threads, como bancos de dados e, particularmente servidores Web como o Apache, o ganho de desempenho supera o overhead e temos um ganho substancial de desempenho, algo de em média 5 a 10%, mas que, em algumas situações, pode chegar perto dos 30% anunciados pela Intel. Você pode ver alguns números, mostrando o desempenho do Xeon Prestonia com o HyperThreading habilitado no:

http://www.tomshardware.com/cpu/02q1/0203131/dual-10.html

É aqui que entram as más notícias: Além da questão dos aplicativos, você só se beneficiará do HyperThreading se souber driblar duas armadilhas.

A primeira é o chipset da placa mãe. Dos atuais apenas o i850E oferece suporte ao HyperThreading. Isto significa que com excessão dos poucos usuários proprietários de placas baseadas nele, todos os que estiverem interessados no HyperThreading terão que esperar pelos chipsets i845PE, i845GE and i845GV (versões revisadas dos chipsets i845E e i845G) e novas versões dos chipsets da Via e SiS. Será necessário também suporte por parte do BIOS. Ou seja, se você pretende atualizar seu PC atual, aproveitando a placa mãe, esqueça o HyperThreading.

A segunda limitação vem por parte do sistema operacional. O Windows 98/SE/ME, além do XP Home não suportam sistemas dual, o que faz com que também não suportem o HyperThreading. Ao utilizar um destes o recurso permanecerá desativado.

Os sistemas que suportam são o Windows 2000 (Professional e Server) e o Windows XP Professional. A Microsoft já divulgou que não pretende lançar nenhum patch que ative o HyperThreading nas versões domésticas do Windows. A idéia é claro que alguns usuários comprem as versões Profissionais e paguem novamente pelo sistema... Ou seja, se você utiliza uma das versões do Windows acima, novamente esqueça o HyperThreading.

Um detalhe interessante é que ao abrir o task manager do Windows você verá que o sistema mostrará dois gráficos de utilização do processador para cada unidade. Ou seja, utilizando dois processadores você verá quatro gráficos :-) Naturalmente, caso apareça um único gráfico significa que o recursos está desativado. Compre a versão Professional do Windows, ou desista:

Você também verá uma opção "HyperThreading" no Setup que permite ativar ou desativar o recurso (o que pode ser desejável em algumas situações). Se a opção não aparecer na sua placa, significa que ela provavelmente não suporta o HyperThreading:

No caso do Linux não existem restrições ao suporte a multiprocessamento, no caso da maioria das distribuições, como o Mandrake e o Red Hat o suporte vem ativado "de fábrica" no Kernel, enquanto em algumas distribuições, como no Slackware é preciso especificar o uso do Kernel com suporte a SMP durante a instalação para ativar o suporte.

O suporte a HyperThreading será mais um ingrediente da futura batalha entre o Pentium 4 e o Hammer. Porém,ele será apenas um extra, não o prato principal, pois o ganho de desempenho é apenas incremental e a maior parte dos usuários, seja por utilizar uma placa mãe incompatível ou por utilizar uma versão doméstica do Windows não se beneficiará do recurso.