Questão Por que ainda estamos usando CPUs em vez de GPUs?


Parece-me que hoje em dia muitos cálculos são feitos na GPU. Obviamente gráficos são feitos lá, mas usando 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?


352


origem


Como sei quais respostas contêm informações corretas? Devo esperar até que os outros respondam às votações? Acho que fui muito apressado em aceitar uma resposta: - ell
Há algumas respostas recentes @ell agora, que não contêm "desinformação". Eles estão gradualmente subindo para o topo com votos devido ao mecanismo de mercado eficiente do StackExchange maravilhosamente projetado; -) Eu sugiro esperar um pouco mais antes de aceitar uma resposta. Parece que você com muita prudência está fazendo exatamente isso. Esta é uma boa pergunta, a propósito. Pode parecer óbvio, mas não é de todo. Obrigado por perguntar! - Ellie Kesselman
É como perguntar "Se o Boeing 747 é mais rápido e mais eficiente em termos de combustível, por que ainda dirigimos carros"? - vartec
Não, porque não é RISC versus CISC. É um dos outros fundamentos da ciência da computação, ligeiramente disfarçado. Está "Por que nós descarregamos o trabalho do processador central nos processadores de E / S?". - JdeBP
@vartec: Eu acho que uma analogia ligeiramente melhor pode ser entre ônibus e táxis. Se houver quarenta pessoas que querem ir do mesmo lugar para o mesmo lugar, um ônibus será muito mais eficiente. Se houver quarenta pessoas cujas origens e destinos desejados estão amplamente espalhados, até mesmo um único táxi pode ser tão bom quanto um ônibus, e pelo custo do ônibus pode-se ter vários táxis. - supercat


Respostas:


TL; Resposta DR: As GPUs têm muito mais núcleos de processador do que CPUs, mas como cada núcleo de GPU é executado significativamente mais lento que um núcleo de CPU e não possui os recursos necessários para sistemas operacionais modernos, eles não são apropriados para executar a maior parte do processamento na computação cotidiana. Eles são mais adequados para operações de computação intensiva, como processamento de vídeo e simulações físicas.


GPGPU ainda é um conceito relativamente novo. As GPUs foram inicialmente usadas apenas para renderizar gráficos; À medida que a tecnologia avançava, o grande número de núcleos em GPUs em relação às CPUs era explorado pelo desenvolvimento de recursos computacionais para GPUs, de modo que eles pudessem processar muitos fluxos paralelos de dados simultaneamente, independentemente de quais dados fossem. Embora as GPUs possam ter centenas ou mesmo milhares de processadores de fluxo, cada uma delas é mais lenta do que o núcleo da CPU e tem menos recursos (mesmo que sejam Turing completo e pode ser programado para executar qualquer programa que uma CPU possa executar). Os recursos ausentes nas 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 os tornam mais adequados para diferentes tarefas. Uma GPU pode manipular grandes quantidades de dados em muitos fluxos, executando operações relativamente simples, mas é inadequada 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 realizar operações complexas em um ou poucos fluxos de dados com mais facilidade, mas não pode manipular com eficiência muitos fluxos simultaneamente.

Como resultado, as GPUs não são adequadas para lidar com tarefas que não se beneficiam significativamente ou não podem ser paralelizadas, incluindo muitos aplicativos de consumidor comuns, como processadores de texto. Além disso, as GPUs usam uma arquitetura fundamentalmente diferente; alguém teria que programar um aplicativo especificamente para uma GPU para que funcione, e técnicas significativamente diferentes são necessárias para programar as GPUs. Essas diferentes técnicas incluem novas linguagens de programação, modificações em 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 realizar operações vetoriais e aritmética de ponto flutuante, com os cartões mais recentes capazes de manipular números de ponto flutuante de precisão dupla. Frameworks como CUDA e OpenCL permitem que programas sejam escritos para GPUs, e a natureza das GPUs os torna mais adequados para operações altamente paralelizáveis, como em computação científica, onde uma série de placas de computação GPU especializadas pode ser um substituto viável para uma pequena computar cluster como em Supercomputadores Pessoais NVIDIA Tesla. Consumidores com GPUs modernas com experiência no Folding @ home podem usá-los para contribuir Clientes de GPU, que pode realizar simulações de dobramento de proteínas em velocidades muito altas e contribuir com mais trabalho para o projeto (não deixe de ler o FAQs primeiro, especialmente aqueles relacionados a GPUs). As GPUs também podem permitir uma melhor simulação física em videogames usando o PhysX, acelerar a codificação e a decodificação de vídeo e executar outras tarefas de computação intensiva. São esses tipos de tarefas que as GPUs são mais adequadas para executar.

