Pergunta

Estou desenvolvendo um produto com pesado 3D computações gráficas, em grande medida mais próximas pesquisas pontuais e alcance . Alguns otimização de hardware seria útil. Enquanto eu sei pouco sobre isso, meu chefe (que não tem experiência software) defende FPGA (porque ele pode ser adaptado), enquanto o nosso desenvolvedor júnior defende GPGPU com CUDA, porque o seu barato, quente e aberto. Enquanto eu sinto que falta juízo nesta questão, acredito CUDA é o caminho a percorrer também porque eu estou preocupado com a flexibilidade, o nosso produto ainda está em desenvolvimento forte.

Assim, reformular a questão, existem razões para ir para FPGA em tudo? Ou há uma terceira opção?

Foi útil?

Solução

Eu investiguei a mesma pergunta uma volta enquanto. Depois de conversar com as pessoas que trabalharam em FPGAs, é isso que eu recebo:

  • FPGAs são grandes para sistemas de tempo real, onde até 1ms de atraso pode ser muito longo. Isto não se aplica no seu caso;
  • FPGAs pode ser muito rápido, espeically para o bem-definidos usos de processamento de sinal digital (por exemplo, dados de radar), mas os bons são muito mais caros e especializados do que GPGPUs mesmo profissionais;
  • FPGAs são bastante complicado para o programa. Desde há um componente de configuração de hardware para compilar, pode demorar horas. Parece ser mais adequado para engenheiros eletrônicos (que são geralmente os que trabalham em FPGAs) do que os desenvolvedores de software.

Se você pode fazer o trabalho CUDA para você, é provavelmente a melhor opção no momento. Certamente será mais flexível do que um FPGA.

Outras opções incluem Brook da ATI, mas até algo grande acontecer, simplesmente não é bem adotada como CUDA. Depois disso, ainda há toda as opções de HPC tradicionais (grupos de x86 / PowerPC / celular), mas todos eles são bastante caros.

Espero que ajude.

Outras dicas

Nós fizemos algumas comparações entre FPGA e CUDA. Uma coisa onde CUDA brilha se você pode realmente formular o seu problema de forma SIMD e pode acessar a memória se fundiram. Se os acessos de memória não são aglutinaram (1) ou se você tiver fluxo de controle diferentes em diferentes tópicos da GPU pode perder drasticamente o seu desempenho e o FPGA pode superar isso. Outra coisa é quando a operação é realtive pequeno, mas você tem uma enorme quantidade dela. Mas você não pode (por exemplo, devido à sincronização) não iniciá-lo em um loop em um kernel, em seguida, seus tempos de invocação para o kernel GPU excede o tempo de computação.

Além disso, o poder do FPGA poderia ser melhor (depende do seu scenarion aplicação, ou seja. A GPU só é mais barato (em termos de Watts / Flop) quando seu computar o tempo todo).

Offcourse o FPGA tem também alguns inconvenientes: IO pode ser um (que tivemos aqui uma aplicação foram precisávamos de 70 GB / s, não há problema para a GPU, mas para obter essa quantidade de dados em um FPGA que você precisa para o projeto convencional mais pinos do que disponível). Outra desvantagem é o tempo e dinheiro. A FPGA é muito mais caro do que o melhor dos tempos de desenvolvimento GPU e são muito elevados.

(1) simultanously acessa a partir de fios diferentes para a memória tem que ser para endereços sequenciais. Isso às vezes é muito difícil de alcançar.

Eu iria com CUDA.
Eu trabalho em processamento de imagem e têm tentado add-ons hardware durante anos. Primeiro tivemos i860, então Transputer, em seguida, DSP, então o FPGA e-direct-compiliation-to hardware.
O que innevitably aconteceu foi que no momento em que as placas de hardware foram realmente depurado e confiável eo código foi portado para eles - CPUs regulares tinha avançado para vencê-los, ou a arquitetura da máquina hospedagem mudou e nós não poderia usar as tábuas velhas, ou os fabricantes da placa foi à falência.

