Sítio do Piropo

B. Piropo

< Coluna em Fórum PCs >
Volte
03/01/2011

< Fusion I: a evolução dos gráficos >


 

Esta semana a AMD lançou no mercado o primeiro exemplar de uma nova classe de processadores, o Fusion, um microprocessador multinuclear capaz não apenas de processar dados mas também de executar processamento gráfico de alto desempenho. Em resumo: um chip que cumpre não somente as funções costumeiras de uma unidade central de processamento, ou CPU, como também as de uma unidade gráfica de processamento, ou GPU (também conhecida como coprocessador gráfico). Há alguns meses a Intel anunciou o lançamento de um processador, codinome Larrabee, basicamente com as mesmas características.

AMD Fusion
Por que razões as grandes fabricantes de microprocessadores resolveram incorporar o processamento gráfico em seus chips?
Bem, para entender isto há que se ter uma ideia não somente da tecnologia usada para gerar imagens e mover seus dados no interior do sistema como também da evolução desta tecnologia ao longo do tempo.
Porque, ao fim e ao cabo, esta tendência não é mais que um retorno às origens.
Senão vejamos:
O primeiro computador da linha PC usava o que havia de melhor na época, o máximo em tecnologia de microprocessadores.
Ou quase. O máximo, mesmo, era o Intel 8086, a primeira UCP que ostentava 16 bits tanto nos registradores internos quanto nos barramentos de memória e dados – e como aquele seria o primeiro computador pessoal da então poderosíssima IBM, não poderia deixar de ter o melhor processador. O “quase” corre por conta do fato de que o processador utilizado não foi exatamente o 8086, mas seu irmão menor, o 8088, funcionalmente idêntico ao 8086, mas com barramento de dados de apenas oito bits para que a IBM pudesse recorrer aos circuitos auxiliares então encontrados no mercado para o controlador da memória RAM, pois como a concorrência só dispunha de máquinas “de oito bits”, não havia disponibilidade de circuitos auxiliares para controlar um barramento de dezesseis. Fora isto, os dois chips eram idênticos e, de fato, o PC da IBM virou o “Rolls Royce” (ou a “Brastemp”, para quem prefere produtos nacionais) dos computadores pessoais e mudou o rumo da informática. Mas tudo isto é história: para que se tenha ideia, este ano o PC completaria 30 anos se vivo ainda fosse.
Mas o fato é que o velho PC não tinha processador gráfico auxiliar. As imagens eram geradas pela própria UCP, sem qualquer ajuda.
Já nas máquinas modernas as telas são geradas por um microprocessador dedicado apenas a elas e chamado processador (ou, para os mais exigentes, coprocessador) gráfico, capaz de produzir imagens com mais de dezesseis milhões de cores, muito além do que o olho humano pode distinguir, e com uma resolução que já se situa na casa dos milhões de pontos na tela.
Por que foram adotados os processadores gráficos?

Como e porque as coisas mudaram
O modelo original do PC não tinha gráfico de qualquer espécie. Sua controladora de vídeo era tão simples que controlava igualmente uma impressora (o que, para a época, fazia todo o sentido, já que vídeo e impressora eram os únicos dispositivos de saída do micrinho) e o padrão gráfico era o chamado MDA. Uma coisa tão antiga e tão fora de moda que, vejam vocês, para evitar imprecisões ao citar suas características, ao pesquisar na Internet a sigla “mda”, recebi mais de dez milhões de resultados que (pelo menos nas primeiras páginas) nada tinham a ver com o velho padrão de vídeo. Para consultar os dados que queria tive que entrar com “monochrome graphics display” por extenso, o nome completo do padrão. Que, como indica, usava tela monocromática (os monitores mostravam caracteres verdes ou âmbar) e apenas exibia texto, em 25 linhas de 80 caracteres cada. Veja, na Figura 1, obtida na página da IBM < http://www-03.ibm.com/ibm/history/exhibits/pc25/pc25_intro.html >  “The IBM PC's debut”, o IBM PC, sua impressora matricial e sua tela texto.

Figura 1: O IBM PC original

