AMD 64 bits : Evolução ou Revolução? | |||
|
|
O pesadelo do modelo de programação x86 (e x87, para cálculos de vírgula flutuante) já é discutido quase desde a introdução destes processadores, havendo por isso muita polémica acerca da aposta da AMD em perpetuar esta arquitectura por mais tempo ainda; uma das justificações da Intel (a própria empresa responsável pela arquitectura x86) para introduzir os processadores Itanium, é justamente "enterrar" estes processadores pré-históricos, que dão pesadelos tanto aos programadores como aos próprios desenhadores de circuitos da Intel e outras empresas que fabricam processadores compatíveis com a ISA (Instruction Set Architecture) x86. Genericamente, quando falamos de processadores de 16 bits, 32, etc., estamos a referir-nos à largura do caminho de dados do processador. Mais especificamente, quando falamos de processadores de 64 bits, estamos a referir-nos a processadores nos quais cada um dos registos tem espaço de armazenamento para 64 bits de dados; da mesma forma, uma instrução de 64 bits é uma instrução que opera em números de 64 bits.
No
diagrama acima, os quadrados negros representam pedaços de código
e os quadrados brancos representam dados. Os registos do processador simples de 64 bits ilustrado em cima têm o dobro da dimensão dos do processador de 32. De igual modo, o Program Counter (PC) tem também uma dimensão duas vezes superior. No entanto, o Instruction Register mantém o seu tamanho - é necessário realçar de novo que neste processador hipotético, aumentámos a largura do caminho de dados mas não a do caminho de código. O que eventualmente se tornou na actual ISA x86, introduzida em 1979 com o lançamento do processador 8086 da Intel, passou de 8 bits (dos antecessores dos 8086/8088, os 8080/8085) para 16 bits e finalmente 32 bits. O 8086 possuía 4 GPR's (General Purpose Registers - registos de uso geral), cada um de 16 bits, e 4 registos de 16 bits para conter endereços de memória, mas que podiam ser utilizados como GPR's (os 4 GPR's, no entanto, não podiam ser utilizados para armazenar endereços de memória no modo de endereçamento de 16 bits). Com o lançamento do processador 80386, a Intel aumentou a arquitectura para suportar 32 bits; para tal duplicou o tamanho dos 8 registos de 16 bits originais. Para aceder à porção extendida destes registos, os programadores de assembly utilizavam um conjunto diferente de mnemónicas. Com a introdução da arquitectura AMD64, passou-se algo semelhante: a AMD duplicou o tamanho dos 8 GPR's e atribui novas mnemónicas aos registos extendidos. Ao aumentar de 32 para 64 o número de bits que a ALU e os registos suportam, e tendo em conta que os endereços de memória não passam de números inteiros e são armazenados nos registos, é possível endereçar mais memória: 232 bits = 4.294.967.296 bytes; 264bits = 18.446.744.073.709.551.616 bytes. É claro que a quantidade de memória que é teoricamente possível endereçar não corresponde necessariamente à sua implementação prática. Uma arquitectura teórica com um espaço de endereçamento de 64 bits poderia endereçar de modo directo até um máximo 18 milhões de terabytes. A implementação da AMD quebra a barreira dos 4 GBytes de memória física endereçável do modo 32 bits dos processadores x86 actuais (até 4 Gbytes, que não são atingidos na prática, excepto com sistemas operativos mais recentes), permitindo endereçar directamente até 1024 GBytes de memória física (são utilizados 40 bits para o endereçamento nestes processadores, e não 64: 240 bits = 1.099.511.627.776 bytes) e uns incríveis 256 TBytes (48 bits) de memória virtual. Em abono da verdade, é bom salientar que existem sistemas baseados no processador Intel Xeon que permitem o endereçamento de mais de 4 Gbytes de memória, e além disso, existe aparentemente um "truque" relativamente fácil de implementar que permitiria à Intel endereçar até 512 GBytes nos seus sistemas de 32 bits. No entanto, o método mais "limpo" e com menos implicações futuras é de facto aumentar o tamanho dos ponteiros de memória. E quais são as vantagens de se poder endereçar mais memória e de se poderem realizar cálculos com números de 64 bits?
Uma desvantagem da utilização de valores de endereçamento de memória de 64 bits é que, como estes endereços têm o dobro do tamanho físico dos de 32 bits, ocupam também o dobro do tamanho que ocupam na cache (para não falar do aumento no tamanho do código em disco, mas esse aspecto é algo insignificante com o aumento constante do espaço de armazenamento). Mesmo tendo em conta que os ponteiros para memória ocupam uma fracção pequena da cache, quando essa fracção duplica, o que impede que outros dados mais úteis estejam presentes na cache, o que pode diminuir o desempenho. Um
dos problemas mais antigos acerca da arquitectura x86 é a de que
o modelo de programação contempla apenas 8 GPR's,
8 FPR's (Floating Point Registers:
registos de vírgula flutuante) e 8 registos para SIMD
(Single Instruction, Multiple
Data) . Todos os ISA's RISC (Reduced
Instruction Set: conjunto de instruções
reduzidas) mais recentes suportam muito mais registos arquitecturais.
Por exemplo, a ISA PowerPC especifica a inclusão de 32
unidades de cada tipo de registo. O aumento do número de registos
permite ao processador armazenar mais dados onde as unidades de execução
podem aceder directamente, o que se traduz numa redução
do número de instruções load e store,
o que por sua vez implica menor tráfego nos subsistemas de memória,
o que implica por sua vez a diminuição do tempo de espera
no carregamento de dados, e por aí em diante. Mais registos permitem
também uma maior flexibilidade para o escalonamento de instruções,
originando menos dependências e minimização das bubbles
nas pipelines. Apesar deste truque, seria benéfico que mais registos fossem directamente acessíveis para o programador através da ISA x86. Isto daria ao compilador ou ao programador de assembly mais flexibilidade e controlo para uma optimização estática do código. Também permitiria uma diminuição do número de instruções de acesso à memória. A AMD, ao aumentar a ISA x86 para 64 bits, aproveitou a oportunidade para duplicar o número de GPR's e registos SIMD acessíveis através da ISA x86-64. Assim, ao correr no modo de 64 bits, os programadores vão ter acesso a 8 GPR's adicionais, além dos 8 registos SIMD (utilizados em instruções SSE e SSE2) É importante referir que o stack x87 não foi modificado. Esta decisão advém da política tanto da AMD como da Intel em encorajar os programadores a utilizador a tecnologia SSE/SSE2 para cálculos de vírgula flutuante, para tentar abandonar o modelo x87, um modelo com muitas insuficiências, tanto ao nível de prestações como dificuldade de programação. É importante referir que a simples duplicação do tamanho dos registos e a possibilidade de realizar cálculos com números de 64 bits (sem ter de os dividir em 2 subnúmeros, o que é feito para realizar cálculos de 64 bits em processadores de 32) não aumenta magicamente a velocidade de um sistema como fazem crer a algumas pessoas menos informadas! Um processador em que apenas fossem implementadas estas adições teria vantagem de performance em relação a um sistema de 32 bits somente na execução de código e de cálculos de 64 bits. Mas as novidades dos processadores da AMD não se resumem aos 64 bits; com o lançamento do Opteron foi definida uma plataforma e não apenas um mero circuito integrado. De seguida serão abordadas algumas das inovações que fazem parte da tecnologia AMD64.
|
© 2003 João Pedro Alves Ferreira Luis Filipe Barreto Ribeiro | Introdução Porquê 64 bits? Vantagens Desvantagens Conclusão Bibliografia |