Pelo que entendi o problema, existem problemas que podem ser fortemente paralelizados, por exemplo, renderização, decodificação de vídeo. Como as CPUs não são excelentes em tais tarefas, as GPUs foram criadas. Eles usam arquiteturas diferentes para empregar a execução SIMD. Eles também possuem um tipo especial de memória que funciona bem para acesso independente aos “threads” da GPU.
Porém, o que vemos é que a arquitetura x86 recebe inúmeras extensões que focam no processamento de streaming, como SSE ou AVX. Eles também são SIMD e, por algum motivo, são executados no lado da CPU. Então, qual é o sentido de adicioná-los?
Que tipo de vantagem essas extensões oferecem em relação a uma GPU normal? Quero dizer, as GPUs têm maior largura de banda de memória e outras coisas, mas isso não coloca as CPUs com extensões em desvantagem? Eles não sofrem de problemas de largura de banda de memória?
Entendo que nem todo computador deve ter uma GPU dedicada, por exemplo, servidores ou estações de trabalho. Mas se a carga útil for pequena, isso não deverá ser um problema. E se a carga útil for grande o suficiente, você compraria uma placa gráfica para essa tarefa. As extensões SIMD são como um meio-termo entre CPU e GPU.
Se as extensões SIMD tornam a CPU mais capaz de executar tarefas que normalmente são executadas pela GPU, isso não torna a GPU mais obsoleta? Quero dizer, se eles podem tornar a CPU mais amigável ao SIMD, por que não fizeram isso e decidiram terceirizar esse problema para um dispositivo diferente?
Só quero saber quais aplicações essas extensões recebem em um software onde o desempenho é importante. Por exemplo, um mecanismo de jogo ou um renderizador certamente usaria uma GPU. As extensões SIMD fariam diferença?
Só porque você pode fazer algo em uma GPU não significa que fazê-lo em uma GPU seja o melhor lugar para fazê-lo.
As GPUs funcionam melhor quando você tem grandes quantidades de dados que exigem a execução das mesmas operações. Para lotes menores de dados, pode ser mais eficiente executá-los em linha com o código da CPU.
Um dos problemas com GPUs é que ela requer que uma CPU pegue dados de algum lugar, carregue-os na RAM, copie-os através do barramento PCIe, carregue um programa na GPU para processar os dados, execute esse programa e copie os resultados. de volta para a RAM da CPU. Somente depois de todo esse trabalho a CPU poderá fazer algo com os dados.
Se a sua CPU possui um conjunto de instruções voltadas para esse tipo de operação e não precisa fazer todo esse trabalho de configuração da GPU, então você pode descobrir que para pequenas quantidades de dados a CPU é realmente mais rápida.
Isto é especialmente verdadeiro quando os dados dependem fortemente de uma estrutura de controle da CPU ou quando os dados têm vida particularmente curta.
Se uma CPU leva apenas 0,1 segundos para fazer um hash SHA usando SSE ou AVX, realmente vale a pena gastar 0,1 segundos enviando dados para a GPU, outros 0,25 segundos compilando um programa de shader para aquela GPU específica e aguardando a chegada de seus dados voltar?
Quando você está com fome e precisa de algo agora, você pede comida on-line e espera ou apenas pega algo na geladeira já abastecida?