カスタムCPUでDOOMを実行し、動画が200万回再生された
TL;DR: Liam、Ryan Tang、Ozkl は1993年にid Softwareがリリースしたゲーム「DOOM」をロジックゲートレベルから設計したカスタムCPUで実行することに成功した。FPGAに展開されたこのシステムは最終的に15~20 FPS でDOOMを実行でき、その9秒間の動画は200万回以上の再生数を獲得した。
ゲームの伝説「何にでも DOOM は動く」を文字通りに実証するため、3人の開発者が自作のカスタムCPUを構築した。「DOOM は1993年にid Softwareがリリースしたビデオゲームである。ゲーム業界に革命をもたらし、世界中に広がり、現代のFPSを定義した」と説明される通り、その人気の高さから「DOOM は何にでも動く」という言葉が生まれ、マイコンからトースターまであらゆるデバイスへの移植が行われてきた。
CPU設計と構成
設計されたカスタムCPUは「ロジックゲートレベルで設計し、周辺機器を接続し、DOOM のソースコードを自分たちのマシンで動くよう改造し、FPGAにデプロイしてリアルタイム実行した」ものである。CPUは5段パイプライン設計(命令フェッチ、デコード、レジスタ読み込み、実行、ライトバック)を採用し、ICache とDCache はそれぞれ2048本のキャッシュラインを持ち、1本あたり4ワードのデータを格納する。キャッシュラインには有効ビットとダーティビットの2つのステータスビットが含まれる。メモリアクセスはDCache をDCache より優先する統一インターフェースで抽象化された。
クロック周波数は初期の100 MHz から125 MHz に引き上げられ、これにより20%のフレームレート向上が実現された。
パフォーマンスの最適化プロセス
DOOMは元々14メガバイトのshareware版(doom1.wad)であり、FPGAのBRAMが1メガバイト未満という制約下での実行は多くの課題をもたらした。初期のパフォーマンスは0.7 FPS にとどまっていた。段階的な最適化により、フェッチステージの修正で2.5 FPS、乗算演算子の実装(RV32I-ZMMUL対応)で3.5 FPS、キャッシュ読み込みのパイプライン化とVGA書き込み戦略の修正で6.7 FPS へと向上した。
最終的にはコンパイラ最適化を行うことで15~20 FPS の実用的なパフォーマンスを達成した。この過程では、ハードウェアタイマーのMMIOポインタが volatile として マークされていなかったため、コンパイラによって最適化されるという問題も発見・修正された。
周辺機器の実装
Xilinx の Memory Interface Generator(MIG)を用いてDDR3メモリインターフェースが実装され、Clock Domain Crossings(CDC)とFIFOによりタイミングの問題に対応した。VGAコントローラは12ビットカラー対応で構築され、HDMIに接続された。ハードウェアタイマーはマイクロ秒単位で時間を追跡し、UARTトランスミッターは出力用のFIFOバッファを備え、UARTレシーバーはラップトップからのキープレス入力を受け取った。
ポーティングと検証
Doomgeneric を使用してポーティングプロセスを簡略化したが、ファイルシステムの問題、レンダリングの課題、printf の問題など複数の障害に直面した。バグはCPUの設計エラー(無限ループやランダムジャンプ)を露呈させ、初期段階ではメモリが初期化されていないため、メモリ領域がゼロで埋められていないというハードウェア側の問題によりDOOMが動作しなかった。これらの課題を段階的に解決し、最終的に9秒間の動画として実行例を投稿したところ、現在200万回以上の再生数を達成している。
筆者の見立て
- 「DOOM は何にでも動く」という解釈をしている
- 「自分たちの実装でDOOMが動くことに驚いている」という意見を示している
- 「アウト・オブ・オーダー処理とその他の最適化により、最終的に30 FPS に到達することを期待している」と予想している
この記事は元記事の事実のみに基づいて自動生成されました。
出典
元記事: Running DOOM on our Custom CPU and Going Viral URL: https://www.armaangomes.com/blogs/doom/