2011-07-10 13:31:41 +0000 2011-07-10 13:31:41 +0000
380
380

Porque é que ainda usamos CPUs em vez de GPUs?

Parece-me que hoje em dia são feitos muitos cálculos sobre a GPU. Obviamente os gráficos são feitos lá, mas usando CUDA e similares, IA, algoritmos de hashing (pense em bitcoins) e outros também são feitos na GPU. Porque não podemos simplesmente livrar-nos do CPU e usar a GPU por si só? O que torna a GPU muito mais rápida do que o CPU?

Respostas (15)

394
394
394
2011-07-10 14:00:49 +0000

TL;DR answer: As GPUs têm muito mais núcleos de processador do que as CPUs, mas como cada núcleo de GPU funciona significativamente mais lentamente do que um núcleo de CPU e não tem as funcionalidades necessárias para os sistemas operativos modernos, não são adequadas para efectuar a maior parte do processamento na computação diária. São mais adequados para operações de computação intensiva, tais como processamento de vídeo e simulações físicas.


GPGPU é ainda um conceito relativamente novo. As GPU foram inicialmente utilizadas apenas para renderizar gráficos; à medida que a tecnologia avançou, o grande número de núcleos nas GPU em relação às CPUs foi explorado através do desenvolvimento de capacidades computacionais para as GPUs, de modo a poderem processar muitos fluxos paralelos de dados em simultâneo, quaisquer que sejam esses dados. Embora as GPUs possam ter centenas ou mesmo milhares de processadores de fluxos, cada um deles corre mais lentamente do que um núcleo de CPU e tem menos funcionalidades (mesmo que sejam Turing complete e possam ser programadas para correr qualquer programa que uma CPU possa correr). As funcionalidades em falta nas GPUs incluem interrupções e memória virtual, que são necessárias para implementar um sistema operativo moderno.

Por outras palavras, as CPUs e GPUs têm arquitecturas significativamente diferentes que as tornam mais adequadas a diferentes tarefas. Uma GPU pode tratar grandes quantidades de dados em muitos fluxos, realizando operações relativamente simples sobre eles, mas não se adequa a um processamento pesado ou complexo num único ou em poucos fluxos de dados. Uma CPU é muito mais rápida por núcleo (em termos de instruções por segundo) e pode efectuar operações complexas num único ou em poucos fluxos de dados com maior facilidade, mas não pode tratar muitos fluxos em simultâneo.

Em consequência, as GPU não são adequadas para tratar tarefas que não beneficiam significativamente ou não podem ser paralelizadas, incluindo muitas aplicações de consumo comuns, tais como processadores de texto. Além disso, as GPUs utilizam uma arquitectura fundamentalmente diferente; seria necessário programar uma aplicação especificamente para uma GPU para que esta funcione, sendo necessárias técnicas significativamente diferentes para programar as GPUs. Estas diferentes técnicas incluem novas linguagens de programação, modificações das linguagens existentes e novos paradigmas de programação mais adequados para expressar um cálculo como uma operação paralela a ser realizada por muitos processadores de fluxo. Para mais informações sobre as técnicas necessárias para programar GPUs, consulte os artigos da Wikipedia em processamento de fluxo e computação paralela .

As GPUs modernas são capazes de executar operações vectoriais e aritméticas de ponto flutuante, com as mais recentes placas capazes de manipular números de ponto flutuante de dupla precisão. Estruturas como CUDA e OpenCL permitem escrever programas para GPUs, e a natureza das GPUs torna-as mais adequadas para operações altamente paralelas, como em computação científica, onde uma série de placas de computação especializadas em GPU pode ser um substituto viável para um pequeno cluster de computação como em NVIDIA Tesla Personal Supercomputers . Os consumidores com GPUs modernas e experientes no Folding@home podem utilizá-las para contribuir com clientes de GPU , que podem realizar simulações de dobragem de proteínas a velocidades muito elevadas e contribuir com mais trabalho para o projecto (não deixe de ler primeiro as FAQs , especialmente as relacionadas com GPUs). As GPUs podem também permitir uma melhor simulação física em jogos de vídeo usando PhysX, acelerar a codificação e descodificação de vídeo, e executar outras tarefas de computação intensiva. São estes tipos de tarefas que as GPUs são mais adequadas para executar.

AMD é pioneira no design de um processador chamado Accelerated Processing Unit (APU) que combina núcleos de CPU x86 convencionais com GPUs. Esta abordagem permite uma performance gráfica bastante superior às soluções gráficas integradas na motherboard (embora não corresponda a GPUs discretas mais caras), e permite um sistema compacto, de baixo custo e com boa performance multimédia sem a necessidade de uma GPU separada. Os mais recentes processadores Intel também oferecem gráficos integrados em chip, embora o desempenho competitivo da GPU integrada esteja actualmente limitado aos poucos chips com Intel Iris Pro Graphics. medida que a tecnologia continua a avançar, assistiremos a um grau crescente de convergência destas partes, outrora separadas. A AMD prevê um futuro em que a CPU e a GPU sejam uma só, capaz de trabalhar em conjunto na mesma tarefa .