A AMD é pioneira em um design de processador chamado Unidade de Processamento Acelerado (APU) que combina núcleos convencionais de CPU x86 com GPUs. Essa abordagem permite um desempenho gráfico muito superior às soluções gráficas integradas à placa-mãe (embora não seja compatível com GPUs discretas mais caras) e permite um sistema compacto e de baixo custo com bom desempenho de 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 esteja atualmente limitado aos poucos chips com Intel Iris Pro Graphics. À medida que a tecnologia continua avançando, veremos um grau crescente de convergência dessas partes antes separadas. AMD prevê um futuro onde o CPU e GPU são um, capazes de trabalhar em conjunto na mesma tarefa.

No entanto, muitas tarefas executadas por sistemas operacionais e aplicativos de PC ainda são mais adequadas para CPUs, e muito trabalho é necessário para acelerar um programa usando uma GPU. Como tantos 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, uma transição geral da CPU para a GPU para a computação cotidiana é muito difícil.


373



Como essa resposta, acho que a principal razão é que não temos boas linguagens de programação de fluxo principal para lidar com arquiteturas paralelas como essa. Nós temos lutado por décadas para avançar a programação multi-thread, e as pessoas ainda estão chamando, multi threading "mal". Apesar disso, CPUs e GPUs multi-core são uma realidade, e teremos que criar novos paradigmas de programação para lidar com isso. - Soren
Vale a pena notar que a Intel tem trabalhado em Larrabee arquitetura (por muito tempo), que é essencialmente um chip com um enorme número de núcleos x86 nele. - Chris S
Grande resposta para discutir as razões de hardware e discutir APUs e como eles vão mudar isso. No entanto, a @Soren dá um bom ponto no lado do software. Na realidade, é a combinação dos problemas de hardware, os problemas de software e o fato de que as CPUs funcionam e quando algo é conhecido por funcionar, é difícil fazer com que as pessoas o substituam. - Nich Del
"não temos boas linguagens de programação de fluxo principal para lidar com arquiteturas paralelas como esta." - Haskell, OCaml, Scheme, F #, Erlang e praticamente qualquer outro langauge de programação funcional com multithreading muito bem. Todos os que eu mencionei são mainstream. - BlueRaja - Danny Pflughoeft
@BlueRaja - estamos cientes dessas linguagens, sua definição de fluxo principal deve ser diferente da minha :-) - Soren


O que torna a GPU muito mais rápida que a CPU?

A GPU é não mais rápido que o CPU. CPU e GPU são projetados com dois objetivos diferentes, com diferentes trade-offs, então eles têm diferente característica de desempenho. Certas tarefas são mais rápidas em uma CPU enquanto outras tarefas são mais rápidas computadas em uma GPU. O CPU se destaca em fazer manipulações complexas para um pequeno conjunto de dados, a GPU se destaca em fazer manipulações simples para um grande conjunto de dados.

