Agora que falamos sobre todos os principais recursos do novo núcleo Nehalem, falaremos agora um pouco sobre dois recursos importantes, o HyperThreading e a otimização feita para lidar com instruções SSE desalinhadas. A tecnologia HyperThreading permite que cada núcleo do processador seja reconhecido como dois processadores. Dessa forma, se você tem um processador Core i7 com quatro núcleos o sistema operacional o reconhecerá como sendo um processador de oito núcleos. Esta tecnologia é baseada no fato de que quando o processador está trabalhando existem certos circuitos internos que ficam ociosos e que poderiam ser usados. Originalmente lançada para os processadores Pentium 4 esta é a primeira vez que a tecnologia HyperThreading está disponível nos processadores Intel de 6ª geração. Esta tecnologia também é chamada SMT ou Simultaneous Multi-Threading (SMT). Esta tecnologia não oferece o mesmo ganho de desempenho de como se núcleos “de verdade” fossem usados (ou seja, um processador com 8 núcleos é mais rápido do que um processador com 4 núcleos com tecnologia HT, desde que ambos estejam trabalhando com o mesmo clock e sejam baseados na mesma arquitetura); porém você está ganhando esses “núcleos extras” de graça. Existem dois tipos de instruções SSE que acessam a memória: alinhadas e desalinhadas. As instruções alinhadas precisam que os dados requisitados estejam dentro do limite de endereçamento de 16 bytes (128 bits), enquanto que as instruções desalinhadas não. Veja na Figura 9 uma ilustração.  clique para ampliar Figura 9: Instruções alinhadas vs. desalinhadas.
Vamos traduzir o que foi dito para o português claro. Imagine um micro com memórias de dois canais. O controlador de memória acessará a memória a 128 bits por vez. Portanto a memória será dividida em blocos de 128 bits (16 bytes). Em teoria o endereço que você for requisitar precisa estar no início de cada bloco para que você faça uma leitura (ou escrita) de 128 bits e obtenha o que você quer em apenas uma requisição. Esta é a requisição alinhada mostrada na parte superior da Figura 9. Mas suponhamos que você envie uma instrução para ler um dado da memória, mas em vez de usar o primeiro endereço dentro do bloco você solicita o endereço no meio do bloco. Como você está requisitando um dado de 128 bits o que acontecerá é que metade do dado estará no primeiro bloco e a outra metade do dado estará no bloco seguinte – isto é mostrado na parte inferior da Figura 9. Como o dado que você requisitou será divido em dois blocos diferentes o controlador de memória terá que ler dois blocos de memória, não apenas um como aconteceu no exemplo anterior. Na primeira leitura você terá metade do dado que você quer e na segunda metade terá os dados restantes. Apesar das requisições alinhadas serem mais eficientes elas são mais difíceis de serem usadas pelos programadores porque eles precisam conhecer a organização da memória. Por conta disso a maioria dos programadores acaba usando apenas instruções desalinhadas. Os processadores anteriores da Intel foram otimizados para instruções alinhadas e as instruções desalinhadas eram mais lentas e eram traduzidas em múltiplas microinstruções (micro-ops) – em outras palavras, instruções desalinhadas eram mais fáceis para o programador, mas eram executadas mais lentamente. Os processadores Nehalem são otimizados para instruções desalinhadas, obtendo o mesmo desempenho das instruções alinhadas. A Figura 10 traz um resumo.  clique para ampliar Figura 10: Arquitetura Nehalem é otimizada para instruções desalinhadas.
|