Quem quisesse gráficos na tela do PC e, supremo luxo, gráficos coloridos, tinha que adquirir como opcional uma “placa CGA”, ou melhor, uma controladora de vídeo padrão “color graphics array”, capaz de exibi-los em esplendorosas quatro cores  e com uma resolução de 200 x 320 pixels (mas quem se contentasse com apenas duas cores poderia aumentar a resolução para 640 x 200).
Sim, porque a controladora CGA, além de conter a memória de vídeo (16 KB, um absurdo para a época) apenas fazia a interface entre o processador e o monitor, convertendo os sinais digitais gerados pela máquina em analógicos, interpretados pelo velho tubo de imagem. Quem fazia todo o trabalho braçal de “desenhar” os gráficos e determinar a cor de cada pixel era o próprio 8088, o microprocessador do PC.
Quer dizer: o processamento de dados e o processamento gráfico eram feitos juntos no interior do próprio microprocessador, ou UCP, fundidos em uma única unidade de processamento.
Ocorre que ao longo de suas três décadas de vida o velho PC deixou de ser uma maquineta destinada a “fazer contas” e, vá lá, escrever textos, para se transformar em um monstro que “toca” música, exibe fotos em alta definição e “passa” filmes baixados da Internet em tempo real.
Complicou.
Mas complicou agora, porque no tempo do velho PC as coisas eram simples. A imagem da tela era gerada pela UCP (e por “imagem da tela” não me refiro necessariamente a gráficos: o “desenho” de cada caractere e sua posição em uma tela de texto também não deixa de formar uma imagem), suas características, na forma de dados digitalizados, eram transportadas para a controladora de vídeo através do barramento de entrada / saída (E/S), a controladora os convertia em sinais analógicos e os enviava ao monitor, que se encarregava de projetar a imagem na tela.
Tudo era muito simples porque os dados eram poucos. Para “produzir” a imagem de uma tela com 25 linhas de 80 caracteres cada, bastava alinhar sucessivamente os códigos (de um byte cada) de cada caractere (25 x 80 = 2.000) e juntar seus “atributos” (uma dentre as 16 cores disponíveis, além de características como “piscante”, sublinhado, intenso ou reverso) que, juntos, poderiam ser expressos também em um byte. Então, para formar uma tela inteira, usava-se apenas quatro mil bytes, dois por caractere: um para seu código, outro para seus atributos. E como a tela deveria ser renovada sessenta vezes por segundo para não causar a impressão de imagem “tremida”, bastava enviar 60 x 4.000 = 240.000 bytes/s para a controladora. Mais ou menos 240 KB/s.
Se a tela fosse gráfica a coisa complicava um pouco, mas não muito: como o padrão era o CGA, cujas imagens eram formadas por 200 linhas de 320 pontos, e como cada ponto podia exibir quatro cores (cujo código pode ser expresso em apenas dois bits, ou um quarto de byte), para formar cada tela eram necessários 200 x 320 x 0,25 = 16.000 bytes. Enviá-los para a controladora 60 vezes por segundo exigiria um tráfego pelo barramento de dados de 16.000 x 60 = 960.000 bytes/s, que corresponde a menos de 1 MB/s. Mais tarde surgiu o padrão VGA com suas 480 linhas de 640 pontos cada, cuja versão mais simples exibia 16 cores.Veja uma destas telas na Figura 2.

Figura 2: Uma tela padrão CGA 320x200 e 16 cores

E como esse fluxo de dados se movia? Ora, através do barramento de E/S original do PC, de oito linhas e operando na mesma frequência da UCP, cerca de 5 MHz. Como oito linhas transportam um byte em cada ciclo de operação e o barramento opera a 5 MHz (cinco milhões de ciclos por segundo), sua capacidade de transportar dados chega a 5 MB/s. Basta comparar os 5 MB/s que o barramento pode transportar com o 1 MB/s que uma tela gráfica padrão CGA do velho PC exigia para perceber que o barramento trabalhava com folga.
Agora vamos adiante. E nem é preciso ir muito adiante, só dez anos, até o início dos anos noventa do século passado, quando as interfaces gráficas como Windows passaram a dominar o mercado e acabaram-se as telas texto. Pior: não apenas as telas passaram a ser gráficas como, para que se pudesse distinguir os ícones e os caracteres, a definição tinha que ser muito maior. E apareceu o padrão SVGA (“super video graphics array ”) com suas telas de 768 linhas de 1.024 pontos, cada um deles podendo assumir até 65.526 (64K) cores diferentes, o chamado padrão “high color”.
Para exibir este número de cores, cada ponto da tela requer dois bytes. O total de bytes para formar uma tela SVGA é, portanto, 768 x 1024 x 2 = 1.572.864. Que devem ser enviados sessenta vezes por segundo através do barramento. Basta fazer as contas para concluir que isto demandaria um fluxo de 90 MB/s, muito acima da capacidade de transporte do barramento do PC. E olhe que eu nem mencionei a possibilidade de exprimir cores usando quatro bytes por pontos (o chamado padrão “true color”)

