Quando devo descarregar o trabalho para uma GPU em vez da CPU?

14

Novos sistemas como o OpenCL estão sendo feitos para que possamos executar mais e mais códigos em nossos processadores gráficos, que faz sentido, porque devemos ser capazes de utilizar o máximo de energia possível em nossos sistemas.

No entanto, com todos esses novos sistemas, parece que as GPUs são melhores que as CPUs em todas as formas . Como as GPUs podem fazer cálculos paralelos, as GPUs multi-core na verdade parecem ser muito melhores do que as CPUs com vários núcleos; você seria capaz de fazer muitos cálculos de uma vez e realmente melhorar a velocidade. Ainda existem certos casos em que o processamento serial ainda é melhor, mais rápido e / ou mais eficiente que o paralelo?

    
por RétroX 11.09.2011 / 16:45
fonte

7 respostas

26

However, with all of these new systems, it seems as if GPUs are better than CPUs in every way.

Este é um mal entendido fundamental. Os atuais núcleos de GPU ainda são limitados em comparação aos atuais CPUs de primeira linha. Eu acho que a arquitetura Fermi da NVIDIA é a GPU mais poderosa atualmente disponível. Ele tem apenas registros de 32 bits para aritmética inteira e menos capacidade para predição de ramificação e execução especulativa do que um processador Intel de commodity atual. Os chips Intel i7 fornecem três níveis de cache, os núcleos Fermi têm apenas dois, e cada cache no Fermi é menor que o cache correspondente no i7. A comunicação entre processos dos núcleos da GPU é bastante limitada e seus cálculos precisam ser estruturados para acomodar essa limitação (os núcleos são agrupados em blocos e a comunicação entre os núcleos em um bloco é relativamente rápida, mas a comunicação entre os blocos é lenta). p>

Uma limitação significativa das GPUs atuais é que todos os núcleos precisam estar executando o mesmo código. Ao contrário dos núcleos em sua CPU, você não pode dizer a um núcleo de GPU para executar seu cliente de e-mail e outro núcleo para executar seu servidor da web. Você dá à GPU a função de inverter uma matriz, e todos os núcleos executam essa função em diferentes bits de dados.

Os processadores da GPU vivem em um mundo isolado. Eles podem controlar a exibição, mas não têm acesso ao disco, à rede ou ao teclado.

O acesso ao sistema GPU tem custos gerais substanciais. A GPU tem sua própria memória, portanto, seus cálculos serão limitados à quantidade de memória na placa GPU. A transferência de dados entre a memória da GPU e a memória principal é relativamente cara. Pragmaticamente, isso significa que não há nenhum benefício em entregar um punhado de cálculos curtos da CPU para a GPU, porque os custos de configuração e desmontagem afetarão o tempo necessário para fazer o cálculo.

A conclusão é que as GPUs são úteis quando você tem muitas (como centenas ou milhares) de cópias de um cálculo longo que pode ser calculado em paralelo. Tarefas típicas para as quais isso é comum são computação científica, codificação de vídeo e renderização de imagem. Para um aplicativo como um editor de texto, a única função em que uma GPU pode ser útil é renderizar o tipo na tela.

    
por 11.09.2011 / 21:38
fonte
11

As GPUs não são processadores generalistas do jeito que as CPUs são. Eles se especializam em fazer uma coisa muito específica - aplicando o mesmo código a uma grande quantidade de dados - e o fazem muito, muito bem, muito melhor do que uma CPU. Mas a maioria da maioria dos aplicativos não se destina a aplicar o mesmo código a uma grande quantidade de dados; trata-se de um loop de eventos: aguardar por entrada, ler a entrada, agir sobre ela e esperar por mais entradas. Isso é um processo bastante serial, e as GPUs sugam "serial".

Quando você tem uma grande quantidade de dados que precisa processar, e cada item pode ser processado em paralelo, independentemente dos outros, vá em frente e envie para a GPU. Mas não pense nisso como "o novo paradigma" em que tudo tem que ser espremido.

Esta questão está marcada como "otimização", então lembre-se de tratá-la como uma. Aplique a otimização da GPU onde o teste e o perfil revelam que a otimização é necessária e a natureza da tarefa é tal que a otimização da GPU pode ser aplicada. Caso contrário, não se incomode com isso, pois isso seria uma otimização prematura ou incorreta, o que causa mais problemas do que consertos.

    
por 11.09.2011 / 21:17
fonte
8