Por que adere a algo como CUDA você não está amarrado a um pequeno fabricante de especialista de placas FPGA. O performence de GPUs está melhorando mais rápido, então CPUs e é financiado pelos gamers. É uma tecnologia convencional e por isso provavelmente irá se fundir com CPUs multi-core no futuro e assim proteger o seu investimento.

FPGAs

  • O que você precisa:
    • Saiba VHDL / Verilog (e confiar em mim você não vai)
    • Comprar hw para testes, licenças de ferramentas de síntese
    • Se você escolher alguma estrutura bom (para ex:. RSOC )
      • desenvolver o projeto (e que pode levar anos)
    • Se você não fazer:
      • DMA, motorista hw, ultra ferramentas de síntese caros
      • toneladas de conhecimento sobre os autocarros, mapeamento de memória, hw síntese
      • construir o hw, comprar o ip núcleos
      • Desenvolver projeto
  • Por exemplo médio do cartão de FPGA PCIe com chips Xilinx Virtex-6 custos de mais de 3000 $
  • Resultado:
    • Se você não são pagos pelo governo não tem fundos suficientes.

GPGPU (CUDA / OpenCL)

  • Você já tem hw para testar.
  • Compare com coisas FPGA:
    • Tudo está bem documentado.
    • Tudo é barato
    • Tudo funciona
    • Tudo está bem integrado às linguagens de programação
  • Há GPU nuvem também.
  • Resultado:
    • Você precisa apenas download do SDK e você pode começar.
solução baseada em FPGA

é provável que seja muito mais caro do que CUDA.

Obviamente, esta é uma questão complexa. A questão também pode incluir o processador celular. E provavelmente não há uma única resposta que é correto para outras questões relacionadas.

Na minha experiência, qualquer implementação feito de forma abstrata, ou seja compilado implementação de alto nível nível da máquina linguagem vs., inevitavelmente terá um custo de desempenho, esp em uma implementação do algoritmo complexo. Isto é verdade tanto FPGA de e processadores de qualquer tipo. Um FPGA projetado especificamente para implementar um algoritmo complexo terá um desempenho melhor do que um FPGA cujo processamento elementos são genéricos, permitindo-lhe um grau de programação a partir de registros de controle de entrada, os dados de E / S etc.

Outro exemplo geral onde um FPGA pode ser muito maior desempenho é em processos em cascata, onde no processo de saídas tornam-se as entradas para o outro e que não pode ser feito simultaneamente. Cascata processos em um FPGA é simples, e pode requisitos de memória I / O dramaticamente mais baixas, enquanto a memória do processador será usada para efectivamente cascata de dois ou mais processos onde existem dependências de dados.

O mesmo pode ser dito de uma GPU e CPU. Algoritmos implementados em C execução em uma CPU desenvolvido sem levar em conta as características de desempenho inerentes a memória cache ou sistema memória principal não irá executar, bem como uma implementado que faz. Concedido, não considerando a implementação destas características de desempenho simplifica. Mas a um custo de desempenho.

Não tendo nenhuma experiência direta com a GPU, mas sabendo que seus problemas de desempenho do sistema de memória inerentes, também estará sujeito a problemas de desempenho.

Esta é uma discussão antiga começou em 2008, mas seria bom para contar o que aconteceu com a programação FPGA desde então: 1. C para portões em FPGA é o desenvolvimento mainstream para muitas empresas com economia de tempo enorme vs. Verilog / SystemVerilog HDL. Em C ao design portões nível do sistema é a parte mais difícil. 2. OpenCL em FPGA está lá para 4+ anos, incluindo ponto e implantação "nuvem" flutuando pela Microsoft (Asure) e Amazon F1 (Ryft API). Com o sistema OpenCL design é relativamente fácil por causa do modelo de memória muito bem definido e API entre os dispositivos de acolhimento e de computação.