Barramentos mais rápidos
O primeiro passo para resolver o problema foi alterar o barramento de forma a aumentar sua capacidade, ou seja, fazê-lo transportar mais dados em menos tempo. Primeiro, aumentando sua largura para 16 bits e sua frequência de operação para até 12 MHz, criando um barramento de E/S que recebeu o nome de ISA (“Industry Standard Architecture”) e era capaz de transportar 24 MB/s (faça as contas).
O barramento ISA suportou diversos padrões gráficos intermediários, como o VGA, de 480 x 640 pontos e 256 cores, que gerava um fluxo de pouco mais de 17,5 MB/s (calcule), mas não chegava perto das necessidades do SVGA.
Depois de uma frustrada tentativa feita pela Associação de Padrões da Eletrônica de Vídeo (VESA) de criar seu próprio padrão, a Intel concebeu o vitorioso PCI (“Peripheral Component Interconnect”) com suas 32 linhas e operando a 33 MHz. Até hoje a maioria das placas-mãe de boa qualidade disponíveis no mercado ainda exibem pelo menos um conector (“slot”) PCI, embora hoje em dia raramente sejam usados para suportar controladoras de vídeo.
Pois o que ocorre é que, se você fizer os cálculos, descobrirá que um barramento PCI é capaz de sustentar um fluxo de 132 MB/s. Que suporta o SVGA “high color”, naturalmente, mas que só resolveu o problema por algum tempo, já que nossos olhos insaciáveis continuaram exigindo maiores resoluções de vídeo e maior número de cores, como os 16 milhões proporcionados pelo padrão “true color” no qual cada ponto da tela exige quatro bytes, o que faz com que o fluxo necessário para transportar dados de telas SVGA “true color” chegue a 180 MB/s, bem mais que a capacidade do barramento PCI.
Foi então necessário desenvolver barramentos ainda mais rápidos, especialmente para transportar os dados de vídeo.

Figura 3 – Placa mãe com conectores PCI e AGP

Disseminaram-se então, já no início do terceiro milênio, as diversas versões do padrão AGP, de “Accelererated Graphics Port” (porta gráfica acelerada), um aperfeiçoamento do PCI (a Figura 4 mostra uma placa-mãe na qual foram assinalados os conectores que receberão controladoras PCI e AGP).
Para começar, ao contrário de seus antecessores, inclusive o PCI, que sendo genéricos (isto é, podiam receber controladoras de dispositivos diversos, como som, rede e outros, além do vídeo) distribuíam o fluxo de dados entre todos os periféricos ligados a seus diversos conectores, o barramento AGP não era compartilhado com qualquer outro periférico e por isso mesmo só poderia haver conector AGP em uma placa-mãe se fosse para receber uma controladora de vídeo. Era um barramento do tipo “ponto a ponto”, ou seja, ligava diretamente a CPU à controladora de vídeo e só a ela. Como o PCI, o AGP também usava 32 linhas paralelas para transportar dados, porém desde sua primeira implementação operava em 66 MHz, o dobro da frequência do PCI. O que, de imediato, fazia com que sua capacidade de transporte de dados dobrasse para 266 MB/s.
Depois, aproveitando-se do mesmo tipo de tecnologia que levou ao desenvolvimento das memórias RAM tipo DDR2 e DDR3, os fabricantes de “chipset” (os barramentos da placa-mãe são controlados por um conjunto de circuitos auxiliares denominados genericamente de “chipset”) lograram transferir a cada ciclo de operação primeiro dois, depois quatro bits por linha de barramento, duplicando e quadruplicando o fluxo. Assim, o chamado “AGP x2” era capaz de transferir 533 MB/s e o “AGP x4” chegava a 1.066 MB/s (ou 1,066 GB/s). Pouco antes de desaparecer, substituído que foi pelo PCI-E como veremos adiante, o padrão AGP chegou a fornecer um fluxo de dados de 2,133 GB/s com a versão “AGP x8”, que transferia oito dados por ciclo de operação. Mas sua vida foi breve.

