FuryGpu: カスタムPCIe FPGAグラフィックス処理ユニット
(furygpu.com)- 最新PCで実際の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 ランタイムドライバ、その API を使うように移植した Quake まで含みます。
ただし、勤務先に関係する法的な問題を整理する必要があり、ライセンスなどの細部も決めなければなりません。本業ではありませんが、十分に隣接した分野なので慎重に進める必要があります。
このプロジェクトの最初のコミットは 2021年8月22日で、2年半少し作業してきました。途中で記事は書いていませんが、YouTube の FuryGpu プレイリスト(https://www.youtube.com/playlist?list=PL4FPA1MeZF440A9CFfMJ7...)には、進捗をおおまかに見られる動画がかなりあります。
次のブログ記事は PCIe インターフェースについての内容になる予定で、PCB の回路図/レイアウトから始まり、FPGA 設計、Windows ドライバへと続く複数回のシリーズになりそうです。Texture Unit の記事を 1 本書いただけでも、こうした技術記事を一定のペースで書き続けている人たちへの尊敬がさらに深まりました。
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 を選びました。
実際に動画を最後まで見る人は 10 万人未満だと思いますし、その中で何かを自分でやってみる人はさらに少ないでしょう。今の時代にしては、趣味の電子工作は意外と小さな世界に感じます。
読んでみると、何よりも楽しみでやっている趣味プロジェクトで、どう作ったのかについて今後たくさん記事を書くつもりのようです。
特にスタック全体が動作している点が印象的です。Windows ドライバがカスタムグラフィックス API を実装し、その上で Quake が動きます。DX/GL 対応がないのは惜しいですが、なぜカスタム API の道を選んだのかは十分理解できます。
設計をオープンソースとして公開するのか気になります。
単に「シェーダ」だけの問題ではなく、OS のウィンドウマネージャだけでも動作するにはかなり多くの要件があります。この分野の一般的なプレイヤー、つまり AMD、Nvidia、Intel、Imagination などは、20年以上発展してきた技術の上に漸進的に積み上げてきたものです。
この1年ほど、入出力の制約が大きいマイクロコントローラ向けの2D中心のGPUに取り組んできた(https://github.com/KallDrexx/microgpu)。遅いSPIデバイスでも大きなディスプレイにユーザーインターフェースをレンダリングできるようにしたもので、作業はとても興味深かった。
ただ、プロセッサパイプラインの限界を見ていると、FPGAならもっと高速にできるのではないかと考えるようになった。最近、低価格のFPGAをいくつか手に入れ、ESP32ベースのmicrogpuをFPGAベースに置き換えるために学び始めたところ。
子どもたちや自由時間の制約があるので、このレベルまで到達できるかは分からないが、この100分の1のレベルでもやってみたい。
「基本的な」1080p RGB 60Hz信号だけでも、純粋なFPGAロジックだけで扱うには非常に難しい高周波信号処理が必要になる。
語るに値するオープンハードウェアGPUはほとんどない。ライセンス次第ではあるが情報を見つけられず、これが最初の事例であり、さらに多くの取り組みの出発点になるかもしれない。
https://github.com/asicguy/gplgpu
https://github.com/schlae/graphics-gremlinはMDA/CGA互換アダプタ。
https://github.com/OmarMongy/VGAはVGAコア。
https://github.com/archlabo/FrixはVGAを含む完全なIBM PC互換SoC。
欲しいのは単体のM.2 GPUだけだ。性能は控えめでよく、Intel UHD Graphics、AMD Radeon、Qualcomm Adrenoのような内蔵GPU程度でいい。
計算とネットワーキングは多く必要だが、グラフィックス能力はごく少しだけでよい小型組み込み製品のアイデアがある。NXP Layerscape LX2160A [1]はほぼ完璧だったが、内蔵GPUがないため断念せざるを得なかった。単に小さなGPUが必要なのだ。
[1]: https://www.nxp.com/products/processors-and-microcontrollers...
性能は現代の内蔵GPUにはまったく及ばない。内蔵GPUはシステムメモリ、キャッシュ、電力枠をすべて活用できるが、単純なM.2デバイスにはそれがない。ローエンドのPCIe GPU、つまりシングルスロットのハーフレングス/ハーフハイトカードでさえ、優れた内蔵GPUを超えるのは難しく、基本的な表示機能がどうしても必要な場合にだけ意味がある。
あわせて見る価値があるものとして、Georgia TechのVortexプロジェクトがある[1]。GPU設計の固定機能の過去を繰り返すのではなく、未来を見据えたアプローチに見える。中核はRISC-Vベースの高度に並列化されたコンピュータで、GPUワークロードをよりうまく処理するための拡張が入っている。
実行用ボードは数千ドルするのでホビー用途には優しくないが、閉鎖的なプロプライエタリ開発よりは確実にアクセスしやすい。数か月前には2.0リリースも出た。
[1]: https://vortex.cc.gatech.edu/
ブログではXilinx Kria SoMと言っているが、リンク先のモジュール仕様を見ると、Xilinx FPGAではなくARM SoCが入っているように見える。FPGAの世界に詳しくないので、何か見落としているのかもしれない。
https://www.amd.com/en/products/system-on-modules/kria/k26/k...
このスレッドの別の場所でも述べたように、Kria SoM は FPGA ファブリックと、制御を担当するハード ARM コアが同居する構成です。当時入手可能で、Kria 開発ボードが 350 ドル程度と本当に安かったことに加え、これらのデバイスには ARM コアに接続されたハード DisplayPort IP のようなものも含まれており、映像出力やオーディオなどの処理をファームウェアに任せられます
このプロジェクトの以前のバージョンは Zynq 7020 で動いていて、そのときは HDMI 関連部分を自分で書く必要がありました。ものすごく複雑というわけではありませんが、かなりのロジックを消費し、設定可能にしようとするとずっと複雑になります
ブログ記事にあるように、FPGA ボードを設計して bring-up するだけでもすでに高いハードルです。いつか回路図とソースが公開されるといいですね
[1] https://docs.amd.com/v/u/en-US/zynq-ultrascale-plus-product-...