No entanto, muitas tarefas executadas por sistemas operativos e aplicações PC são ainda mais adequadas às CPUs, sendo necessário muito trabalho para acelerar um programa utilizando uma GPU. Uma vez que tanto software existente utiliza a arquitectura x86, e porque as GPUs requerem diferentes técnicas de programação e faltam várias funcionalidades importantes necessárias para os sistemas operativos, é muito difícil uma transição geral de CPU para GPU para a computação diária.

257
257
257
2011-07-10 20:22:09 +0000

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

A GPU é não* mais rápida que a CPU. A CPU e a GPU foram concebidas com dois objectivos diferentes, com diferentes compensações, pelo que têm diferentes características de performance. Algumas tarefas são mais rápidas numa CPU enquanto outras são mais rápidas calculadas numa GPU. A CPU distingue-se por fazer manipulações complexas a um pequeno conjunto de dados, a GPU distingue-se por fazer manipulações simples a um grande conjunto de dados.

A GPU é uma CPU com objectivos especiais, concebida para que uma única instrução funcione sobre um grande bloco de dados (SIMD/Single Instruction Multiple Data), 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 porque há uma sobrecarga muito reduzida na descodificação das instruções, no entanto, trabalhar em blocos grandes significa que há mais unidades de trabalho paralelas, pelo que utiliza muito mais transístores para implementar uma única instrução GPU (causando restrições de tamanho físico, utilizando mais energia e produzindo mais calor).

A CPU foi concebida para executar uma única instrução num único bloco de dados o mais rapidamente possível. Como só precisa de trabalhar com um único datum, o número de transístores 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 ramo, uma melhor arquitectura virtualizada e um esquema de caching/pipeline mais sofisticado. Os seus ciclos de instrução também são mais rápidos.

A razão pela qual ainda estamos a usar CPU é não* porque x86 é o rei da arquitectura CPU e Windows é escrito para x86, a razão pela qual ainda estamos a usar CPU é porque o tipo de tarefas que um SO precisa de fazer, ou seja, tomar decisões, é executado de forma mais eficiente numa arquitectura de CPU. Um SO precisa de olhar para 100s de diferentes tipos de dados e tomar várias decisões que dependem umas das outras; este tipo de trabalho não é facilmente paralelo, pelo menos não numa arquitectura SIMD.

No futuro, o que veremos é uma convergência entre a arquitectura CPU e a arquitectura GPU, uma vez que a CPU adquire a capacidade de trabalhar sobre blocos de dados, e.g. SSE. Além disso, à medida que a tecnologia de fabrico melhora e os chips ficam mais pequenos, a GPU pode dar-se ao luxo de implementar instruções mais complexas.

77
77
77
2011-07-10 21:17:30 +0000

Falta de GPUs:

  1. Memória virtual (!!!!)
  2. Meios de endereçamento de outros dispositivos para além da memória (por exemplo, teclados, impressoras, armazenamento secundário, etc.)
  3. Interrupções

São necessários para poder implementar qualquer coisa como um sistema operativo moderno.

São também (relativamente) lentos na aritmética de precisão dupla (quando comparados com o seu desempenho aritmético de precisão única)*, e são muito maiores (em termos de tamanho de silício). As arquitecturas GPU mais antigas não suportam chamadas indirectas (através de apontadores de funções) necessárias para a maior parte da programação de uso geral, e arquitecturas mais recentes que o fazem de forma lenta. Finalmente, (como já foi referido noutras respostas), para tarefas que não podem ser paralelas, as GPUs perdem em comparação com as CPUs dada a mesma carga de trabalho.

EDIT : Note-se que esta resposta foi escrita em 2011 – a tecnologia GPU é uma área em constante mudança. As coisas podem ser muito diferentes dependendo de quando estiver a ler isto :P

* Algumas GPUs não são lentas na aritmética de dupla precisão, 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 estas não se encontram na maioria das máquinas dos consumidores.

39
39
39
2011-07-11 15:39:21 +0000

Um CPU é como um trabalhador que vai super rápido. Um GPU é como um grupo de trabalhadores clones que andam depressa, mas que têm todos de fazer exactamente a mesma coisa em uníssono (com a excepção de que pode ter alguns clones sentados em fila de espera se quiser)

Que preferia ter como seu colega de desenvolvimento, um tipo super rápido, ou 100 clones rápidos que não são realmente tão rápidos, mas todos têm de executar as mesmas acções em simultâneo?