Contratando um ajudante
É claro que muito antes disso a indústria da informática percebeu que usar o único processador da máquina, aquele responsável pelo processamento de dados, para gerar imagens e depois transportá-las pelo barramento de E/S até a controladora de vídeo não estava dando resultado. Era uma estratégia suicida, que sobrecarregava tanto o processador quanto o barramento, fazendo com que o desempenho do sistema se tornasse cada vez mais lento – justamente quando as exigências do mercado eram por sistemas cada vez mais rápidos.
Solução?
Tirar o peso da responsabilidade pela geração de imagens do processador de dados.
Como?
Ora, como se faz em qualquer empresa quando um funcionário está sobrecarregado: contrata-se um ajudante e transfere-se para ele parte do trabalho.
Esta é justamente a ideia dos coprocessadores gráficos. Trata-se de um processador auxiliar, equivalente à UCP, porém especializado no processamento de gráficos (veja um deles, de fabricação NVidia, exibido na Figura 4) que fica na controladora de vídeo e se encarrega de “desenhar” as imagens. Que, a bem da verdade, ainda são criadas, ou concebidas, pela UCP, que é quem manda na parada (razão pela qual, mesmo depois que os coprocessadores gráficos passaram a ser usados, ainda havia grande demanda de tráfego sobre o barramento de E/S para transportar dados de vídeo). Mas em vez de desenhar cada ponto e enviá-los individualmente para a controladora de vídeo, a UCP manda apenas instruções sobre onde e como eles devem ser desenhados. Um exemplo simplificado: se um dos programas solicita que um círculo vermelho seja desenhado em uma determinada posição da tela, a UCP já não mais precisa gerar cada ponto dele. Em vez disso envia para a controladora de vídeo apenas as coordenadas do centro do círculo, seu raio e o código da cor. Quem calcula a posição de cada ponto e o desenha na tela com a cor desejada é o coprocessador gráfico. O que não somente alivia o trabalho da UCP como também, e principalmente, reduz brutalmente o tráfego de dados através do barramento de vídeo (em vez da cor e posição de cada ponto seguem apenas instruções sobre onde desenhá-los).

Figura 4: Coprocessador gráfico da NVidia

Foi então que surgiram as empresas especializadas em controladoras gráficas, com seus coprocessadores cada vez mais poderosos. Indústrias como AMD e Intel continuavam a fabricar os processadores, ou UCP (unidades centrais de processamento). E empresas como a NVidia e ATI passaram a se encarregar de projetar e fabricar controladoras gráficas dotadas de processadores cada vez mais poderosos, as GPUs (“graphics processing units”), unidades de processamento gráfico (em português, UPG, ou, para quem prefere manter a harmonia de siglas, UGP, de unidade gráfica de processamento).
Estas unidades já não são apenas responsáveis por gerar imagens planas nas telas. Como se pode perceber lendo as colunas sobre placas aceleradoras de vídeo bidimensionais e tridimensionais, há que gerar texturas, sombras, efeitos estereoscópicos, o diabo. A coisa ficou mesmo complicada e passou a exigir um bocado de tecnologia.
Resultado: as empresas especializadas em controladoras de vídeo cresceram a ponto de se tornarem gigantes da indústria. E não é para menos: uma controladoras de vídeo de topo de linha com seu processador gráfico custa tanto ou mais que uma placa mãe moderna equipada com uma boa UCP.
Pois não é que em 2006, não mais que de repente, a AMD compra a ATI?
O que a teria levado a isto?
Bem, este assunto, assim como o Fusion, será tratado semana que vem.

 

B. Piropo