FuryGpu: หน่วยประมวลผลกราฟิก PCIe FPGA แบบกำหนดเอง
(furygpu.com)- เป็นหน่วยประมวลผลกราฟิกแบบกำหนดเองที่สร้างขึ้นเองตั้งแต่ ฮาร์ดแวร์ไปจนถึงไดรเวอร์ เพื่อให้ใช้งานได้เหมือน GPU จริงบนพีซีสมัยใหม่
- การใช้งานหลักสร้างบน Xilinx Zynq UltraScale+ FPGA และติดตั้งบน PCB แบบกำหนดเอง
- เชื่อมต่อกับคอมพิวเตอร์โฮสต์ผ่าน PCIe จึงทำงานเป็น GPU ฮาร์ดแวร์จริง ไม่ใช่การทดลองซอฟต์แวร์
- ฟีเจอร์ที่รองรับถูกปรับให้อยู่ในระดับ การ์ดจอระดับไฮเอนด์ช่วงกลางทศวรรษ 1990 โดยมีเป้าหมายเพื่อเรนเดอร์เกมยุคนั้น
- มาพร้อม สแตกไดรเวอร์ Windows สมัยใหม่ ทำให้สามารถเรนเดอร์เกมจริงในยุคนั้นได้ด้วยเฟรมเรตที่สูงกว่าระดับเรียลไทม์
โครงสร้างฮาร์ดแวร์
- FuryGpu เป็น GPU แบบกำหนดเองทั้งหมด ที่สร้างขึ้นตั้งแต่ต้นเพื่อใช้กับคอมพิวเตอร์สมัยใหม่
- ลอจิกการประมวลผลกราฟิกถูกใช้งานบน Xilinx Zynq UltraScale+ FPGA
- ติดตั้งบน PCB แบบกำหนดเอง และเชื่อมต่อกับคอมพิวเตอร์โฮสต์ผ่าน PCIe
ฟีเจอร์กราฟิกและไดรเวอร์
- ความสามารถของฮาร์ดแวร์รองรับในระดับเทียบเท่า การ์ดจอระดับไฮเอนด์ช่วงกลางทศวรรษ 1990
- มี สแตกไดรเวอร์ซอฟต์แวร์ Windows สมัยใหม่ให้มาด้วย จึงสามารถใช้งานเป็น GPU ในสภาพแวดล้อมจริงได้
งานที่สามารถรันได้
- FuryGpu สามารถเรนเดอร์ เกมจริง ในยุคนั้นได้
- ประสิทธิภาพการเรนเดอร์สามารถไปถึง เฟรมเรตที่สูงกว่าระดับเรียลไทม์
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
เพื่อตอบคำถามที่ผมถูกถามบ่อยที่สุด สักวันหนึ่งผมตั้งใจจะเปิดเผย ทั้งสแตกเป็นโอเพนซอร์ส ทั้งผังวงจร/เลย์เอาต์ PCB, HDL ทั้งหมด, ไดรเวอร์ Windows WDDM, ไดรเวอร์รันไทม์ API รวมถึง Quake ที่พอร์ตมาให้ใช้ API นั้นด้วย
แต่ต้องจัดการประเด็นทางกฎหมายที่เกี่ยวกับงานประจำให้เรียบร้อยก่อน และต้องตัดสินใจรายละเอียดอย่างเรื่องไลเซนส์ด้วย แม้นี่จะไม่ใช่งานหลัก แต่ก็เป็นสาขาที่ใกล้เคียงกันพอสมควร จึงต้องระวัง
คอมมิตแรกของโปรเจกต์นี้คือวันที่ 22 สิงหาคม 2021 และผมทำงานกับมันมานานกว่าสองปีครึ่งเล็กน้อยแล้ว ระหว่างทางไม่ได้เขียนบทความไว้ แต่ในเพลย์ลิสต์ YouTube FuryGpu(https://www.youtube.com/playlist?list=PL4FPA1MeZF440A9CFfMJ7...) มีวิดีโออยู่พอสมควรที่ดูความคืบหน้าโดยคร่าว ๆ ได้
บทความบล็อกถัด ๆ ไปจะเกี่ยวกับ อินเทอร์เฟซ PCIe และน่าจะเป็นซีรีส์หลายตอน เริ่มจากผังวงจร/เลย์เอาต์ PCB ต่อไปยังการออกแบบ FPGA และไดรเวอร์ Windows แค่ได้ลองเขียนบทความเรื่อง Texture Unit หนึ่งบทความ ก็ทำให้ผมนับถือคนที่เขียนบทความเทคนิคแบบนี้เป็นประจำมากขึ้นอีก
ผมอยากได้อะไรสักอย่างที่เสียบใช้ง่ายเหมือน 6502 แต่มีรีจิสเตอร์เพิ่มอีกสักหน่อย และมีฟีเจอร์เพิ่มอย่างการหารด้วยฮาร์ดแวร์ แต่เอาจริง ๆ มันเป็นงานที่ไม่ง่ายเลย
สุดท้ายก็มักจะกลับไปที่ “ใช้ MCU ไปให้จบ ๆ” แล้วจากนั้นก็ชนกับ ปัญหาการสร้างกราฟิก
เพราะการทำงานความเร็วสูงจำนวนมากด้วยลอจิกเกตแยกชิ้นเพียงอย่างเดียวนั้นทำได้ยาก ผมเลยคิดว่าการเรียนรู้ว่า FPGA ทำอะไรได้บ้างน่าจะน่าสนใจกว่ามาก
กราฟิกในตอนแรกเริ่มจาก เอาต์พุตแบบอนุกรม ก็ได้ เป็นวิธีนามธรรมปัญหาเอาไว้จนกว่าจะพร้อมรับมือ ถ้ารีดความสามารถ Arduino ให้สุด ๆ ก็ทำเป็นการ์ดกราฟิก VGA ขั้นพื้นฐานมาก ๆ ได้ [1] ESP32 to VGA ง่ายกว่า และยังมีคีย์บอร์ดกับเมาส์ให้ด้วย [2]
[1] https://www.instructables.com/Arduino-Basic-PC-With-VGA-Outp...
[2] https://www.aliexpress.us/item/1005006222846299.html
เอาต์พุตวิดีโอเป็นปัญหาใหญ่เพราะ แบนด์วิดท์ ที่จำเป็นสำหรับเอาต์พุตดิจิทัล ถ้าเป็นเอาต์พุตคอมโพสิตหรือ VGA อาจยังทำได้ด้วยชิปที่หาได้ง่าย ใน Commander X16 รุ่นล่าสุดเลือกใช้ FPGA เพื่อแก้ปัญหานี้
คนที่ดูวิดีโอจนจบจริง ๆ น่าจะน้อยกว่า 100,000 คน และในจำนวนนั้นคนที่ลงมือทำอะไรเองคงยิ่งน้อยกว่านั้นอีก สำหรับยุคนี้ อิเล็กทรอนิกส์งานอดิเรก ให้ความรู้สึกว่าเล็กกว่าที่คิด
อ่านแล้วดูเหมือนว่าเหนือสิ่งอื่นใดมันเป็นโปรเจกต์งานอดิเรกที่ทำเพื่อความสนุก และน่าจะเขียนบทความจำนวนมากต่อจากนี้ว่าเขาสร้างมันอย่างไร
สิ่งที่น่าประทับใจเป็นพิเศษคือ ทั้งสแตก ทำงานได้จริง ไดรเวอร์ Windows ใช้กราฟิก API แบบกำหนดเอง และ Quake รันอยู่บนนั้น น่าเสียดายที่ไม่มีการรองรับ DX/GL แต่ก็เข้าใจได้เต็มที่ว่าทำไมถึงเลือกเส้นทาง API แบบกำหนดเอง
สงสัยว่าจะเปิดเผยดีไซน์เป็นโอเพนซอร์สหรือไม่
ไม่ใช่แค่ปัญหาเรื่อง “เชดเดอร์” เท่านั้น แม้แต่ window manager ของ OS ก็มีข้อกำหนดค่อนข้างมากถึงจะทำงานได้ ผู้เล่นทั่วไปในวงการนี้อย่าง AMD, Nvidia, Intel, Imagination และรายอื่น ๆ ล้วน ค่อย ๆ สั่งสมขึ้นมาบนเทคโนโลยีที่พัฒนามากว่า 20 ปี
ตลอด 1 ปีที่ผ่านมา ผมทำงานกับ GPU ที่เน้น 2D สำหรับไมโครคอนโทรลเลอร์ที่มีข้อจำกัดด้าน I/O สูง (https://github.com/KallDrexx/microgpu) ทำให้สามารถเรนเดอร์อินเทอร์เฟซผู้ใช้ลงบนจอแสดงผลขนาดใหญ่ได้ แม้จะเป็นอุปกรณ์ SPI ที่ช้า และงานนี้ก็น่าสนใจมาก
แต่พอเห็นข้อจำกัดของ pipeline ของโปรเซสเซอร์ ก็คิดมาตลอดว่าถ้าใช้ FPGA น่าจะทำให้เร็วขึ้นได้ ช่วงหลังได้ FPGA ราคาถูกมาสองสามตัว เลยเริ่มเรียนรู้เพื่อจะลองเปลี่ยน microgpu ที่ใช้ ESP32 ให้เป็นแบบใช้ FPGA
ด้วยข้อจำกัดเรื่องลูก ๆ และเวลาว่าง ก็ไม่รู้ว่าจะไปถึงระดับนี้ได้ไหม แต่แค่ทำได้ 1 ใน 100 ของระดับนี้ก็ยังอยากลอง
แค่สัญญาณ RGB 1080p 60Hz “พื้นฐาน” ก็ต้องประมวลผลสัญญาณความถี่สูงที่รับมือด้วยลอจิก FPGA ล้วน ๆ ได้ยากมากแล้ว
แทบไม่มี GPU ฮาร์ดแวร์เปิด ที่พอพูดถึงได้เลย ทั้งนี้ขึ้นอยู่กับไลเซนส์ด้วย แต่ผมหาข้อมูลไม่เจอ และนี่อาจเป็นกรณีแรกและเป็นจุดเริ่มต้นของงานต่อ ๆ ไปได้
https://github.com/asicguy/gplgpu
https://github.com/schlae/graphics-gremlin เป็นอะแดปเตอร์ที่เข้ากันได้กับ MDA/CGA
https://github.com/OmarMongy/VGA เป็น VGA core
https://github.com/archlabo/Frix เป็น SoC ที่เข้ากันได้กับ IBM PC แบบครบถ้วนซึ่งรวม VGA ด้วย
สิ่งที่ต้องการก็แค่ GPU M.2 แบบแยกหนึ่งตัว ประสิทธิภาพพอ modest ก็ได้ แค่ระดับ GPU ในตัวอย่าง Intel UHD Graphics, AMD Radeon, Qualcomm Adreno ก็พอ
มีไอเดียผลิตภัณฑ์ฝังตัวขนาดเล็กที่ต้องการการคำนวณและเครือข่ายเยอะ แต่ต้องการความสามารถกราฟิกน้อยมาก NXP Layerscape LX2160A [1] เกือบจะสมบูรณ์แบบแล้ว แต่ต้องล้มเลิกไปเพราะไม่มี GPU ในตัว แค่ต้องการ GPU เล็ก ๆ เท่านั้น
[1]: https://www.nxp.com/products/processors-and-microcontrollers...
ประสิทธิภาพเทียบกับ GPU ในตัวสมัยใหม่ไม่ได้เลย GPU ในตัวสามารถใช้หน่วยความจำระบบ แคช และงบพลังงานทั้งหมดได้ แต่อุปกรณ์ M.2 ธรรมดาไม่มีสิ่งเหล่านั้น แม้แต่ GPU PCIe ระดับล่าง ๆ อย่างการ์ดสล็อตเดียวแบบครึ่งความยาว/ครึ่งความสูง ก็ยังยากที่จะเหนือกว่า GPU ในตัวที่ดี และจะมีความหมายก็ต่อเมื่อจำเป็นต้องมีฟังก์ชันแสดงผลพื้นฐานจริง ๆ
อีกสิ่งที่น่าดูควบคู่กันคือ โปรเจกต์ Vortex ของ Georgia Tech [1] ดูเหมือนเป็นแนวทางที่มองไปอนาคต มากกว่าจะย้อนทำอดีตของการออกแบบ GPU แบบฟังก์ชันคงที่ซ้ำ ๆ แกนหลักคือคอมพิวเตอร์ที่ขนานสูงบนพื้นฐาน RISC-V และมีส่วนขยายเพื่อจัดการงาน GPU ได้ดีขึ้น
บอร์ดที่รันได้จริงราคาหลายพันดอลลาร์ จึงไม่เป็นมิตรกับงานอดิเรกนัก แต่ก็เข้าถึงได้มากกว่าการพัฒนาแบบกรรมสิทธิ์ปิดอย่างชัดเจน เมื่อไม่กี่เดือนก่อนก็มีรีลีส 2.0 ออกมาด้วย
[1]: https://vortex.cc.gatech.edu/
ในบล็อกพูดถึง Xilinx Kria SoM แต่พอตามลิงก์ไปดูสเปกโมดูล ดูเหมือนข้างในเป็น ARM SoC ไม่ใช่ Xilinx FPGA ผมอาจพลาดอะไรไปเพราะไม่คุ้นกับโลก FPGA ก็ได้
https://www.amd.com/en/products/system-on-modules/kria/k26/k...
อย่างที่กล่าวไว้ในส่วนอื่นของเธรดนี้ Kria SoM เป็นโครงสร้างที่มีทั้ง FPGA fabric และคอร์ ARM แบบฮาร์ดที่ทำหน้าที่ควบคุม นอกจากตอนนั้นจะหาซื้อได้ และบอร์ดพัฒนา Kria ก็ถูกมากราว 350 ดอลลาร์แล้ว อุปกรณ์เหล่านี้ยังมีสิ่งอย่าง hard DisplayPort IP ที่ผูกกับคอร์ ARM ทำให้สามารถโยนงานอย่างเอาต์พุตวิดีโอและเสียงไปให้เฟิร์มแวร์จัดการได้
เวอร์ชันก่อนหน้าของโปรเจกต์นี้รันบน Zynq 7020 และตอนนั้นต้องเขียนส่วนที่เกี่ยวกับ HDMI เอง แม้จะไม่ซับซ้อนมาก แต่ก็กินลอจิกค่อนข้างเยอะ และถ้าทำให้ตั้งค่าได้ก็จะซับซ้อนขึ้นมาก
แค่การออกแบบบอร์ด FPGA และ bring-up ตามที่เขียนในบล็อกก็เป็นกำแพงที่สูงอยู่แล้ว หวังว่าสักวันหนึ่งจะมีการเปิดเผย schematic และซอร์ส
[1] https://docs.amd.com/v/u/en-US/zynq-ultrascale-plus-product-...