Escalar x vetorial
Nas colunas anteriores desta série foram discutidos alguns aspectos pertinentes ao processamento gráfico, distinguindo-o daquilo que classificamos como “processamento de dados”, ou seja, o processamento executado, por exemplo, por um editor de textos ou programa de banco de dados. Mas em nenhum momento nos referimos à diferença essencial entre eles.
Então, vamos procurar estabelecê-la agora. Tentarei fazê-lo da forma menos formal possível, mas me perdoem os que, ainda assim, acharem o assunto demasiadamente técnico. É que há limites que impedem de simplificar demasiadamente sem o risco de tornar o tema ininteligível.
Tanto em um caso quanto em outro, o processamento consiste em efetuar transformações. E estas transformações muitas vezes abrangem um grande conjunto de dados situados em posições contiguas da memória principal (o que, em linguagem técnica, caracteriza um “vetor” que, em linguagem ainda mais técnica, corresponde a uma matriz de uma só dimensão).
No processamento de dados que não envolve gráficos, a ocorrência de operações sobre vetores não é predominante. Ciclos sucessivos envolvem, portanto, distintas operações sobre dados diferentes que podem estar armazenados em posições não contiguas da memória. Este tipo de processamento denomina-se “escalar” e os processadores a ele destinados denominam-se “processadores escalares”. São nossas velhas conhecidas UCPs.
Ocorre que mesmo os processadores escalares precisam, vez ou outra, operar sobre vetores. E quando isto ocorre eles operam sobre um dado (ou “elemento” do vetor) de cada vez. E se for preciso fazer a mesma operação em mil elementos de certo vetor ? o que gerará um novo vetor de mil elementos transformados ? o processador “aponta” para a posição de memória ocupada por um elemento do primeiro vetor, copia o valor ali armazenado em um dos registradores da UCP, efetua as devidas operações e transfere o resultado para a posição de memória equivalente no trecho de memória destinado ao segundo vetor. Em seguida “incrementa os ponteiros” (ou seja, “aponta” para as posições de memória subsequentes do primeiro e do segundo vetor), repete a operação e prossegue, contando, até completar mil ciclos.
O que torna processadores escalares particularmente ineficientes para este tipo de operação é o fato de que o tempo gasto para gerenciar os ponteiros, executar a contagem dos ciclos e demais operações auxiliares costuma ser muito maior do que o gasto para executar o processamento propriamente dito, ou seja, as mil transformações dos elementos do vetor. Mas este é o comportamento típico de um processador escalar, ou UCP.
Já uma UGP funciona de forma diferente. Como ela se destina principalmente a processar gráficos e os arquivos gráficos se caracterizam por um enorme número de dados similares em posições contiguas da memória principal (pense, por exemplo, em uma foto de uma pessoa sentada sobre um gramado em um dia de céu com poucas nuvens e veja quantos pixels ela contém com tons similares de verde, na faixa inferior, e de azul, na superior), a imensa maioria das operações a serem por ela executadas têm como objeto os vetores. E por isto é otimizada para trabalhar em conjunto com todos os elementos de um vetor. Em razão disto as UGPs adotam uma arquitetura radicalmente diferente das UCPs.
Este tipo de processador se distingue por sua grande capacidade de executar cálculos simultâneos sobre um conjunto de dados. No interior das UGPs mais avançadas há dezenas, por vezes centenas de unidades especificamente dedicadas a cálculos, capazes de operar simultaneamente (veja figura). Por esta razão, quando é necessário efetuar certa operação sobre todos os, digamos, mil elementos de um vetor, e a UGP dispõe de, por exemplo, cem unidades capazes de efetuar cálculos, as mil operações são distribuídas pelas cem unidades internas e todo o trabalho é cumprido em um décimo do tempo gasto para efetuar a mesma transformação usando uma UCP. E, justamente por serem concebidas para operarem principalmente sobre vetores, as UGPs são classificadas como “processadores vetoriais”.
É claro que os processadores vetoriais não operam exclusivamente sobre vetores. E também é claro que a grande melhoria no desempenho que eles proporcionam somente é alcançada quando são solicitados a executarem repetidamente operações iguais sobre vetores de grande número de elementos. Para operações escalares ou mesmo para operações vetoriais sobre vetores de pequeno número de elementos, pode-se perder mais tempo distribuindo os elementos pelas diversas unidades internas e gerenciando sua operação simultânea do que executando as transformações propriamente ditas.
Então, há casos e casos. Para processar determinados algoritmos, melhor usar processadores escalares. Para outros, processadores vetoriais. Pois nada impede que um processador vetorial, justamente aquele que conhecemos por UGP por sua otimização para processar gráficos, seja usado para realizar outros tipos de operações que não envolvam gráficos.
por Bruno Paiuca Dentro da jornada de digitalização dos ecossistemas de segurança, a validação e…
A Alphabet, controladora do Google, planeja levantar US$ 80 bilhões por meio da venda de…
O Sberbank, maior banco da Rússia, está oferecendo modelos de inteligência artificial (IA) a países…
A Palo Alto Networks registrou forte aumento na procura de clientes por orientações sobre segurança…
O iFood confirmou nesta terça-feira (03) o vazamento de dados cadastrais de aproximadamente 1,2 milhão…
O CEO da OpenAI, Sam Altman, participará da cúpula do G7 na França em junho,…