FuryGpu: bộ xử lý đồ họa FPGA PCIe tùy chỉnh
(furygpu.com)- Đây là một bộ xử lý đồ họa tùy chỉnh, được tự xây dựng từ phần cứng đến driver để sử dụng như một GPU thực thụ trên PC hiện đại
- Phần triển khai cốt lõi được thực hiện trên Xilinx Zynq UltraScale+ FPGA và gắn trên một PCB tùy chỉnh
- Kết nối với máy chủ qua PCIe, nên hoạt động như một GPU phần cứng thực sự chứ không phải thử nghiệm phần mềm
- Các tính năng được đặt ở mức tương đương card đồ họa cao cấp giữa thập niên 1990, nhắm đến việc render game thời đó
- Có cả ngăn xếp driver Windows hiện đại, cho phép render các game thực tế của thời kỳ đó với tốc độ khung hình vượt thời gian thực
Cấu hình phần cứng
- FuryGpu là một GPU hoàn toàn tùy chỉnh được chế tạo từ đầu để dùng trên máy tính hiện đại
- Logic xử lý đồ họa được triển khai trên Xilinx Zynq UltraScale+ FPGA
- Được gắn trên PCB tùy chỉnh và kết nối với máy chủ qua PCIe
Tính năng đồ họa và driver
- Chức năng phần cứng hỗ trợ mức tương đương card đồ họa cao cấp giữa thập niên 1990
- Cung cấp kèm ngăn xếp driver phần mềm Windows hiện đại, cho phép dùng như GPU trong môi trường thực tế
Các tác vụ có thể chạy
- FuryGpu có thể render các game thực tế của thời kỳ đó
- Hiệu năng render có thể đạt tốc độ khung hình vượt thời gian thực
1 bình luận
Các ý kiến trên Hacker News
Để trả lời câu hỏi tôi nhận được thường xuyên nhất: một lúc nào đó tôi dự định công bố toàn bộ stack dưới dạng mã nguồn mở. Bao gồm sơ đồ mạch/bố cục PCB, toàn bộ HDL, driver Windows WDDM, driver runtime API, và cả Quake đã được port để dùng API đó
Tuy nhiên tôi cần xử lý các vấn đề pháp lý liên quan đến công việc, và cũng phải quyết định các chi tiết như giấy phép. Đây không phải công việc chính của tôi, nhưng lĩnh vực đủ gần nên tôi phải cẩn trọng
Commit đầu tiên của dự án này là ngày 22/8/2021, và tôi đã làm nó được hơn hai năm rưỡi một chút. Trong quá trình đó tôi không viết bài, nhưng playlist YouTube FuryGpu (https://www.youtube.com/playlist?list=PL4FPA1MeZF440A9CFfMJ7...) có khá nhiều video cho thấy đại khái tiến độ
Các bài blog tiếp theo sẽ nói về giao diện PCIe, và có lẽ sẽ là một loạt nhiều phần, bắt đầu từ sơ đồ mạch/bố cục PCB, rồi tới thiết kế FPGA và driver Windows. Chỉ riêng việc viết một bài về Texture Unit cũng khiến tôi càng kính trọng hơn những người đều đặn viết các bài kỹ thuật kiểu này
Tôi rất muốn có một thứ dễ cắm dùng như 6502 nhưng có thêm vài thanh ghi, phần cứng chia số và vài tính năng nữa, nhưng đó thật sự là một việc không hề đơn giản
Cuối cùng lại quay về “thôi cứ dùng MCU cho xong”, rồi tiếp theo là đụng phải bài toán tạo đồ họa
Vì chỉ dùng các cổng logic rời thì khó xử lý tốc độ cao nhiều, nên tôi nghĩ học xem FPGA có thể làm được gì sẽ thú vị hơn nhiều
Với đồ họa, ban đầu cứ bắt đầu bằng đầu ra nối tiếp là được. Đó là cách trừu tượng hóa vấn đề cho đến khi bạn sẵn sàng xử lý. Nếu ép Arduino hết mức, có thể biến nó thành một card đồ họa VGA rất cơ bản [1]. ESP32 to VGA thì còn dễ hơn và còn cung cấp cả bàn phím lẫn chuột [2]
[1] https://www.instructables.com/Arduino-Basic-PC-With-VGA-Outp...
[2] https://www.aliexpress.us/item/1005006222846299.html
Xuất hình là vấn đề lớn vì băng thông cần cho đầu ra số. Nếu là composite hoặc VGA thì có thể vẫn làm được bằng các chip còn dễ kiếm. Commander X16 gần đây đã chọn FPGA cho vấn đề này
Có lẽ số người thật sự xem hết video dưới 100 nghìn, và trong số đó những người tự tay làm gì đó còn ít hơn nữa. Với thời đại ngày nay, điện tử học sở thích có cảm giác nhỏ bé đến bất ngờ
Đọc thì thấy đây trước hết là một dự án sở thích làm cho vui, và có vẻ tác giả định viết nhiều bài về cách đã tạo ra nó
Đặc biệt ấn tượng là toàn bộ stack đều hoạt động. Driver Windows triển khai một API đồ họa tùy chỉnh, và Quake chạy trên đó. Việc không hỗ trợ DX/GL thì hơi tiếc, nhưng tôi hoàn toàn hiểu vì sao lại chọn con đường API tùy chỉnh
Tôi tò mò liệu thiết kế có được công bố mã nguồn mở không
Vấn đề không chỉ đơn giản là “shader”; chỉ riêng trình quản lý cửa sổ của OS muốn hoạt động cũng đã có khá nhiều yêu cầu. Những người chơi thông thường trong lĩnh vực này, tức AMD, Nvidia, Intel, Imagination, v.v., đã tích lũy dần dần trên nền công nghệ phát triển hơn 20 năm
Trong một năm qua, tôi đã làm việc trên một GPU thiên về 2D cho các vi điều khiển bị ràng buộc I/O rất lớn (https://github.com/KallDrexx/microgpu). Tôi đã làm cho nó có thể render giao diện người dùng lên màn hình lớn ngay cả trên các thiết bị SPI chậm, và công việc đó rất thú vị
Nhưng khi thấy giới hạn của pipeline xử lý, tôi vẫn nghĩ rằng nếu dùng FPGA thì có thể làm nhanh hơn. Gần đây tôi kiếm được vài FPGA giá rẻ và bắt đầu học để thử chuyển microgpu dựa trên ESP32 sang nền tảng FPGA
Vì con cái và hạn chế thời gian rảnh, tôi không biết mình có thể đạt tới mức này hay không, nhưng tôi vẫn muốn thử làm được dù chỉ 1/100 mức này
Chỉ riêng tín hiệu 1080p RGB 60Hz “cơ bản” đã đòi hỏi xử lý tín hiệu tần số cao mà rất khó đảm đương chỉ bằng logic FPGA thuần túy
Hầu như không có GPU phần cứng mở nào đáng nói. Tùy giấy phép thì có thể khác, nhưng tôi không tìm được thông tin, và đây có thể là trường hợp đầu tiên cũng như điểm khởi đầu cho nhiều công việc hơn
https://github.com/asicguy/gplgpu
https://github.com/schlae/graphics-gremlin là adapter tương thích MDA/CGA
https://github.com/OmarMongy/VGA là VGA core
https://github.com/archlabo/Frix là SoC tương thích IBM PC hoàn chỉnh, bao gồm VGA
Thứ tôi muốn chỉ là một GPU M.2 độc lập. Hiệu năng có thể khiêm tốn, chỉ cần ở mức GPU tích hợp như Intel UHD Graphics, AMD Radeon, Qualcomm Adreno là được
Tôi có ý tưởng về một sản phẩm nhúng nhỏ cần nhiều tính toán và mạng, nhưng chỉ cần rất ít năng lực đồ họa. NXP Layerscape LX2160A [1] gần như hoàn hảo, nhưng phải bỏ vì không có GPU tích hợp. Tôi chỉ cần một GPU nhỏ thôi
[1]: https://www.nxp.com/products/processors-and-microcontrollers...
Hiệu năng hoàn toàn không sánh được với GPU tích hợp hiện đại. GPU tích hợp có thể tận dụng bộ nhớ hệ thống, cache và ngân sách điện năng, còn một thiết bị M.2 đơn giản thì không có những thứ đó. Ngay cả GPU PCIe cấp thấp, tức card một khe, nửa chiều dài/nửa chiều cao, cũng khó vượt được một GPU tích hợp tốt, và chỉ có ý nghĩa khi bạn thật sự cần chức năng hiển thị cơ bản
Một dự án đáng xem cùng là Vortex project của Georgia Tech [1]. Có vẻ đây là cách tiếp cận nhìn về tương lai, thay vì lặp lại quá khứ chức năng cố định của thiết kế GPU. Cốt lõi là một máy tính song song hóa cao dựa trên RISC-V, với các mở rộng để xử lý tốt hơn các tác vụ GPU
Bo mạch chạy được có giá vài nghìn USD nên không thân thiện lắm với dân hobby, nhưng chắc chắn dễ tiếp cận hơn phát triển độc quyền khép kín. Bản phát hành 2.0 cũng đã ra mắt vài tháng trước
[1]: https://vortex.cc.gatech.edu/
Blog nói đến Xilinx Kria SoM, nhưng khi theo liên kết xem thông số module thì trông như nó chứa ARM SoC chứ không phải Xilinx FPGA. Có thể tôi đang bỏ sót điều gì đó vì không quen với thế giới FPGA
https://www.amd.com/en/products/system-on-modules/kria/k26/k...
Như đã nói ở chỗ khác trong luồng này, Kria SoM có cấu trúc gồm FPGA fabric cùng với các lõi ARM cứng đảm nhiệm phần điều khiển. Ngoài việc lúc đó có thể mua được và bo mạch phát triển Kria thật sự rất rẻ, khoảng 350 USD, các thiết bị này còn bao gồm những thứ như IP DisplayPort cứng gắn với lõi ARM, nên có thể chuyển các tác vụ như xuất hình và âm thanh sang firmware
Phiên bản trước của dự án này chạy trên Zynq 7020, khi đó phải tự viết phần liên quan đến HDMI. Không quá phức tạp, nhưng chiếm khá nhiều logic, và nếu làm cho nó có thể cấu hình được thì sẽ phức tạp hơn nhiều
Chỉ riêng việc thiết kế và bring-up một bo FPGA như trong bài blog đã là một rào cản rất cao. Hy vọng một ngày nào đó sơ đồ mạch và mã nguồn sẽ được công bố
[1] https://docs.amd.com/v/u/en-US/zynq-ultrascale-plus-product-...