- 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
Comentários do Hacker News
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
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
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
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
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
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
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
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
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
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
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
https://github.com/asicguy/gplgpu
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
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...
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
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/
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
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-...