1 pontos por GN⁺ 2024-03-28 | 1 comentários | Compartilhar no WhatsApp
  • Uma unidade de processamento gráfico personalizada, criada diretamente do hardware ao driver, para ser usada como uma GPU real em PCs modernos
  • A implementação principal foi feita sobre um FPGA Xilinx Zynq UltraScale+ e montada em uma PCB personalizada
  • Conecta-se ao computador host via PCIe, funcionando como uma GPU de hardware real, não como um experimento de software
  • Os recursos suportados foram alinhados ao nível de uma placa de vídeo avançada de meados dos anos 1990, com foco na renderização de jogos da época
  • Com uma pilha moderna de drivers para Windows, consegue renderizar jogos reais daquele período com taxas de quadros acima do tempo real

Configuração de hardware

  • O FuryGpu é uma GPU totalmente personalizada, criada desde o início para uso em computadores modernos
  • A lógica de processamento gráfico é implementada sobre um FPGA Xilinx Zynq UltraScale+
  • É montado em uma PCB personalizada e se conecta ao computador host via PCIe

Recursos gráficos e drivers

  • Os recursos de hardware suportam um nível equivalente ao de uma placa de vídeo avançada de meados dos anos 1990
  • Também oferece uma pilha moderna de drivers de software para Windows, permitindo usá-lo como GPU em ambientes reais

Tarefas executáveis

  • O FuryGpu consegue renderizar jogos reais daquela época
  • O desempenho de renderização pode atingir taxas de quadros acima do tempo real