A GPU é uma CPU de propósito especial, projetada para que uma única instrução funcione em um grande bloco de dados (SIMD / Dados Únicos 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 de cada vez, pois há uma sobrecarga muito reduzida na decodificação das instruções, mas trabalhar em grandes blocos significa que há mais unidades de trabalho paralelas, portanto usa muito mais transistores para implementar uma única instrução de GPU (causando restrição de tamanho físico, usando mais energia e produzindo mais calor).

A CPU é projetada para executar uma única instrução em um único dado, o mais rápido possível. Como só precisa trabalhar com um único datum, o número de transistores necessário para implementar uma única instrução é muito menor do que uma CPU pode ter um conjunto de instruções maior, uma ULA mais complexa, uma previsão de filial melhor, melhor virtualizada. arquitetura e esquemas de caching / pipeline mais sofisticados. Seus ciclos de instrução também são mais rápidos.

A razão pela qual ainda estamos usando a CPU é não porque o x86 é o rei da arquitetura da CPU e o Windows é escrito para x86, a razão pela qual ainda estamos usando a CPU é porque o tipo de tarefas que um sistema operacional precisa fazer, ou seja, tomar decisões, é executado com mais eficiência na arquitetura da 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 é facilmente paralelizado, 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 ficam menores, a GPU pode se dar ao luxo de implementar instruções mais complexas.


245



Esta é provavelmente a melhor resposta aqui. É importante entender as diferenças fundamentais entre os dois paradigmas. Para GPUs ultrapassar CPUs, considerando as cargas de trabalho de hoje, significa essencialmente que uma GPU deve se transformar em uma CPU. E assim a questão é a resposta. - surfasb
1 para esta sendo a melhor resposta. Tanto esta quanto a resposta aceita estão corretas, mas esta é uma explicação muito mais clara.
Estou surpreso que ninguém neste segmento mencionou a sobrecarga de envio de dados para a GPU - a largura de banda limitada sobre os barramentos PCI-Express faz com que algumas operações paralelas em uma GPU sejam muito mais lentas do que as realizadas na CPU. Um caso simples pode ser visto onde a variação do tamanho de uma FFT fez uma diferença significativa no desempenho em GPU vs. CPU devido à sobrecarga de envio de dados, configuração de um contexto, leitura dos resultados: stackoverflow.com/a/8687732/303612 Operações menores podem ser realizadas em cache nas CPUs, e a largura de banda da memória é muito superior à arquitetura atual do PCI-E - Dr. Andrew Burnett-Thompson
@ Dr.AndrewBurnett-Thompson: isso é porque isso é irrelevante para a questão. Atualmente, a GPU é considerada uma unidade de processamento auxiliar, por isso a movimentação de dados de / para uma GPU é necessária e cara. Se tratarmos a GPU como a unidade de processamento de primeira classe, não haverá necessidade de empacotar dados entre a memória principal e a memória da GPU. - Lie Ryan
Não otimista, não é sobrecarga de largura de banda zero. Se um processador com uma arquitetura GPU executa o show inteiro, não há nada que precise ser movido, a memória da GPU é a memória principal. Não há sobrecarga de transferência para ser falado em primeiro lugar porque não há transferências. Isso não é hipotético, a propósito, as APUs da AMD usam HSA (arquitetura de sistema heterogênea) com memória principal unificada que permite cópia zero entre a CPU e a GPU. - Lie Ryan


GPUs falta:

  1. Memória virtual (!!!)
  2. Meios de endereçamento de dispositivos que não sejam de memória (por exemplo, teclados, impressoras, armazenamento secundário, etc.)
  3. Interrupções

Você precisa deles para poder implementar qualquer coisa como um sistema operacional moderno.

Eles também são (relativamente) lentos em aritmética de precisão dupla (quando comparados com seu desempenho aritmético de precisão única) *, e são muito maiores (em termos de tamanho de silício). As arquiteturas de GPU mais antigas não suportam chamadas indiretas (através de ponteiros de função) necessárias para a maioria das programações de uso geral, e arquiteturas mais recentes que fazem isso lentamente. Por fim, (como outras respostas notaram), para tarefas que não podem ser paralelizadas, as GPUs perdem em comparação com as CPUs que receberam a mesma carga de trabalho.

EDITAR: Por favor, note que esta resposta foi escrita em 2011 - tecnologia GPU é uma área mudando constantemente. As coisas podem ser muito diferentes dependendo de quando você está lendo isso: P

* Algumas GPUs não são lentas na 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.


75



@Cicada: Você tem uma referência para isso? Em qualquer caso, mesmo que isso seja verdade, mesmo o hardware recente não terá um bom desempenho nesse caso. (por exemplo, não teria uma vantagem muito grande em relação a uma CPU - e uma desvantagem no consumo de energia) - Billy ONeal
Sim, os dispositivos Fermi, como você disse (com CUDA 4.0 e sm_20), suportam saltos indiretos (e, portanto, métodos virtuais C ++, herança, etc.). - Angry Lettuce
544 GigaFLOPS de uma GPU de US $ 300 2 anos de idade é lenta? - Ben Voigt
@Ben: Você só obtém esse tipo de desempenho em aplicativos paralelos de dados. Operações sequenciais gerais são um jogo de bola totalmente diferente. (Isso é apenas com todos os 1600 núcleos no chip funcionando em paralelo, executando essencialmente a mesma instrução repetidas vezes ... e até mesmo isso é teórico e não real) - Billy ONeal
@Billy: Mas isso é lentidão em uma classe particular de algoritmos, não lentidão na aritmética de precisão dupla (que é o que você reivindicou). (E as CPUs geralmente também não atingem as taxas de referência) - Ben Voigt


Uma CPU é como um trabalhador que é super rápido. Uma GPU é como um grupo de trabalhadores clones que trabalham rápido, mas que todos têm que fazer exatamente a mesma coisa em uníssono (com a exceção de que você pode deixar alguns clones inativos se quiser)

Qual você preferiria ter como seu colega desenvolvedor, um cara super rápido, ou 100 clones rápidos que não são realmente tão rápidos, mas todos têm que executar as mesmas ações simultaneamente?

Para algumas ações, os clones são muito bons, por ex. varrer o chão - cada um pode varrer uma parte dele.

Para algumas ações, os clones fedem, e. escreva o relatório semanal - todos os clones, mas um fica ocioso enquanto um clone escreve o relatório (senão você obtém 100 cópias do mesmo relatório).


37



Eu poderia até ter ... os dois? - Kevin Panko
@ Kevin: Sim, mas você precisaria de um computador com ambos uma CPU e uma GPU! Se ao menos houvesse tal coisa! - Joachim Sauer
Grande analogia. Vai lembrar disso. - Mayo


Porque as GPUs são projetadas para fazer um monte de pequenas coisas de uma vez, e as CPUs são projetadas para fazer uma coisa de cada vez. Se o seu processo puder ser massivamente paralelo, como o hashing, a GPU é muito mais rápida, caso contrário não será.

Sua CPU pode computar um hash muito, muito mais rápido do que sua GPU pode - mas o tempo que a sua CPU leva para fazer isso, sua GPU pode estar no meio de várias 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 rápido.

O problema é que CPUs e GPUs são soluções muito diferentes para problemas muito diferentes, há um pouco de 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 conseguiu, simplesmente porque uma GPU não é projetada para fazer o trabalho, e uma CPU é.

Uma pequena nota lateral, no entanto, se fosse possível descartar a CPU e ter apenas uma GPU, você não acha que a gente mudaria o nome? :)