A resposta simples é que uma GPU funciona melhor quando você precisa fazer um cálculo razoavelmente pequeno em cada um de um grande número de itens. Para realizar muito dessa maneira, o cálculo de cada item deve ser independente dos cálculos para os outros itens. Se houver (normalmente) alguma dependência entre um item e outro, você geralmente precisará descobrir alguma maneira de quebrá-lo antes de obter muito da execução desse código na GPU. Se a dependência não puder ser quebrada, ou exigir muito trabalho para quebrar, o código poderá ser executado mais rapidamente na CPU.

As CPUs mais atuais também suportam vários tipos de operações que as GPUs atuais simplesmente não tentam suportar (por exemplo, proteção de memória para multitarefa).

Olhando de uma direção um pouco diferente, as CPUs foram (em grande parte) projetadas para serem razoavelmente convenientes para programadores, e as pessoas de hardware fizeram o melhor (e melhor que seja!) para criar hardware que mantém isso. modelo conveniente para o programador, mas ainda executa o mais rápido possível.

As GPUs vêm da direção oposta: elas são projetadas em grande parte para serem convenientes para o projetista de hardware, e coisas como o OpenCL tentaram fornecer um modelo de programação tão razoável quanto possível, dadas as restrições do hardware. / p>

Escrever código para ser executado em uma GPU normalmente leva mais tempo e esforço (por isso, vai custar mais) do que fazer o mesmo na CPU. Como tal, isso faz sentido principalmente quando / se:

  1. O problema é tão paralelo que você pode esperar um grande ganho com esforço mínimo ou
  2. O ganho de velocidade é tão importante que justifica muito trabalho extra.

Existem algumas possibilidades óbvias para cada um - mas um número enorme de aplicativos claramente não chega nem perto de nenhum deles. Eu ficaria muito surpreso em ver (por exemplo) um aplicativo CRUD rodando em uma GPU em breve (e se isso acontecer, provavelmente acontecerá porque alguém partiu com o objetivo exato em mente, não necessariamente qualquer coisa que se aproximasse de um ideal relação custo / benefício).

A realidade é que para muitos aplicativos (estou tentado a dizer "mais"), um processador típico é muito mais rápido que o necessário, e a conveniência de programação (levando a coisas como desenvolvimento mais fácil de novos recursos) é < em> muito mais importante que a velocidade de execução.

    
por 11.09.2011 / 20:15
fonte
3

you'd be able to do many calculations at once and really improve speed.

melhorar a velocidade? E daí? No ano passado, só me lembro de uma ou duas vezes quando era necessário. Na maioria das vezes, eu pedi para modificar ou consertar a lógica, para ajustar uma fonte de dados diferente, para melhorar a interação do usuário, etc. etc. A única velocidade clientes que estavam interessados nesses casos era a velocidade de fazer uma mudança. "Por favor, libere um novo recurso em um mês, ou melhor ainda - em duas semanas".

Não me entenda mal - como um codificador, eu gosto de apertar completamente os ticks da CPU. É só que essa arte não é tipicamente de alta demanda.

Are there still certain cases where serial processing is still better, faster, and/or more efficient than parallel?

Eu diria que há muitos casos. O processamento serial é mais simples que o paralelo, o que o torna mais eficiente em todos os casos em que a velocidade não é um requisito crítico. O processamento serial permite uma implementação mais fácil da lógica e interface do usuário complicadas, é mais fácil de especificar e testar, manter e alterar.

Como regra, o processamento serial permite uma expressão mais clara da intenção do programador e uma leitura mais fácil do código. Eu diria que salva o mais precioso e escasso recurso - o cérebro do programador.

    
por 11.09.2011 / 18:42
fonte
2

As CPUs ainda são mais versáteis. Por exemplo, as GPUs são mais eficientes que as CPUs em precisão única, mas não em precisão dupla. Há muito mais bibliotecas para CPUs do que para GPUs.

    
por 11.09.2011 / 18:11
fonte
2

A regra simples é, se o que você está fazendo pode ser expresso em termos de construções de álgebra linear e é tempo crítico, faça isso na GPU, caso contrário, use a CPU.

As GPUs não são como um grande número de CPUs, elas têm características de desempenho bastante diferentes.

    
por 11.09.2011 / 20:33
fonte
1

Se você precisa de processamento de números brutos, as GPUs são o caminho a percorrer. No entanto, todas essas ULAs significam que há menos transistores dedicados a controlar circuitos de fluxo (ramificação). Então, se você precisa escrever algo que precise de muito fluxo de controle complexo, muitas condicionais, etc., então a CPU será mais rápida.

    
por 12.09.2011 / 03:45
fonte