Para algumas acções, os clones são bastante bons, por exemplo, varrem o chão - cada um pode varrer uma parte dele.

Para algumas acções, os clones cheiram mal, por exemplo, escrever o relatório semanal - todos os clones menos um ficam ociosos enquanto um clone escreve o relatório (caso contrário, só se obtêm 100 cópias do mesmo relatório).

24
24
24
2011-07-10 17:51:46 +0000

Porque as GPUs são concebidas para fazer muitas coisas pequenas ao mesmo tempo, e as CPUs são concebidas para fazer uma coisa de cada vez. Se o seu processo pode ser tornado maciçamente paralelo, como o hashing, a GPU é ordens de magnitude mais rápida, caso contrário não o será.

O seu CPU pode calcular um hash muito, muito mais rápido do que a sua GPU pode - mas o tempo que o seu CPU leva para o fazer, a sua GPU pode ser parte de várias centenas de hashes. As GPUs são concebidas para fazer muitas coisas ao mesmo tempo, e as CPUs são concebidas para fazer uma coisa de cada vez, mas muito rapidamente.

O problema é que as CPUs e as GPUs são soluções muito diferentes para problemas muito diferentes, há uma pequena sobreposição mas geralmente o que está no seu domínio permanece no seu domínio. Não podemos substituir o CPU por um GPU porque o CPU está ali sentado a fazer o seu trabalho muito melhor do que um GPU alguma vez poderia fazer, simplesmente porque um GPU não foi concebido para fazer o trabalho, e um CPU está.

Uma pequena nota lateral, no entanto, se fosse possível eliminar o CPU e ter apenas um GPU, não acha que lhe daríamos um novo nome? :)

15
15
15
2011-07-10 17:57:36 +0000

Está realmente a perguntar por que não estamos a utilizar arquitecturas de GPU como as arquitecturas em CPU?

GPU é apenas um CPU especializado de uma placa gráfica. Nós emprestamos computação não gráfica com GPU porque as CPU de uso geral não estão à altura da execução em paralelo e em ponto flutuante.

Na verdade estamos a usar diferentes arquitecturas de CPU (mais parecidas com GPU). Por exemplo Niagara processadores são bastante multitarefa. O SPARC T3 irá executar 512 threads simultâneos.

12
12
12
2011-07-10 15:55:56 +0000

Posso estar horrivelmente enganado aqui, e estou a falar de pouca ou nenhuma autoridade sobre o assunto, mas aqui vai:

  • creio que cada unidade de execução GPU (“core”) tem um espaço de endereçamento muito limitado em comparação com uma CPU.

  • as unidades de execução GPU não conseguem lidar com a ramificação de forma eficiente.

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

Sempre pensei que a forma como as unidades de execução GPU foram concebidas é algo parecida com a Playstation 3 “SPEs”, elas querem receber um bloco de dados, executar uma série de operações sequenciais sobre ele, e depois cuspir outro bloco de dados, enxaguar, repetir. Não têm tanta memória endereçável como a principal “CPE”, mas a ideia é 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 a tentar “analisar” os dados e tomar um monte de decisões com base no que são esses dados.

Estes “blocos de dados” podem fazer parte de um “streaming”, tal como uma lista de vértices da tabela de estado de um jogo, dados MPEG de um disco, etc.

Se algo não se encaixa neste modelo de “streaming” então 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 haverá sempre algumas.

7
7
7
2011-07-12 04:36:14 +0000

Isto é nada sobre a velocidade do relógio ou a sua finalidade. Ambos são igualmente capazes de completar a maioria, se não todas as tarefas; no entanto alguns são ligeiramente mais adequados para algumas tarefas do que outros.

Tem havido um muito velho argumento sobre se é melhor ter muitos núcleos burros ou um pequeno grupo de núcleos muito inteligentes. Isto remonta facilmente aos anos 80.

Dentro de um CPU há muitos cálculos possíveis que podem ser feitos. Os núcleos mais inteligentes são capazes de efectuar muitos cálculos diferentes ao mesmo tempo (como os multi-core mas não, é complicado; ver Instruction-level parallelism ). Um núcleo inteligente pode efectuar vários cálculos ao mesmo tempo (adicionar, subtrair, multiplicar, dividir, funcionamento de memória), mas apenas um de cada vez; devido a este facto, são fisicamente maiores (e por conseguinte muito mais caros) do que os núcleos mais burros.

Um núcleo burro é muito mais pequeno e por conseguinte pode ser adicionado mais a um único chip, mas não são capazes de efectuar tantos cálculos em simultâneo. Há um bom equilíbrio entre muitos núcleos burros e alguns núcleos inteligentes.