23



Eu acho que os processadores mais modernos são projetados para fazer 2, 4 ou 8 coisas ao mesmo tempo. - danielcg
@ danielcg25: E a maioria das GPUs modernas são projetadas para fazer 256, 512, 1024 coisas ao mesmo tempo (a GTX 680 tem 1536 Núcleos CUDA). Cada núcleo de CPU individual é uma entidade distinta conceitualmente, mas isso não é verdade para uma GPU. - Phoshi
@ danielcg25: Estou ciente, mas um comentário com um mal-entendido fundamental (embora intencional) sobre a resposta pode ser prejudicial se alguém a estiver lendo sem já saber o tópico. "Ser burro" nesse sentido não é muito apreciado no SE, pois diminui a relação sinal / ruído. - Phoshi
Eu estava apenas fornecendo algumas informações. A maioria dos computadores atualmente é capaz de processar 2-8 coisas ao mesmo tempo. Alguns processadores podem fazer até mais do que isso. Ainda não chega perto de GPUs que fazem centenas de coisas ao mesmo tempo. - danielcg
@ danielcg25: É um tipo diferente de processamento, no entanto, sobre a questão. Cada núcleo da CPU é efetivamente separado, trabalhando com seus próprios pedaços de dados e seus próprios processos. Cada núcleo da CPU executa uma tarefa separada e diferente entre si, e eles não escalam linearmente para cima - um octo-core não é duas vezes tão útil quanto um quad core não é duas vezes mais útil que um dual core. Os núcleos de GPU, por outro lado, executam a mesma tarefa em diferentes partes de dados e dimensionam linearmente. É óbvio que existem CPUs multi-core, mas Isto não é a mesma coisa. - Phoshi


Você está realmente perguntando Por que não estamos usando arquiteturas como GPU na CPU?

A GPU é apenas uma CPU especializada de uma placa gráfica. Nós emprestamos computação não gráfica GPU porque a CPU de propósito geral não está em conformidade com a execução paralela e de ponto flutuante.

Na verdade, estamos usando diferentes arquiteturas de CPU (mais GPU-ish). Por exemplo. Niágara processadores são bastante multitarefa. SPARC T3 irá executar 512 threads simultâneas.


14



Por que um downvote? - jkj
Eu acho que a última linha, como é simplesmente falsa. Na verdade, só consigo pensar em um SO mainstream apenas x86; e até mesmo aquele foi portado para processadores alfa e ARM, mas não comercialmente oferecidos no momento. - Javier
Está bem. Removida a última seção que foi minha opinião sobre o suporte do sistema operacional mainstream impedindo a mudança para novas arquiteturas. Não pode estar no escopo da resposta. - jkj


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 da GPU ("core") tenha um espaço de endereçamento muito limitado em comparação a uma CPU.

  • Unidades de execução de GPU não podem lidar com ramificação de forma eficiente.

  • Unidades de execução de GPU não suportam interrupções de hardware da mesma forma que as CPUs.

Eu sempre pensei que o modo 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 uma série de operações sequenciais e depois cuspir outro bloco de dados. dados, enxaguar, 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 sequencial 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 estiverem tentando "analisar" os dados e tomar várias decisões com base no que são esses dados.

Esses "blocos de dados" podem ser 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 eficientemente paralelizada e a GPU não é necessariamente a melhor solução para ela. Um bom exemplo é processar coisas baseadas em "eventos externos", como teclado, joystick ou entrada de rede. Não há muitas coisas que não se encaixam nesse modelo, mas sempre haverá algumas.


11



Bom ponto sobre a otimização de previsão de ramificação - eu nunca teria considerado isso, mas você está certo. - Jimmy Breck-McKye