As placas AMD são capazes de computação assincrona com o grafismo. As placas da Nvidia, apesar de o apregoarem, pelo menos para já, e totalmente por hardware, não são! Mas na prática qual a diferença? Vamos tentar explicar com um exemplo que todos possam perceber e que nem sequer envolve placas gráficas.
Imaginemos um hospital. Sim, um hospital, aquele sítio onde estão os médicos a trabalhar. E é com ele que vamos comparar o funcionamento das placas gráficas.
Note-se que este é apenas um exemplo simplificado sendo que situação real acaba por ser um pouco mais complexa, mas cremos que só por aqui já se percebe as vantagens de a computação ser assincrona, e como tal o processamento genérico poder ocorrer ao mesmo tempo que o gráfico.
Imaginemos então uma placa gráfica AMD e uma outra Nvidia com características semelhantes às da placa gráfica da PS4, ou seja com 1152 pipelines gráficos. E para a comparação vamos substituir esses pipelines por médicos que trabalham no hospital. 1152 médicos… Sim, é um grande hospital!
Ora estes médicos foram escolhidos por um motivo… são excelentes profissionais. Tão profissionais que possuem várias valências, podendo cada um realizar as duas tarefas principais do hospital: As consultas de pediatria a crianças, e as consultas seniores a adultos.
Ora apesar das valências, cada um dos profissionais só pode fazer uma coisa. Se está na pediatria não vai atender adultos, e se está nas consultas normais, não atende as crianças.
Para gerir as necessidades do hospital e a forma como o pessoal é distribuído há dois gestores. O gestor das consultas seniores que decide quem dá consultas normais, e o gestor das consultas de pediatria que decide quem atende as crianças.
Nas gerações antigas de placas Nvidia, e isto inclui todas as placas anteriores às Maxwell 2 ou série 9xx , bem como as placas AMD anteriores à arquitectura GCN o que tínhamos era que os médicos que estavam na pediatria não se davam com os médicos das consultas seniores. E isto aplicava-se igualmente em sentido contrário. A situação era tal que era impossível que as equipas partilhassem o mesmo hospital pois devido a factores diversos as mesmas entravam em conflito e pura e simplesmente não trabalhavam.
Daí que nesse tipo de hospital (nessas placas) quando os mesmos eram dedicados a pediatria não haviam consultas aos séniores, e quando eram as equipas seniores que eram destacadas, não haviam consultas de pediatria.
Tudo isto, apesar de longe do desejável, era necessário para que pelo menos os serviços funcionassem. Daí que no horário de funcionamento do hospital ou tinhamos um tipo de serviço, ou o outro (e isto variava durante o dia/processamento), mas apenas com uma equipa dedicada a uma das valências em funcionamento de cada vez.
O hospital (que aqui é a placa gráfica) funciona e até é eficiente. Dada a disponibilidade de médicos (os pipelines) posso prever as consultas de pediatria e seniores com precisão dedicando-lhe os profissionais que preciso.
Mas infelizmente, apesar de a coisa funcionar bem, há um problema. Por norma tenho sempre profissionais que não estão a fazer nada! Se num determinado horário precisar de pediatria e nesse mesmo dia só tiver 152 consultas, vou ter 1000 profissionais parados sem fazer nada. Da mesma forma, se tiver 1000 consultas, terei 152 profissionais parados. Independentemente do número, sempre que não tiver um número de consultas que sature a oferta do hospital, o que ocorre regularmente, terei profissionais que ficam em casa a jogar às cartas enquanto recebem na mesma o seu salário (e como o hospital é imaginário até pagamos salários chorudos. Daí que ter 1000 médicos em casa sem fazer nenhum e a receber… está a sair-nos muito caro).
O ideal era que havendo disponíveis profissionais que não precisava nas consultas do dia, eles pudessem atender alguns clientes na outra área. Sempre se ia adiantando serviço! Mas com este tipo de estrutura/arquitectura, tal é impossível pois as equipas não se dão.
Eis que entra uma remodelação, o GCN da AMD! (E aqui o Maxwell 2 da Nvidia deveria ter acompanhado, mas pelo que vemos isso não acontece, e o Maxwell 2 não parece comportar-se muito diferente do que tínhamos antes!)
Com esta remodelação temos uma grande diferença: arranjamos maneira de as equipas fazerem as pazes! E agora elas podem trabalhar em conjunto no mesmo hospital sem que hajam conflitos.
Assim, o que acontece é que agora os meus trabalhadores estão sempre todos a trabalhar, e o trabalho vai sendo adiantado. Quer isso dizer que mesmo que use a maior parte dos médicos num tipo de consulta, os poucos que restarem podem ir adiantando trabalho na restante especialidade. É a eficiência máxima!
O resultado é que no final do mês se comparar o número de consultas efectuadas no mesmo período de tempo o que tenho face ao que acontecia antes, é um número muito superior. A nível de eficiência usei sempre a totalidade dos recursos do hospital o que quer dizer que não andei a pagar para alguns médicos ficarem em casa a jogar às cartas, e o trabalho produzido foi igualmente o máximo possível. O hospital rendeu o máximo teórico que poderia render!
Em 2013, na apresentação da PS4, Mark Cerny insistiu que o futuro da informática passava por aqui. E que a PS4 tinha sido desenvolvida a pensar na optimização máxima deste tipo de processamento. Na altura a coisa passou um pouco ao lado, mas os primeiros benchmarks PC com o uso de um API de baixo nível e o uso de computação assincrona demonstram as vantagens e os ganhos de performances que este tipo de optimização e programação podem ter. As consolas são as principais responsáveis pelo crescimento deste tipo de processamento, mas as rotinas e técnicas usadas ainda são muito embrionárias e sem qualquer tipo de maturidade prevendo-se uma evolução exponencial da revelação das potencialidades deste tipo de processamento, ao longo dos tempos. Tratam-se afinal de centenas e centenas de Gflops de performance que de outra forma não seriam sequer usados.
E nas placas GCN ambas as equipas estão a dar-se bem e efectivamente trabalhar ao mesmo tempo, mas no Maxwell 2 onde é suposto elas terem igualmente as divergências sanadas a realidade é que as equipas recusam-se a comparecer ao mesmo tempo, realizando o trabalho pedido, primeiro uma e depois a outra, o que está a tornar a situação pouco diferente do que era antes.
O universo PC parece estar agora a acordar para esta realidade da computação assincrona, e a perceber os potenciais ganhos da situação. E aqui, infelizmente, a Nvidia parece ter ficado para trás, com a AMD a apresentar-se na linha da frente para o futuro do DirectX 12. E torna-se assim igualmente claro porque motivo à anos a AMD reclamava um novo API avançando mesmo com o seu, o Mantle, que acabou por descontinuar face à realidade do DirectX 12, ao passo que a Nvidia nunca se preocupou com nada nesse sentido. Se pensarmos que as placas da AMD com 4 anos já suportavam esta tecnologia, percebemos claramente como elas foram sub-aproveitadas ao longo de todo este tempo.
Deixo-vos com uns gráficos de alguns testes que tem vindo a ser efectuados pelo programadores do Beyond3D e que demonstram claramente que a computação assincrona, pelo menos actualmente, não funciona como devia nas placas da Nvidia. As melhorias no entanto existem, mas com as benesses a serem, de acordo com o referido pelos programadores, obtidas com penalizações enormes no CPU que não compensam o seu uso.
No gráfico vemos um processamento misto executado em série (DX 11) na linha azul que, efetua ambos os processamentos de forma cumulativa. Temos igualmente uma linha amarela que mostra como seria um processamento assincrono perfeito (com ambos os processamentos a serem feito em conjunto), e a laranja a computação assincrona real (DX 12) a ocorrer na placa.
As placas testadas são uma Geforce 980 Ti (2015)e uma Radeon 7950 (2011), e como vemos a placa AMD de 200 euros e 4 anos se mostra bem superior à Nvidia de mais de 700 e tecnologia de ponta.
Note-se porém que isto é apenas um teste específico da situação e não uma situação de mundo real onde o problema pode ser bastante mitigado e nem ser verdadeiramente notório. Há por isso que não confundir a performance em situações de jogos reais das placas no DirectX 12 com a performance neste tipo de cálculos, e muito menos neste tipo de teste.
Mais ainda, segundo alguns programas de análise, contrariamente à programação genérica do DX 12, o Physix da Nvidia aparenta ser conseguido a processar de forma assincrona, mostrando que, eventualmente, a Nvidia poderá futuramente conseguir resolver a situação com algum trabalho nas suas drivers, algo que a empresa já afirmou que pretende vir a fazer.
No entanto qualquer implementação que a Nvidia venha a fazer será sempre mais penalizadora para a Nvidia do que para a AMD a nível do uso do CPU pois dado o hardware presente nas placas Nvidia vemos desde já que a distribuição de tarefas entre o processamento gráfico e genérico no GPU terá de ser feito por software e as tarefas em fila de espera serão igualmente lidadas por software (Nas placas AMD estas situações são lidadas pelos ACES e pelo processador de comandos gráfico). No entanto, no que toca ao processamento posterior as placas Nvidia afirmam ter, tal como a AMD, e sem termos ideias das suas performances efectivas comparativas, Asynchronous Warps e DMA Engines no hardware, bem como as conhecidas Compute Units que a Nvidia apela de CUDA.
Fonte: Fóruns de programação diversos.