folks software só precisa aprender um pouco sobre a arquitetura FPGA para ser capaz de fazer coisas que não são sequer possível com GPUs e CPUs para as razões de ambos sendo silício fixo e que não têm interfaces de banda larga (100 Gb +) para o mundo exterior. Dimensionamento para baixo geometria de chips não é mais possível, nem extrair mais calor do pacote de chip único sem derreter-lo, de modo que este parece ser o fim da estrada para chips de pacotes individuais. Minha tese aqui é que o futuro pertence a programação paralela de sistemas multi-chip, e FPGAs tem uma grande chance de estar à frente do jogo. Confira http://isfpga.org/ se você tem preocupações com o desempenho, etc.

CUDA tem uma base de código bastante substancial de exemplos e uma SDK , incluindo < a href = "http://www.nvidia.com/content/cudazone/cuda_sdk/Linear_Algebra.html" rel = "nofollow noreferrer"> a BLAS back-end. Tente encontrar alguns exemplos semelhantes ao que você está fazendo, talvez, também olhando para o série de livros GPU gems , para medir o quão bem CUDA irá atender às suas aplicações. Eu diria que, do ponto de vista logístico, CUDA é mais fácil trabalhar com e muito, muito mais barato do que qualquer kit de ferramentas de desenvolvimento FPGA profissional.

Em um ponto eu fiz olhar para CUDA para a modelagem de simulação reivindicação reserva. Há completamente uma boa série de palestras ligadas fora do web-site para a aprendizagem. No Windows, você precisa ter certeza de CUDA está sendo executado em um cartão sem exibe como os gráficos subsistema tem um watchdog timer que irá bombardear qualquer processo em execução por mais de 5 segundos. Isso não ocorre no Linux.

Qualquer mahcine com dois slots PCI-E x16 devem apoiar isso. Eu usei um HP xw9300, que você pode pegar off ebay muito mais barato. Se fizer isso, certifique-se que tem dois de CPU (não uma CPU dual-core) como os slots PCI-e viver em ônibus HyperTransport separados e você precisa de dois CPUs na máquina para ter tanto ônibus ativo.

Eu sou um desenvolvedor CUDA com experiência muito littel com FPGA: s, no entanto eu tenho tentado encontrar comparações entre os dois

.

O que eu já concluiu até agora:

A GPU tem de longe mais elevado (acessível) o desempenho de pico Tem uma proporção FLOP / watt mais favorável. É mais barato Ele está se desenvolvendo mais rápido (muito em breve você vai literalmente ter uma "real" TFLOP disponível). É mais fácil de programa (leia artigo sobre este parecer não pessoal)

Note que eu estou dizendo reais / acessível para distinguir a partir dos números que você verá em um GPGPU comercial.

Mas a gpu não é mais favorável quando você precisa fazer acessos aleatórios aos dados. Isto irá mudar com a nova arquitetura Nvidia Fermi, que tem um opcional L1 / L2 cache.

meus 2 centavos

FPGA não será favorecida por aqueles com um viés software como eles precisam aprender uma HDL ou pelo menos entender sistemaC.

Para aqueles com um FPGA viés hardware será a primeira opção considerada.

Na realidade, um firme aperto de ambos é necessária e, em seguida, uma decisão objetiva pode ser feita.

OpenCL é projetado para rodar em ambos FPGA e GPU, mesmo CUDA pode ser portado para FPGA.

FPGA & GPU aceleradores podem ser usados ??juntos

Portanto, não é um caso de que é melhor um ou o outro. Há também o debate sobre CUDA vs OpenCL

Mais uma vez, a menos que você tem otimizado e aferido, tanto para a sua aplicação específica que você não pode saber com 100% de certeza.

Muitos simplesmente ir com CUDA por causa de sua natureza comercial e recursos. Outros vão com OpenCL devido à sua versatilidade.

O que você está implantando em? Quem é o seu cliente? Mesmo sem saber as respostas a estas perguntas, eu não usaria um FPGA a menos que você está construindo um sistema em tempo real e ter engenheiros / computador elétricos em sua equipe que têm conhecimento da descrição de hardware linguagens como VHDL e Verilog. Há muito a ele e leva um de espírito diferente do que a programação convencional.

