Pelo meu entendimento, as pessoas começaram a usar GPUs para computação em geral porque são uma fonte extra de poder de computação. E, embora não sejam tão rápidos quanto uma CPU para cada operação, eles têm muitos núcleos, para que possam ser melhor adaptados ao processamento paralelo do que uma CPU. Isso faz sentido se você já possui um computador que possui uma GPU para processamento gráfico, mas não precisa dos gráficos e gostaria de ter mais poder computacional. Mas também entendo que as pessoas compram GPUs especificamente para adicionar poder de computação, sem intenção de usá-las para processar gráficos. Para mim, isso parece semelhante à seguinte analogia:
Preciso cortar minha grama, mas meu cortador de grama está fraco. Então, retiro a gaiola do ventilador da caixa que mantenho no meu quarto e afio as lâminas. Coloco a fita adesiva no cortador de grama e acho que funciona razoavelmente bem. Anos depois, sou o diretor de compras de uma grande empresa de jardinagem. Eu tenho um orçamento considerável para gastar em implementos de corte de grama. Em vez de comprar cortadores de grama, compro um monte de ventiladores de caixa. Mais uma vez, eles funcionam bem, mas tenho que pagar por peças extras (como a gaiola) que não acabarei usando. (para os fins desta analogia, devemos assumir que os cortadores de grama e ventiladores de caixa custam aproximadamente o mesmo)
Então, por que não existe mercado para um chip ou dispositivo que tenha o poder de processamento de uma GPU, mas não a sobrecarga de gráficos? Eu posso pensar em algumas explicações possíveis. Qual deles, se houver, está correto?
- Essa alternativa seria muito cara de desenvolver quando a GPU já é uma boa opção (os cortadores de grama não existem, por que não usar esse ventilador de caixa perfeitamente bom?).
- O fato de 'G' representar gráficos indica apenas o uso pretendido e não significa realmente que qualquer esforço seja feito para adaptar melhor o chip ao processamento gráfico do que qualquer outro tipo de trabalho (cortadores de grama e ventiladores de caixa são a mesma coisa quando você vai direto ao ponto; não são necessárias modificações para que uma funcione como a outra).
- As GPUs modernas têm o mesmo nome de seus antecessores antigos, mas hoje em dia as mais sofisticadas não são projetadas para processar gráficos especificamente (os ventiladores de caixa modernos são projetados para funcionar principalmente como cortadores de grama, mesmo que os mais antigos não fossem).
- É fácil traduzir praticamente qualquer problema para o idioma do processamento gráfico (a grama pode ser cortada soprando o ar rapidamente).
EDITAR:
Minha pergunta foi respondida, mas com base em alguns comentários e respostas, acho que devo esclarecer minha pergunta. Não estou perguntando por que todo mundo não compra seus próprios cálculos. Claramente, isso seria muito caro na maioria das vezes.
Simplesmente observei que parece haver uma demanda por dispositivos que possam executar rapidamente cálculos paralelos. Fiquei me perguntando por que parece que o dispositivo ideal é a Unidade de processamento gráfico, em oposição a um dispositivo projetado para esse fim.
Respostas:
É realmente uma combinação de todas as suas explicações. Mais barato e fácil, já existe, e o design mudou dos gráficos puros.
Uma GPU moderna pode ser vista principalmente como processadores de fluxo com algum hardware gráfico adicional (e alguns aceleradores de função fixa, por exemplo, para codificação e decodificação de vídeo). Atualmente, a programação da GPGPU usa APIs projetadas especificamente para esse fim (OpenCL, Nvidia CUDA, AMD APP).
Nas duas últimas décadas, as GPUs evoluíram de um pipeline de função fixa (basicamente apenas gráficos) para um pipeline programável ( shaders permitem que você escreva instruções personalizadas) para APIs mais modernas, como o OpenCL, que fornecem acesso direto aos núcleos do shader sem o acompanhamento de pipeline de gráficos.
Os bits gráficos restantes são menores. Eles representam uma parte tão pequena do custo do cartão que não é significativamente mais barato deixá-los de fora, e você incorre no custo de um design adicional. Portanto, isso geralmente não é feito - não há equivalente orientado à computação da maioria das GPUs - exceto nas camadas mais altas, e essas são bastante caras.
As GPUs normais para "jogos" são muito usadas porque economias de escala e relativa simplicidade as tornam baratas e fáceis de começar. É um caminho bastante fácil da programação gráfica para acelerar outros programas com o GPGPU. Também é fácil atualizar o hardware, pois estão disponíveis produtos mais novos e mais rápidos, ao contrário das outras opções.
Basicamente, as opções se resumem a:
fonte
Minha analogia favorita:
O que você usa depende da sensibilidade ao custo, do grau em que uma tarefa é paralelizável e de outros fatores. Por causa do desempenho do mercado, as GPUs são a melhor opção para as aplicações mais paralelas e as CPUs são a melhor escolha quando a energia e o custo unitário são as principais preocupações.
Diretamente à sua pergunta: por que uma GPU sobre um ASIC / FPGA? Geralmente custo. Mesmo com os preços inflacionados de hoje da GPU, ainda é (geralmente) mais barato usar uma GPU do que projetar um ASIC para atender às suas necessidades. Como @ user912264 aponta, existem tarefas específicas que podem ser úteis para ASICs / FPGAs. Se você tiver uma tarefa única e se beneficiará da escala, pode valer a pena projetar um ASIC / FPGA. De fato, você pode criar / comprar / licenciar projetos de FPGA especificamente para esse fim. Isso é feito para alimentar os pixels em TVs de alta definição, por exemplo.
fonte
Sua analogia é ruim. Na analogia, quando você compra equipamentos para uma grande empresa de tratamento de grama, você supõe que existem bons cortadores de grama disponíveis. Este não é o caso no mundo da computação - as GPUs são a melhor ferramenta prontamente disponível.
Os custos de P&D e os possíveis ganhos de desempenho de um chip especializado provavelmente são altos demais para justificar a sua fabricação.
Dito isso, estou ciente da Nvidia lançando algumas GPUs especificamente para computação de uso geral - elas não tinham saídas de vídeo - um pouco como vender ventiladores de caixa com as gaiolas já removidas.
fonte
Obviamente, você pode usar chips especializados, seja para eficiência de energia ou velocidade de cálculo. Deixe-me contar a história da mineração de Bitcoin:
Portanto, não, não há motivos para usar uma GPU em vez de uma "calculadora gigante" especializada. Quanto maiores os incentivos econômicos, mais o hardware se especializa. No entanto, eles são muito difíceis de projetar e inviáveis de fabricar, se você não estiver produzindo milhares de uma só vez. Se não for viável projetar chips, você pode comprar um desses no Walmart mais próximo.
TL; DR Claro que você pode usar chips mais especializados.
fonte
O que você descreve em sua analogia é exatamente o que aconteceu. Assim que você pegou seu ventilador e afiou as lâminas para tentar usá-lo como um cortador de grama, um grupo de pesquisas percebeu "Ei, temos uma unidade de processamento de vários núcleos bastante agradável aqui, vamos tentar usá-lo para cálculos de uso geral! "
O resultado foi bom e a bola começou a rolar. A GPU passou de um dispositivo somente gráfico para dar suporte à computação de uso geral para ajudar nas situações mais exigentes.
De qualquer maneira, a operação mais exigente em termos computacionais que esperamos dos computadores são gráficos. É o suficiente para dar uma olhada nos avanços impressionantes de como os jogos são hoje em comparação com o que eles fizeram apenas alguns anos atrás. Isso significa que muito esforço e dinheiro foram investidos no desenvolvimento das GPUs, e o fato de elas também poderem ser usadas para acelerar uma certa classe de computação de uso geral (isto é, extremamente paralela) acaba de aumentar sua popularidade.
Portanto, em conclusão, a primeira explicação que você oferece é a mais precisa:
GPUs onde já existem, estão prontamente disponíveis para todos e eles trabalharam.
fonte
Especificamente, as GPUs não são "núcleos" no sentido de "paralelismo de tarefas". Na maioria das vezes, é na forma de "paralelismo de dados". SIMD é "instrução única de múltiplos dados". O que isso significa é que você não faria isso:
for parallel i in range(0,1024): c[i] = a[i] * b[i]
Isso significa que você tem 1024 indicadores de instruções, todos executando tarefas separadas, progredindo a taxas diferentes. O SIMD ou "computação vetorial" executará instruções em matrizes inteiras de uma só vez, mais ou menos assim:
c = a * b
Os "loops" estão nas instruções "*" e "=", e não fora das instruções. O acima faria isso para todos os 1024 elementos ao mesmo tempo, no mesmo ponteiro de instrução para todos eles. É como ter três registros enormes para a, bec. O código SIMD é extremamente restrito e só funciona bem para problemas que não são excessivamente "ramificados".
Em casos realistas, esses valores SIMD não são tão grandes quanto 1024 itens. Imagine uma variável que é uma gangue de int32 unidas. Você pode pensar na multiplicação e atribuir como uma instrução real da máquina.
int32_x64 c; int32_x64 b; int32_x64 a; c = b * a;
GPUs reais são mais complicadas que o SIMD, mas essa é a essência delas. É por isso que você não pode simplesmente lançar um algoritmo aleatório da CPU em uma GPU e esperar uma aceleração. Quanto mais instruções ramificando o algoritmo, menos apropriado é para uma GPU.
fonte
As outras respostas aqui são muito boas. Vou jogar meus 2 centavos também.
Uma razão pela qual as CPUs se tornaram tão difundidas é que são flexíveis. Você pode reprogramar para uma variedade infinita de tarefas. Atualmente, é mais barato e mais rápido para as empresas que produzem produtos colocarem uma pequena CPU ou microcontrolador em algo e programam sua funcionalidade do que desenvolver circuitos personalizados para realizar a mesma tarefa.
Usando o mesmo dispositivo que outros, você pode tirar proveito das soluções conhecidas para problemas usando o mesmo dispositivo (ou similar). E à medida que a plataforma amadurece, suas soluções evoluem e se tornam muito maduras e otimizadas. As pessoas que codificam nesses dispositivos também adquirem experiência e se tornam muito boas em seu ofício.
Se você criar um novo tipo de dispositivo a partir do zero, uma alternativa a uma GPU, levaria anos para que até os primeiros adotantes se tornassem bons em saber como usá-lo. Se você anexar um ASIC à sua CPU, como otimizar a computação de descarregamento nesse dispositivo?
A comunidade de arquitetura de computadores está em choque com essa idéia há vários anos (obviamente já era popular antes, mas recentemente viu um renascimento). Esses 'aceleradores' (seus termos) têm graus variados de reprogramação. O problema é: com que precisão você define o escopo do problema que seu acelerador pode resolver? Até conversei com algumas pessoas que estavam trabalhando na criação de um acelerador usando circuitos analógicos com amplificadores operacionais para calcular equações diferenciais. Ótima idéia, mas com escopo extremamente estreito.
Depois de ter um acelerador ativo, as forças econômicas decidirão seu destino. A inércia do mercado é uma força incrível. Mesmo que algo seja uma ótima idéia, é economicamente viável refatorar suas soluções de trabalho para usar esse novo dispositivo? Talvez talvez não.
As GPUs são realmente horríveis para certos tipos de problemas, então muitas pessoas / empresas estão trabalhando em outros tipos de dispositivos. Mas as GPUs já estão tão entrincheiradas, seus dispositivos se tornarão economicamente viáveis? Eu acho que vamos ver.
Edit: Expandindo um pouco a minha resposta, agora que estou fora do ônibus.
Um estudo de caso preventivo é o projeto Intel Larrabee. Começou como um dispositivo de processamento paralelo que podia gerar gráficos em software; não possuía hardware gráfico especializado. Conversei com alguém que trabalhou no projeto, e um dos principais motivos pelos quais eles disseram que ele falhou e foi cancelado (além de horríveis políticas internas) foi que eles simplesmente não conseguiram que o compilador produzisse um bom código para ele. É claro que produziu código funcional, mas se todo o objetivo do seu produto é o desempenho máximo, é melhor ter um compilador que produza um código ideal. Isso remete ao meu comentário anterior sobre a falta de conhecimento profundo em hardware e software, pois o seu novo dispositivo é um grande problema.
Alguns elementos do design do Larrabee chegaram ao Xeon Phi / Intel MIC. Este produto chegou ao mercado. Ele foi totalmente focado em paralelizar cálculos científicos e outros tipos de HPC. Parece que é um fracasso comercial agora. Outra pessoa com quem conversei na Intel sugeriu que eles simplesmente não eram competitivos em preço / desempenho com as GPUs.
As pessoas tentaram integrar a síntese lógica de FPGAs aos compiladores, para que você possa gerar automaticamente código para seus aceleradores de FPGA. Eles não funcionam tão bem.
Um lugar que parece ser um solo realmente fértil para aceleradores ou outras alternativas às GPUs é a nuvem. A economia de escala que existe nessas grandes empresas como Google, Amazon e Microsoft faz o investimento em esquemas de computação alternativos valer a pena. Alguém já mencionou as unidades de processamento tensorial do Google. A Microsoft possui FPGAs e outras coisas em toda a infraestrutura do Bing e do Azure. A mesma história com a Amazon. É absolutamente sensato que a escala possa compensar seu investimento em tempo, dinheiro e lágrimas de engenharia.
Em resumo, a especialização está em desacordo com muitas outras coisas (economia, maturidade da plataforma, experiência em engenharia, etc.). A especialização pode melhorar significativamente seu desempenho, mas restringe o escopo ao qual seu dispositivo é aplicável. Minha resposta se concentrou em muitos aspectos negativos, mas a especialização também traz muitos benefícios. Absolutamente deve ser perseguido e investigado, e, como mencionei, muitos grupos o estão perseguindo de maneira bastante agressiva.
Desculpe, edite novamente: acho que sua premissa inicial está errada. Acredito que foi menos um caso de procurar fontes extras de poder computacional e mais um caso de pessoas reconhecendo uma oportunidade. A programação gráfica é muito pesada em álgebra linear, e a GPU foi projetada para executar com eficiência operações comuns como multiplicação de matrizes, operações vetoriais, etc. Operações que também são muito comuns à computação científica.
O interesse pelas GPUs começou assim que as pessoas reconheceram que as promessas feitas pelo projeto Intel / HP EPIC eram amplamente exageradas (finais dos anos 90 e início dos anos 2000). Não havia solução geral para a paralelização do compilador. Então, ao invés de dizer "onde encontramos mais poder de processamento, oh poderíamos tentar a GPU", acho que era mais "temos algo que é bom em cálculos paralelos, podemos tornar isso geralmente mais programável". Muitas pessoas envolvidas estavam na comunidade científica de computação, que já possuíam código Fortran paralelo que podiam executar em máquinas Cray ou Tera (o Tera MTA tinha 128 threads de hardware). Talvez tenha havido movimento de ambas as direções, mas só ouvi menções das origens do GPGPU nessa direção.
fonte
Um ASIC (silicone personalizado) é muito rápido, mas é muito caro para projetar e fabricar. O ASIC costumava ser específico para um propósito, e a CPU era uma abordagem que permitia que os computadores fossem "programados" para que tarefas de computação pudessem ser executadas por software. Os primeiros CPUs deram às pessoas a capacidade de tirar proveito do poder do ASIC sem o alto custo programando o chip em campo. Essa abordagem se tornou tão bem-sucedida que deu origem ao computador (muito) rápido que você está usando no momento.
Então, por que GPUs?
Em meados dos anos 90, o 3DFX percebeu que as tarefas de renderização em 3D eram tão específicas que um ASIC personalizado apresentava MUITO melhor desempenho que uma CPU. Eles criaram um coprocessador de computador que descarregava tarefas de renderização 3D da CPU para esse coprocessador, que eles chamavam de "GPU". A concorrência e a demanda do mercado levaram a inovação nesse espaço a um ponto em que as GPUs estavam realizando cálculos MUITO mais rápido que as CPUs, então surgiu a pergunta: "Por que não posso usar a GPU para processar meus números em vez da CPU?" Os fabricantes de GPU viram uma demanda e uma maneira de ganhar mais dinheiro, então começaram a alterar suas plataformas para permitir que os desenvolvedores usassem seu hardware. Mas o hardware do hardware era tão específico do propósito que havia, e ainda existem, limitações no que você pode pedir à GPU. Não vou entrar em detalhes sobre o porquê aqui.
Então, por que não havia mais silício para fins específicos? Por que apenas gráficos?
Duas razões: 1) Preço. As GPUs tinham um bom mercado e podiam justificá-lo, mas mesmo naquela época, era um risco enorme. Ninguém realmente sabia se o 3DFX poderia obter lucro (ao que parece, eles não podiam realmente e foram extintos). Mesmo agora, com o tamanho do mercado de GPU, existem realmente apenas três concorrentes. 2) as CPUs estavam realmente atendendo à necessidade de "silício personalizado" com extensões de instruções. Pense na MMX - essa foi realmente a tentativa da Intel de acelerar os gráficos na CPU, à medida que o 3DFX estava ganhando velocidade. Desde então, o conjunto de instruções x86 cresceu bastante para todas essas extensões personalizadas. Muitas dessas extensões faziam sentido na época (como a MMX), mas agora são em grande parte apenas um peso morto no processador. Você não pode removê-los, no entanto, porque isso quebra o software existente. Isto' s, na verdade, um dos pontos de venda do ARM - ARM é um conjunto de instruções simplificado. Não existem tantas extensões de instrução, mas isso torna o silício menor e mais barato de fabricar.
Parece-me que você poderia ganhar muito dinheiro se pudesse reduzir o custo do silicone personalizado. Ninguém está trabalhando nisso?
Existe uma tecnologia chamada FPGA - array de portas programável em campo, que existe desde os primeiros dias da computação. É essencialmente um microchip que você pode projetar "em campo" usando software. É uma tecnologia muito interessante, mas toda a estrutura necessária para tornar o chip programável consome MUITO silício e faz com que os chips funcionem em velocidades de clock muito mais baixas. Os FPGAs podem ser mais rápidos que os de CPU, se você tiver silício suficiente no chip E efetivamente paralelizar a tarefa. Mas eles são limitados em quanta lógica você pode colocar neles. Todos, exceto os FPGAs mais caros, eram mais lentos que os GPUs para a mineração de bitcoin, mas seus colegas do ASIC efetivamente encerraram a lucratividade da mineração de GPUs. Outras criptomoedas usaram algoritmos específicos que não podem ser paralelizados, portanto, FPGA e ASIC '
O principal limitador dos FPGAs é o tamanho do silício - quanta lógica você pode ajustar no chip? O segundo é a velocidade do relógio, porque é difícil otimizar itens como pontos quentes, vazamentos e conversas cruzadas em um FPGA. Os métodos de fabricação mais recentes minimizaram esses problemas, e a Intel se uniu à Altera para fornecer um FPGA que pode ser usado pelos engenheiros para aproveitar os benefícios do "silício personalizado" como co-processador em um servidor. Então está chegando, em certo sentido.
Os FPGAs serão substituídos por CPU e GPU?
Provavelmente não tão cedo. As mais recentes CPUs e GPUs são MASSIVAS e o silício é altamente ajustado para desempenho térmico e elétrico. Você não pode otimizar FPGAs da mesma maneira que um ASIC personalizado. Exceto por alguma tecnologia inovadora, a CPU provavelmente continuará sendo o núcleo do seu computador com coprocessadores FPGA e GPU.
fonte
De fato, existem placas especializadas para computação de alta velocidade, por exemplo, a Xilinx possui uma lista de 178 placas PCI-e usando seus FPGAs, e cerca de um terço dessas placas são "trituradoras de números" com um ou vários chips FPGA poderosos e muitos chips on-line. memória DDR da placa. Também existem placas DSP de alto desempenho ( exemplo ) destinadas a tarefas de computação de alto desempenho.
Eu acho que a popularidade das placas GPU decorre do seu objetivo em um grupo maior de clientes. Você não precisa investir em hardware especial para jogar com a Nvidia CUDA; assim, quando tiver uma tarefa que exija hardware especial, as GPUs da Nvidia terão uma vantagem competitiva em que você já sabe como programá-las.
fonte
Eu acho que a resposta para sua pergunta depende de como definir a computação de alto desempenho.
Em geral, o cálculo de alto desempenho está relacionado ao tempo de cálculo. Nesse caso, eu gosto de compartilhar o link do cluster de computação de alto desempenho .
O link é especificado o motivo do uso da GPU; O uso de placas gráficas (ou melhor, de suas GPUs) para fazer cálculos para computação em grade é muito mais econômico do que o uso de CPUs, apesar de ser menos preciso.
fonte
double
precisão de 64 bits , não apenas precisão de 32 bitsfloat
. (Algumas GPUs regulares economizam no HW paradouble
). Todos os principais fornecedores suportam a matemática IEEE FP (acho que mesmo com denormals). Portanto, não há perda de precisão, a menos que você deseje trocar precisão por desempenho, por exemplo, com FP de meia precisão de 16 bits, que possui uma taxa de transferência ainda melhor em alguns hardwares (e, claro, metade da largura de banda da memória). O código de alto desempenho nas CPUs também costuma usar 32 bitsfloat
, para obter o dobro de elementos por vetor SIMD e metade da largura de banda da memória.