Parece-me que hoje em dia muitos cálculos são feitos na GPU. Obviamente, gráficos são feitos lá, mas o uso de CUDA e similares, AI, algoritmos de hash (pense em bitcoins) e outros também são feitos na GPU. Por que não podemos simplesmente nos livrar da CPU e usar a GPU por conta própria? O que torna a GPU muito mais rápida que a CPU?
373
Respostas:
Resposta da TL; DR: As GPUs têm muito mais núcleos de processador que as CPUs, mas como cada núcleo de GPU é significativamente mais lento que um núcleo de CPU e não possui os recursos necessários para os sistemas operacionais modernos, eles não são adequados para executar a maior parte do processamento no dia a dia. Informática. Eles são mais adequados para operações de computação intensiva, como processamento de vídeo e simulações de física.
GPGPU ainda é um conceito relativamente novo. As GPUs foram usadas inicialmente para renderizar apenas gráficos; À medida que a tecnologia avançava, o grande número de núcleos nas GPUs em relação às CPUs era explorado pelo desenvolvimento de recursos computacionais para GPUs, para que eles pudessem processar muitos fluxos de dados paralelos simultaneamente, independentemente de quais sejam esses dados. Embora as GPUs possam ter centenas ou milhares de processadores de fluxo, cada uma delas é mais lenta que o núcleo da CPU e possui menos recursos (mesmo se o Turing estiver completo e puder ser programado para executar qualquer programa que a CPU possa executar). Os recursos ausentes das GPUs incluem interrupções e memória virtual, necessárias para implementar um sistema operacional moderno.
Em outras palavras, CPUs e GPUs têm arquiteturas significativamente diferentes que as tornam mais adequadas para tarefas diferentes. Uma GPU pode lidar com grandes quantidades de dados em muitos fluxos, executando operações relativamente simples neles, mas não é adequada para processamento pesado ou complexo em um ou poucos fluxos de dados. Uma CPU é muito mais rápida em uma base por núcleo (em termos de instruções por segundo) e pode executar operações complexas em um único ou poucos fluxos de dados com mais facilidade, mas não pode lidar com muitos fluxos simultaneamente.
Como resultado, as GPUs não são adequadas para lidar com tarefas que não se beneficiam significativamente ou que não podem ser paralelizadas, incluindo muitos aplicativos de consumo comuns, como processadores de texto. Além disso, as GPUs usam uma arquitetura fundamentalmente diferente; seria necessário programar um aplicativo especificamente para uma GPU para que ela funcionasse, e são necessárias técnicas significativamente diferentes para programar as GPUs. Essas diferentes técnicas incluem novas linguagens de programação, modificações nas linguagens existentes e novos paradigmas de programação que são mais adequados para expressar uma computação como uma operação paralela a ser executada por muitos processadores de fluxo. Para obter mais informações sobre as técnicas necessárias para programar GPUs, consulte os artigos da Wikipedia sobre processamento de fluxo e computação paralela .
As GPUs modernas são capazes de executar operações vetoriais e aritmética de ponto flutuante, com os últimos cartões capazes de manipular números de ponto flutuante de precisão dupla. Estruturas como CUDA e OpenCL permitem que programas sejam gravados para GPUs, e a natureza das GPUs os torna mais adequados para operações altamente paralelizáveis, como na computação científica, onde uma série de placas de computação GPU especializadas pode ser um substituto viável para um pequeno cluster de computação como nos supercomputadores pessoais NVIDIA Tesla . Os consumidores com GPUs modernas com experiência no Folding @ home podem usá-los para contribuir com os clientes da GPU , que podem executar simulações de dobra de proteínas em velocidades muito altas e contribuir com mais trabalho para o projeto (leia as Perguntas frequentes)primeiro, especialmente aqueles relacionados a GPUs). As GPUs também podem permitir uma melhor simulação física em jogos de vídeo usando o PhysX, acelerar a codificação e decodificação de vídeo e executar outras tarefas intensivas em computação. É nesse tipo de tarefa que as GPUs são mais adequadas para a execução.
A AMD é pioneira em um design de processador chamado Unidade de Processamento Acelerado (APU), que combina núcleos de CPU x86 convencionais com GPUs. Essa abordagem permite um desempenho gráfico muito superior às soluções gráficas integradas à placa-mãe (embora não correspondam às GPUs discretas mais caras) e permite um sistema compacto e de baixo custo com bom desempenho multimídia, sem a necessidade de uma GPU separada. Os processadores Intel mais recentes também oferecem gráficos integrados no chip, embora o desempenho competitivo da GPU integrada atualmente esteja limitado a alguns chips com o Intel Iris Pro Graphics. À medida que a tecnologia continuar avançando, veremos um grau crescente de convergência dessas partes que antes eram separadas. AMD prevêum futuro em que a CPU e a GPU sejam únicas, capazes de trabalhar juntas na mesma tarefa .
No entanto, muitas tarefas realizadas pelos sistemas operacionais e aplicativos de PC ainda são mais adequadas para as CPUs, e muito trabalho é necessário para acelerar um programa usando uma GPU. Como muitos softwares existentes usam a arquitetura x86 e como as GPUs exigem diferentes técnicas de programação e faltam vários recursos importantes necessários para os sistemas operacionais, é muito difícil uma transição geral da CPU para a GPU para a computação cotidiana.
fonte
A GPU não é mais rápida que a CPU. CPU e GPU são projetadas com dois objetivos diferentes, com diferentes trade-offs, para que eles tenham características de desempenho diferentes . Certas tarefas são mais rápidas em uma CPU, enquanto outras são computadas mais rapidamente em uma GPU. A CPU se destaca em fazer manipulações complexas em um pequeno conjunto de dados, a GPU se destaca em fazer manipulações simples em um grande conjunto de dados.
A GPU é uma CPU para fins especiais, projetada para que uma única instrução funcione em um grande bloco de dados (SIMD / Dados Múltiplos de Instrução Única), todos eles aplicando a mesma operação. Trabalhar em blocos de dados é certamente mais eficiente do que trabalhar com uma única célula por vez, porque há uma sobrecarga muito reduzida na decodificação das instruções, no entanto, trabalhar em grandes blocos significa que há mais unidades de trabalho paralelas, portanto, ele usa muito mais transistores implementar uma única instrução GPU (causando restrição de tamanho físico, consumindo mais energia e produzindo mais calor).
A CPU foi projetada para executar uma única instrução em um único dado o mais rápido possível. Como ele só precisa trabalhar com um único dado, o número de transistores necessários para implementar uma única instrução é muito menor, para que uma CPU possa ter um conjunto de instruções maior, uma ALU mais complexa, uma melhor previsão de ramificação, melhor virtualizada arquitetura e esquemas de cache / pipeline mais sofisticados. Seus ciclos de instruções também são mais rápidos.
A razão pela qual ainda estamos usando a CPU não é porque x86 é o rei da arquitetura da CPU e o Windows foi escrito para x86, a razão pela qual ainda estamos usando a CPU é porque o tipo de tarefas que um sistema operacional precisa executar, como tomar decisões, é executado com mais eficiência em uma arquitetura de CPU. Um sistema operacional precisa examinar centenas de tipos diferentes de dados e tomar várias decisões, que dependem uma da outra; esse tipo de trabalho não é paralelo com facilidade, pelo menos não em uma arquitetura SIMD.
No futuro, o que veremos é uma convergência entre a arquitetura da CPU e da GPU, à medida que a CPU adquire a capacidade de trabalhar sobre blocos de dados, por exemplo, SSE. Além disso, à medida que a tecnologia de fabricação melhora e os chips diminuem, a GPU pode se dar ao luxo de implementar instruções mais complexas.
fonte
Falta GPU:
Você precisa deles para implementar algo como um sistema operacional moderno.
Eles também são (relativamente) lentos com aritmética de precisão dupla (quando comparados ao desempenho aritmético de precisão única) * e são muito maiores (em termos de tamanho de silício). As arquiteturas mais antigas de GPU não suportam chamadas indiretas (por meio de ponteiros de função) necessárias para a maioria dos programas de uso geral e arquiteturas mais recentes que o fazem lentamente. Finalmente, (como outras respostas observaram), para tarefas que não podem ser paralelizadas, as GPUs perdem em comparação com as CPUs que recebem a mesma carga de trabalho.
EDIT : Observe que esta resposta foi escrita em 2011 - a tecnologia da GPU é uma área que muda constantemente. As coisas podem ser muito diferentes dependendo de quando você estiver lendo isso: P
* Algumas GPUs não são lentas com aritmética de precisão dupla, como as linhas Quadro ou Tesla da NVidia (geração Fermi ou mais recente) ou a linha FirePro da AMD (geração GCN ou mais recente). Mas estes não estão nas máquinas da maioria dos consumidores.
fonte
Uma CPU é como um trabalhador que é super rápido. Uma GPU é como um grupo de trabalhadores de clones que são rápidos, mas que todos precisam fazer exatamente a mesma coisa em uníssono (com a exceção de que alguns clones podem ficar ociosos, se quiser)
Qual você preferiria ter como desenvolvedor, um cara super rápido ou 100 clones rápidos que na verdade não são tão rápidos, mas todos precisam executar as mesmas ações simultaneamente?
Para algumas ações, os clones são muito bons, por exemplo, varrem o chão - cada um pode varrer parte dele.
Para algumas ações, os clones fedem, por exemplo, escreva o relatório semanal - todos os clones, exceto um, ficam ociosos enquanto um clone escreve o relatório (caso contrário, você apenas recebe 100 cópias do mesmo relatório).
fonte
Como as GPUs são projetadas para fazer muitas coisas pequenas ao mesmo tempo, e as CPUs são projetadas para fazer uma coisa de cada vez. Se o seu processo puder ser maciçamente paralelo, como o hash, a GPU terá ordens de magnitude mais rápidas, caso contrário não será.
Sua CPU pode calcular um hash muito, muito mais rápido que sua GPU - mas, quanto tempo leva para sua CPU, sua GPU pode estar no meio de centenas de hashes. As GPUs são projetadas para fazer muitas coisas ao mesmo tempo, e as CPUs são projetadas para fazer uma coisa de cada vez, mas muito rapidamente.
O problema é que CPUs e GPUs são soluções muito diferentes para problemas muito diferentes, há uma pequena sobreposição, mas geralmente o que está em seu domínio permanece em seu domínio. Não podemos substituir a CPU por uma GPU porque a CPU está lá, fazendo seu trabalho muito melhor do que uma GPU jamais poderia, simplesmente porque uma GPU não foi projetada para fazer o trabalho e é uma CPU.
Uma observação secundária secundária, se fosse possível descartar a CPU e ter apenas uma GPU, você não acha que a renomearíamos? :)
fonte
Você está realmente perguntando por que não estamos usando GPU como arquiteturas na CPU?
GPU é apenas uma CPU especializada de uma placa gráfica. Emprestamos computação gráfica não GPU, porque a CPU de uso geral não está à altura da execução paralela e de ponto flutuante.
Na verdade, estamos usando arquiteturas de CPU diferentes (com mais GPU). Por exemplo, os processadores Niagara são bastante multitarefas. O SPARC T3 executará 512 threads simultâneos.
fonte
Eu posso estar terrivelmente enganado aqui, e estou falando de pouca ou nenhuma autoridade sobre o assunto, mas aqui vai:
Acredito que cada unidade de execução de GPU ("núcleo") tem um espaço de endereço muito limitado em comparação com uma CPU.
As unidades de execução da GPU não conseguem lidar com ramificações de forma eficiente.
As unidades de execução de GPU não suportam interrupções de hardware da mesma forma que as CPUs.
Eu sempre pensei que a forma como as unidades de execução da GPU deveriam ser é algo como os "SPEs" do Playstation 3, eles querem receber um bloco de dados, executar várias operações seqüenciais nele e cuspir outro bloco de dados. dados, enxágüe, repita. Eles não têm tanta memória endereçável quanto o "CPE" principal, mas a idéia é dedicar cada "SPE" a uma tarefa seqüencial específica. A saída de uma unidade pode alimentar a entrada de outra unidade.
As unidades de execução não funcionam bem se estão tentando "analisar" os dados e tomar várias decisões com base no que são esses dados.
Esses "blocos de dados" podem fazer parte de um fluxo, como uma lista de vértices da tabela de estados de um jogo, dados MPEG de um disco etc.
Se algo não se encaixa nesse modelo de "streaming", você tem uma tarefa que não pode ser paralelizada com eficiência e a GPU não é necessariamente a melhor solução para isso. Um bom exemplo é o processamento de coisas baseadas em "evento externo", como teclado, joystick ou entrada de rede. Não há muitas coisas que não se encaixam nesse modelo, mas sempre haverá algumas.
fonte
Isso não é nada sobre velocidade ou propósito do relógio. Ambos são igualmente capazes de concluir a maioria, senão todas as tarefas; no entanto, alguns são um pouco mais adequados para algumas tarefas do que outras.
Há um argumento muito antigo sobre se é melhor ter muitos núcleos burros ou um pequeno grupo de núcleos muito inteligentes. Isso remonta facilmente aos anos 80.
Dentro de uma CPU, existem muitos cálculos possíveis que podem ser feitos. Os núcleos mais inteligentes são capazes de realizar muitos cálculos diferentes ao mesmo tempo (como o multi-núcleo, mas não é complicado; consulte paralelismo no nível da instrução ). Um núcleo inteligente pode fazer vários cálculos ao mesmo tempo (somar, subtrair, multiplicar, dividir, operação de memória), mas apenas um de cada vez; por isso, eles são fisicamente maiores (e, portanto, muito mais caros) do que os núcleos mais escuros.
Um núcleo burro é muito menor e, portanto, mais pode ser adicionado a um único chip, mas não é capaz de fazer tantos cálculos simultâneos. Há um bom equilíbrio entre muitos núcleos mudos e alguns núcleos inteligentes.
As arquiteturas de vários núcleos funcionam bem com os gráficos, porque os cálculos podem ser facilmente divididos em centenas de núcleos, mas também depende da qualidade do código e se outro código depende do resultado de um cálculo.
Essa é uma pergunta muito mais complicada do que pode parecer. Para mais informações, leia este artigo sobre o design da CPU:
fonte
Gostaria de abordar um ponto sintático: Os termos CPU e GPU são nomes funcionais, não nomes arquitetônicos.
Se um computador usasse uma GPU como seu processador principal, ele se tornaria uma "unidade central de processamento" (CPU), independentemente da arquitetura e do design.
fonte
É importante ter em mente que não há linha divisória mágica no espaço da arquitetura que torne um processador o "central" e o outro o "gráfico". (Bem, algumas GPUs podem estar aleijadas demais para serem totalmente gerais, mas não é sobre isso que estamos falando aqui.)
A distinção é uma de como eles são instalados no quadro e quais tarefas são dadas a eles. Obviamente, usamos processadores de uso geral (ou conjunto de processadores de uso geral) para o principal movedor de dados, e uma unidade especial, paralelizada e profundamente alinhada por tubos, para coisas (como gráficos) que possam tirar melhor proveito deles.
A maioria dos truques que foram usados para fazer com que as GPUs realizassem suas tarefas muito rapidamente foram desenvolvidos por pessoas que tentavam criar CPUs mais rápidas e melhores. Acontece que o Word, Excel e Netscape e muitas outras coisas para as quais as pessoas usam seus computadores não apenas aproveitam ao máximo os recursos oferecidos pelos chips gráficos especializados, mas também correm mais devagar nessas arquiteturas porque ramificam muitas causas (muito caras e lenta) a linha de tubulação limpa.
fonte
O ponto principal de haver uma GPU era aliviar a CPU dos cálculos gráficos caros que estava sendo feito na época.
Combiná-los em um único processador novamente voltaria a onde tudo começou.
fonte
Por uma razão simples: a maioria dos aplicativos não é multiencadeada / vetorizada.
As placas gráficas dependem muito do multiencadeamento, pelo menos no conceito.
Compare um carro com um único motor, um carro com um motor menor por roda. Com o último carro, você precisa comandar todos os motores, algo que não foi levado em consideração no ponto de vista da programação do sistema.
Porém, com a fusão da AMD, ele mudará a forma como precisaremos usar o poder de processamento: vetorizado ou rápido para um thread.
fonte
A razão pela qual ainda estamos usando CPUs é que ambas, CPUs e GPUs, têm suas vantagens exclusivas. Veja meu artigo a seguir, aceito no ACM Computing Surveys 2015, que fornece uma discussão conclusiva e abrangente sobre como passar do 'debate CPU vs GPU' para 'computação colaborativa CPU-GPU'.
Uma pesquisa sobre técnicas de computação heterogênea CPU-GPU
fonte
Se colocar simplesmente GPU pode ser comparado ao reboque no carro. Como geralmente o tronco é suficiente para a maioria das pessoas, exceto nos casos em que eles compram algo realmente grande. Então eles podem precisar de trailer. O mesmo acontece com a GPU, pois geralmente é suficiente ter uma CPU comum que realizará a maioria das tarefas. Mas se você precisar de alguns cálculos intensivos em vários threads, poderá precisar de GPU
fonte
GPUS são bons processadores de fluxo. você pode pensar no processamento de fluxo como multiplicando uma longa matriz de números sequencialmente. O cpus também possui recursos de processamento de fluxo (chamados de extensões SIMD), mas você não pode implementar toda a lógica de programação como processamento de fluxo, e os compiladores têm a opção de criar um código de código que utiliza as instruções simd sempre que possível.
nem tudo é uma matriz de números. fotos e vídeos são, talvez também soem (existem codificadores opencl aqui e ali). para que o gpus possa processar, codificar e decodificar fotos, vídeos e qualquer coisa semelhante. Uma desvantagem é que você não pode descarregar tudo para o gpus nos jogos porque isso criaria gagueira, os gpus estão ocupados com gráficos e devem ser o gargalo do sistema ao jogar. a solução ideal seria utilizar totalmente todos os componentes em um PC. então, por exemplo, o mecanismo physx da nvidia, por padrão, faz cálculos na CPU quando a GPU é totalmente utilizada.
fonte