1 comentários

 
GN⁺ 2024-03-28
Comentários do Hacker News
  • Sou o criador deste projeto. Eu esperava que ele se espalhasse depois que houvesse um pouco mais de conteúdo no site, mas acabou sendo assim :)
    Respondendo à pergunta que mais recebo: um dia pretendo abrir toda a stack em open source. Isso inclui esquemático/layout da PCB, todo o HDL, o driver Windows WDDM, o driver de runtime da API e até o Quake portado para usar essa API
    Só que preciso resolver algumas questões legais relacionadas ao meu trabalho e também decidir detalhes como a licença. Não é a minha atividade principal, mas é uma área próxima o suficiente para eu precisar ter cuidado
    O primeiro commit deste projeto foi em 22 de agosto de 2021, e venho trabalhando nele há pouco mais de dois anos e meio. Não escrevi posts durante o processo, mas há vários vídeos na playlist do YouTube FuryGpu(https://www.youtube.com/playlist?list=PL4FPA1MeZF440A9CFfMJ7...) que mostram mais ou menos o andamento
    Os próximos posts do blog devem ser sobre a interface PCIe, provavelmente uma série de várias partes começando pelo esquemático/layout da PCB, passando pelo projeto em FPGA e chegando ao driver do Windows. Só de ter escrito um post sobre a Texture Unit, passei a respeitar ainda mais quem escreve esse tipo de texto técnico com regularidade
    • Venho acompanhando atualizações semirregulares no Discord, e é incrível ver o projeto chegar até aqui. Também fiquei um pouco frustrado por meu projeto em FPGA ter avançado relativamente pouco no mesmo período, e estava esperando que isso fosse organizado em texto
    • Procurei por Xilinx Zynq UltraScale+ e parece bem caro. Muita gente gasta milhares de dólares ou mais em hobby, então não é problema se houver dinheiro, mas fico curioso se esse é o hardware final pretendido do projeto ou se você tem algo além em mente
    • Fico curioso sobre o quanto ele depende de blocos de IP hard. Dá para portar para FPGAs de outros fornecedores, como Lattice ECP5? Também queria saber se o PCIe foi implementado diretamente em HDL ou se você usou um bloco de IP proprietário do fornecedor. Seria ótimo incluir estatísticas de uso de recursos também
    • No post sobre a Texture Unit, a tabela ROM para offsets de endereço de nível mip parece ocupar bastante espaço. Fico curioso se você chegou a considerar colocar o endereço base do mip como parte da especificação da textura
    • Se alguém quisesse tentar fazer algo parecido, que livros você recomendaria? Por exemplo, eu precisaria de materiais para aprender projeto de placas PCB para hardware com PCIe
  • O impacto da série do Ben Eater sobre computador de breadboard no hobby de eletrônica é surpreendente. Eu também me senti estimulado de forma parecida e tentei projetar minha própria CPU “retrô”
    Eu queria muito algo tão fácil de encaixar e usar quanto um 6502, mas com alguns registradores a mais e recursos como divisão por hardware, porém é um trabalho realmente difícil
    No fim, sempre se volta para “melhor só usar um MCU”, e depois disso vem o problema de geração de gráficos
    • Foi exatamente aí que este projeto começou. Depois de montar o computador de breadboard de 8 bits do Ben Eater, comecei a procurar o que seria necessário para fazer algo mais interessante
      Como é difícil fazer muito processamento em alta velocidade só com portas lógicas discretas, achei que seria bem mais interessante aprender o que dá para fazer com FPGA
    • Registradores podem ser contornados com stack ou memória, e divisão pode ser implementada como uma função simples. Isso faz parte da diversão de trabalhar nesse nível
      No caso dos gráficos, dá para começar com saída serial. É uma forma de abstrair o problema até você estar pronto para lidar com ele. Se levar um Arduino ao limite, dá para transformá-lo numa placa gráfica VGA bem básica [1]. ESP32 to VGA é ainda mais fácil e também oferece teclado e mouse [2]
      [1] https://www.instructables.com/Arduino-Basic-PC-With-VGA-Outp...
      [2] https://www.aliexpress.us/item/1005006222846299.html
    • Eu ia recomendar o Parallax Propeller, especialmente o primeiro modelo em formato DIP, mas na verdade ele é muito mais complexo de programar e bem mais potente. Nesse ponto, faz mais sentido olhar para um ESP32, e aí acaba virando “melhor só usar um MCU” :)
      Saída de vídeo é um grande problema por causa da largura de banda necessária para saída digital. Com saída composta ou VGA, talvez ainda dê para fazer algo com chips que são fáceis de encontrar. Recentemente, o Commander X16 escolheu FPGA para esse problema
    • Não consigo pensar em outro caso tão popular assim. Ele ficou um tempo parado e recentemente voltou a postar vídeos com alguma regularidade, e o público está na casa de algumas centenas de milhares
      Na prática, acho que menos de 100 mil pessoas assistem aos vídeos até o fim, e menos ainda devem tentar fazer algo por conta própria. Para os padrões de hoje, eletrônica como hobby parece surpreendentemente pequena
    • Eu estava olhando gráficos em MCU e fiquei decepcionado ao descobrir que a pequena GPU NeoChrom presente em peças STM32 mais novas não é totalmente documentada. Historicamente, a STM32 tende a não colocar caixas-pretas dentro do chip, então imagino que seja um bloco de IP licenciado de terceiros
  • Muito legal. O post de hello ajudou a entender a intenção do criador: https://www.furygpu.com/blog/hello
    Pelo que li, acima de tudo é um projeto de hobby feito por diversão, e ele pretende escrever muitos posts no futuro sobre como o construiu
    Em especial, é impressionante que a stack inteira funcione. O driver do Windows implementa uma API gráfica customizada, e o Quake roda em cima dela. É uma pena não haver suporte a DX/GL, mas dá para entender perfeitamente por que ele escolheu o caminho de uma API customizada
    Fico curioso se ele vai abrir o projeto em open source
    • Adicionar os recursos necessários para um suporte básico a D3D exige um esforço considerável, e estou avaliando concretamente o que é possível em termos de desempenho. Infelizmente, a perspectiva não parece boa
      Não é só uma questão de “shaders”; até o gerenciador de janelas do sistema operacional já tem exigências bastante grandes para funcionar. Os players típicos dessa área — AMD, Nvidia, Intel, Imagination etc. — construíram isso incrementalmente em cima de mais de 20 anos de evolução tecnológica
  • É o projeto dos meus sonhos