FPGAs têm caído em desuso no setor de HPC porque eles são uma horrorterror ao programa. CUDA é porque é muito muito mais bonitos para o programa e ainda vai lhe dar um bom desempenho. Eu iria com o que a comunidade HPC tem ido com e fazê-lo em CUDA. É mais fácil, é mais barato, é mais sustentável.

Outros têm dado boas respostas, só queria acrescentar uma perspectiva diferente. Aqui está minha pesquisa publicado na ACM Computing Surveys 2015 (seu permalink é aqui ), que compara GPU com FPGA e CPU na eficiência energética métrica. A maioria dos trabalhos relatam: FPGA é mais eficiente energeticamente do que GPU, o que, por sua vez, é mais eficiente energeticamente do que CPU. Desde orçamentos de energia são fixos (dependendo da capacidade de refrigeração), eficiência energética dos FPGA significa que se pode fazer mais cálculos dentro mesmo orçamento poder com FPGA, e, assim, obter um melhor desempenho com FPGA do que com GPU. Claro, também representam limitações FPGA, como mencionado por outros.

  • FPGAs são mais paralelo de GPUs, por três ordens de magnitude. Enquanto boa GPU possui milhares de núcleos, FPGA pode ter milhões de portas programáveis.
  • Enquanto núcleos CUDA deve fazer cálculos altamente semelhantes para ser produtivo, as células FPGA são verdadeiramente independentes um do outro.
  • FPGA pode ser muito rápido com alguns grupos de tarefas e são muitas vezes utilizados em um milésimo de segundo já é visto como uma longa duração.
  • núcleo GPU é muito mais poderoso do que células FPGA, e muito mais fácil de programar. É um núcleo, podem se dividir e multiplicar nenhum problema quando a célula FPGA só é capaz de lógica booleana bastante simples.
  • Como GPU núcleo é uma núcleo , é eficiente para programar em C ++. Mesmo que também é possível para o programa FPGA em C ++, é ineficiente (apenas "produtivo"). linguagens especializadas como VDHL ou Verilog deve ser utilizado - eles são difíceis e difícil de dominar.
  • A maioria dos verdadeiros e tentou instintos de um engenheiro de software são inúteis com FPGA. Você quer um loop com estas portas? Qual galáxia você é? Você precisa mudança na mentalidade de engenheiro eletrônico para compreender este mundo.

o mais tardar GTC'13 muitos HPC pessoas concordaram que CUDA está aqui para ficar. de FGPA são complicados, CUDA está ficando muito mais maduro apoiar Python / C / C ++ / ARM .. de qualquer forma, que era uma pergunta datado

Programação de uma GPU em CUDA é definitivamente mais fácil. Se você não tem nenhuma experiência com FPGAs em HDL é quase certamente ser demasiado de um desafio para você programar, mas você ainda pode programá-los com OpenCL, que é meio parecido com CUDA. No entanto, é mais difícil de implementar e provavelmente muito mais caro do que GPUs programação.

Qual é o mais rápido?

GPU corre mais rápido, mas FPGA pode ser mais eficiente.

GPU tem o potencial de correr a uma velocidade maior do que o FPGA já pode alcançar. Mas só por algoritmos que são especialmente adequados para isso. Se o algoritmo não é o ideal, a GPU vai perder um monte de desempenho.

FPGA, por outro lado é executado muito mais lento, mas você pode implementar hardware específico do problema que vai ser muito eficiente e fazer outras coisas em menos tempo.

É meio como comer a sopa com um garfo muito rápido vs. comer com uma colher de forma mais lenta.

Ambos os dispositivos basear seu desempenho em paralelização, mas cada um de uma forma ligeiramente diferente. Se o algoritmo pode ser granulado em um monte de peças que executam as mesmas operações (palavra-chave: SIMD), a GPU será mais rápido. Se o algoritmo pode ser implementado como um longo pipeline, o FPGA será mais rápido. Além disso, se você quiser usar ponto flutuante, FPGA não vai ser muito feliz com ele:)

Eu dediquei minha tese toda mestrado a este tópico. Algoritmo Aceleração em FPGA com OpenCL

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top