As arquitecturas multi-core funcionam bem com gráficos porque os cálculos podem ser facilmente divididos por 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.

Esta é uma questão much mais complicada do que possa parecer. Para mais informações, leia este artigo sobre design de CPU:

Modern Microprocessadores - A 90 Minute guide

http://www.lighterra.com/papers/modernmicroprocessors/

6
6
6
2011-07-15 11:44:05 +0000

Gostaria de abordar um ponto sintáctico: Os termos CPU e GPU são nomes funcionais e não nomes arquitectónicos.

Se um computador utilizasse uma GPU como processador principal, tornar-se-ia então uma “unidade central de processamento” (CPU), independentemente da arquitectura e do design.

5
5
5
2011-07-10 14:57:18 +0000

É importante ter em mente que não existe uma linha divisória mágica no espaço da arquitectura que faça de um processador o “central” e de outro o “gráfico”. (Bem, algumas GPUs podem ser demasiado aleijadas para serem totalmente gerais, mas não são essas que estamos a falar aqui)

A distinção é uma das formas como são instaladas na placa e quais as tarefas que lhes são atribuídas. Claro que usamos um processador de uso geral (ou conjunto de processadores de uso geral) para o principal movimentador de dados, e uma unidade especial, paralela e profundamente encanada para coisas (como gráficos) para melhor tirar partido delas.

A maioria dos truques que têm sido usados para fazer com que as GPUs façam as suas coisas muito rapidamente foram desenvolvidos por pessoas que tentam fazer CPUs mais rápidas e melhores. Acontece que Word e Excel e Netscape e muitas outras coisas para as quais as pessoas usam os seus computadores não só não tiram o máximo partido das funcionalidades oferecidas pelos chips gráficos especializados, como até rodam slower nessas arquitecturas porque ramificam muito causa (muito caro e lento) a limpeza da linha de tubos.

3
3
3
2015-06-07 11:53:13 +0000

A razão pela qual continuamos a utilizar CPUs é que tanto as CPUs como as GPUs têm as suas vantagens únicas. Ver o meu documento seguinte, aceite nos Inquéritos de Computação ACM 2015, que proporciona uma discussão conclusiva e abrangente sobre a passagem do “debate CPU vs GPU” para a “computação colaborativa CPU-GPU”. A Survey of CPU-GPU Heterogeneous Computing Techniques

3
3
3
2011-07-17 16:44:16 +0000

Por uma razão simples: a maioria das aplicações não são multi-roscas/vectoriais.

As placas gráficas dependem fortemente da multi-rosca, pelo menos no conceito.

Compare um automóvel com um único motor, um automóvel com um motor mais pequeno por roda. Com este último carro, é necessário comandar todos os motores, algo que não foi tido em conta para um ponto de vista de programação do sistema.

Com a fusão AMD, no entanto, vai mudar a forma como vamos precisar de fazer uso da potência de processamento: ou vetorizada, ou rápida para uma rosca.

3
3
3
2011-07-10 21:35:07 +0000

O objectivo da existência de uma GPU era aliviar a CPU dos cálculos gráficos caros que estava a fazer na altura. Ao combiná-los novamente com um único processador, voltar-se-ia ao ponto de partida.

2
2
2
2016-07-01 11:46:23 +0000

gpus são bons processadores de stream. pode pensar no processamento de stream como multiplicação sequencial de um longo conjunto de números. cpus também tem capacidades de processamento de stream (chama-se extensões SIMD) mas não pode implementar toda a lógica de programação como processamento de stream, e os compiladores têm a opção de criar btyecode que faz uso de instruções simd sempre que possível.

nem tudo é um conjunto de números. imagens e vídeos são, talvez também som (há codificadores opencloders aqui e ali). Por isso o gpus pode processar, codificar e descodificar imagens, vídeos e qualquer coisa semelhante. uma desvantagem é que não se pode descarregar tudo para o gpus em jogos porque isso criaria gaguez, o gpus está ocupado com gráficos e é suposto ser o gargalo do sistema quando se joga jogos. a solução óptima seria utilizar totalmente todos os componentes de um pc. assim, por exemplo, o motor de física da nvidia, por defeito, faz cálculos no cpu quando o gpu é totalmente utilizado.

2
2
2
2015-11-16 15:42:30 +0000

Se colocar simplesmente GPU pode ser comparado com reboque no carro. Como normalmente a bagageira é suficiente para a maioria das pessoas, excepto nos casos em que compram algo realmente grande. Então eles podem precisar de reboque. O mesmo acontece com a GPU, pois normalmente é suficiente ter uma CPU comum que irá realizar a maioria das tarefas. Mas se precisar de alguns cálculos intensivos em muitos tópicos, então pode precisar de GPU