No último ano, venho trabalhando em uma GPU focada em 2D para microcontroladores com grandes limitações de E/S (https://github.com/KallDrexx/microgpu). Consegui fazer com que ela renderizasse interfaces de usuário em telas grandes mesmo em dispositivos SPI lentos, e o trabalho foi muito interessante
Mas, ao ver os limites do pipeline do processador, venho pensando que com FPGA daria para fazer algo mais rápido. Recentemente consegui alguns FPGAs baratos e comecei a aprender para tentar transformar a microgpu baseada em ESP32 em uma versão baseada em FPGA
Não sei se vou conseguir chegar a esse nível por causa dos filhos e das limitações de tempo livre, mas gostaria de fazer nem que seja 1% disso

  • Vocês provavelmente já sabem disso, mas, para outras pessoas curiosas sobre esse caminho, vale muito a pena se limitar a FPGAs com transceptores dedicados de alta largura de banda para esse tipo de uso
    Mesmo um sinal RGB 1080p 60 Hz “básico” já exige processamento de sinais em alta frequência que é muito difícil de sustentar apenas com lógica FPGA pura
  • O pipeline parece retrô, mas é muito melhor do que não ter nada
    Quase não existem GPUs de hardware aberto dignas de menção. Dependendo da licença, talvez exista algo, mas não consegui encontrar informações, e isso pode acabar sendo o primeiro caso e o ponto de partida para mais trabalho
    • Há também algo assim, de um tipo parecido de GPU
      https://github.com/asicguy/gplgpu
    • Claro, isso depende da definição de “aberto”. Até onde eu sei, não existem toolchains open source para FPGAs minimamente recentes, então qualquer trabalho real de modificação ainda fica preso a ferramentas proprietárias, provavelmente pagas. Se você precisa de algo maior que um iCE40 UP5k, quase não há saída
    • O Ticket2Ride Number9 era uma GPU de função fixa do fim dos anos 1990 e foi totalmente aberta em GPL
    • Também depende do que você considera “GPU”
      https://github.com/schlae/graphics-gremlin é um adaptador compatível com MDA/CGA
      https://github.com/OmarMongy/VGA é um núcleo VGA
      https://github.com/archlabo/Frix é um SoC completo compatível com IBM PC, incluindo VGA
    • Também existe o Nyuzi, que foca mais em uma GPU de uso geral: https://github.com/jbush001/NyuziProcessor. Embora o autor também tenha experimentado executar gráficos 3D
  • Não consigo acreditar que esta seja a opção mais próxima que temos de uma GPU pequena e independente. Não existe algo como uma GPU em formato M.2
    O que eu quero é apenas uma GPU M.2 independente. O desempenho pode ser modesto; algo no nível de uma GPU integrada como Intel UHD Graphics, AMD Radeon ou Qualcomm Adreno já serviria
    Tenho uma ideia de produto embarcado pequeno que precisa de bastante computação e rede, mas de muito pouca capacidade gráfica. O NXP Layerscape LX2160A [1] quase teria sido perfeito, mas tive que desistir porque não tem GPU integrada. Eu só preciso de uma GPU pequena
    [1]: https://www.nxp.com/products/processors-and-microcontrollers...
    • Existe pelo menos uma GPU M.2 baseada no controlador Silicon Motion SM750 feita pela Asrock Rack. Produtos em formato mPCIe também existem de forma parecida
      O desempenho não chega nem perto de uma GPU integrada moderna. GPUs integradas podem aproveitar a memória do sistema, cache e orçamento de energia, mas um simples dispositivo M.2 não tem nada disso. Até GPUs PCIe baratas, isto é, placas de meio comprimento/meia altura de slot único, dificilmente superam uma boa GPU integrada e só fazem sentido quando recursos básicos de vídeo são absolutamente necessários
    • E as GPUs MXM que costumavam vir em notebooks gamer? Sei que o padrão é bem de nicho e caro. Uma 3080M usada sai por cerca de US$ 400 no eBay, mas elas existem e podem ser convertidas para PCIe e depois conectadas por M.2
    • A potência pode ser baixa demais, mas também existe isto: https://www.matrixorbital.com/ftdi-eve
  • Projeto muito legal, e é bom ver mais trabalho nesta área
    Outra coisa que vale a pena ver é o projeto Vortex da Georgia Tech[1]. Parece uma abordagem voltada para o futuro, em vez de repetir o passado de função fixa do design de GPUs. A base é um computador altamente paralelizado baseado em RISC-V, com extensões para lidar melhor com cargas de trabalho de GPU
    A placa para executar isso custa milhares de dólares, então não é muito amigável para hobbyistas, mas ainda assim é bem mais acessível do que desenvolvimento fechado e proprietário. Também houve um lançamento 2.0 há alguns meses
    [1]: https://vortex.cc.gatech.edu/
  • Parece uma conquista realmente impressionante. Eu gostaria de ver fotos do hardware real. Também fiquei um pouco confuso sobre qual módulo FPGA está sendo usado
    No blog falam em um Xilinx Kria SoM, mas, ao seguir o link e olhar as especificações do módulo, parece que ele inclui um SoC ARM e não um FPGA Xilinx. Como não conheço bem o mundo de FPGAs, talvez eu esteja deixando passar alguma coisa
    https://www.amd.com/en/products/system-on-modules/kria/k26/k...

Como mencionei em outra parte desta thread, o Kria SoM tem uma arquitetura que combina a malha FPGA com núcleos ARM hard responsáveis pelo controle. Além do fato de que era possível comprá-lo na época e de que a placa de desenvolvimento Kria custava algo em torno de US$ 350, o que era realmente barato, esses dispositivos também incluem coisas como IP hard de DisplayPort ligado aos núcleos ARM, então tarefas como saída de vídeo e áudio podem ser delegadas ao firmware
Uma versão anterior deste projeto rodava em um Zynq 7020, e naquela época foi preciso escrever manualmente a parte relacionada a HDMI. Não é extremamente complexo, mas consome bastante lógica, e fica muito mais complexo se você quiser torná-lo configurável

  • É um chip híbrido, não um ARM SoC ou um Xilinx FPGA isoladamente. É uma estrutura que junta FPGA e um SoC tradicional, então não é preciso colocar um MCU softcore que consuma recursos valiosos do FPGA só para tarefas básicas de gerenciamento
  • A Xilinx não divulga o número exato da peça FPGA usada no Kria SoM. Mas, pelas especificações públicas, parece corresponder aos dispositivos ZU3EG-UBVA530-2L e ZU5EV-SFVC784-2L[1], e só o segundo tem suporte a PCIe
    Só o trabalho de projetar e fazer o bring-up de uma placa FPGA, como no post do blog, já é uma barreira alta. Seria bom se algum dia o esquemático e o código-fonte fossem publicados
    [1] https://docs.amd.com/v/u/en-US/zynq-ultrascale-plus-product-...
  • Foi dito que ele suporta recursos de hardware equivalentes aos de placas gráficas avançadas de meados dos anos 1990, mas como parece que ninguém fez essa pergunta ainda, quero perguntar: qual é o nível de compatibilidade com VGA? Por exemplo, seria possível colocá-lo em qualquer PC com slot PCIe, inicializar em DOS e jogar DOOM?
  • Seria legal se o criador detalhasse a implementação da interface PCIe. Eu provavelmente nunca vou fazer um trabalho de hardware nesse nível, mas acho que vale a pena entender melhor o interior do PCIe como conhecimento geral
    • O próximo post do blog vai tratar exatamente disso. Parece que será uma série de vários textos: o primeiro deve cobrir esquemático/layout da PCB, o seguinte a interface FPGA e os testes, e depois o driver para Windows
    • O FPGA em uso tem PCIe nativo, então normalmente nessa parte você só recebe uma interface para um bloco de IP proprietário do fornecedor. O estado das interfaces abertas no mundo FPGA é lamentável. O melhor que já vi sendo totalmente open source foi algo no nível de um MAC gigabit
    • Em cima do core PCIe hard da Xilinx, ele usa https://github.com/alexforencich/verilog-pcie. Esse core fornece tudo abaixo da camada de transação