M4で212FPSを叩き出す
M4 Mac MiniでMinecraftを212fpsで動かしたり、ブラウザでWebGLをスムーズにレンダリングさせるには、どれだけの低レイヤー開発が必要だろうか?Apple Silicon向けのLinuxドライバ開発は、かつては過酷なマラソンだった。M1時代のカーネルドライバは、Asahi Linaが毎日12時間働き続けて力技で完成させたものだ。しかし今回、開発者のCody HoとNiklasは、この数年がかりのエンジニアリングをわずか1ヶ月に圧縮し、OpenGL ES 3.0互換のGPUドライバをゼロから立ち上げた。
ここに企業秘密の漏洩はない。彼らはクリーンルーム設計によるリバースエンジニアリングを採用し、Appleのバイナリを一切見ることなく、自作のシェーダーとハードウェアの実行トレースだけを頼りに手探りで開発を進めた。ブラックボックスのエコシステムであっても、実際の実行シグナルさえ傍受できれば、コミュニティは代替品を作り出すことができるのだ。
図: ChromeとFirefoxがこのドライバで正常にレンダリングしている。ソース: codyho.dev
ドライバを真っ二つに割ったApple
現代のApple Siliconでドライバを書く際の最大の障壁は、Apple独自のファームウェアABI(アプリケーションバイナリインターフェース)である。従来のカーネルドライバはハードウェアと直接対話するが、Appleのアプローチはドライバを2つに分割している。半分はRTKitと呼ばれるカスタムOS内にファームウェアとして組み込まれ、もう半分は共有メモリ内のデータ構造を介してホストと通信する。
M4およびA18 Proチップでは、この通信メカニズムはM1時代よりもさらに複雑になっている。データ構造の数は1.5倍に増え、ポインタの数は倍増し、レンダリングジョブを送信するワークフローは迷路のようだ。ファームウェア専用のフィールドとホスト制御のフィールドが複雑に絡み合っており、これを解きほぐすのは容易ではない。
ドキュメントを読むより「力技」が勝る
このメカニズムをどうやって解明するのか?Cody Hoが持ち出したツールは、macOSの実際のハードウェアの挙動を正確に記録するための自作のハイパーバイザだった。そして、大規模言語モデル(LLM)のAgentをパイプラインに投入し、ブラインドテスト(盲打ち)を実行させた。
Agentの操作は非常にシンプルだ。最初のファームウェア可視イベントが現れるのを待ち、GPUのメモリ状態を丸ごと保存する。再起動後、その状態をそのままホストメモリにコピーして実行をトリガーし、出力ページのメモリの変化をひたすら監視する。
間違っていれば、ポインタやフィールドを調整して再度実行する。実験が進むにつれて、ハードコピーが必要なメモリページは減っていき、最終的にはすべてをコードでゼロから構築できるようになった。GPUドライバ開発は、頭を悩ませる論理的推論から、高頻度の試行錯誤のループへと変化したのだ。
図: M4 Mac Miniで212fpsに達したMinecraft。ソース: codyho.dev
計算力よりも純粋なデータが重要
しかし、この試行錯誤のアプローチはコンピュート(Compute)モジュールで壁にぶつかった。グラフィカルインターフェースの下では、コンピュートジョブは常に大量のレンダリングタスクの後ろにキューイングされるため、記録された実行トレースは336MBにも達し、無関係なノイズだらけになってしまった。Agentは自力でオブジェクトを構築しようと1週間以上行き詰まり、全く進展がなかった。
解決策はエンジニアリングの直感に立ち返ることだった。Cody Hoはグラフィカルインターフェースをオフにしてシングルユーザーモードに入り、グラフィックスインターフェースが利用可能になった瞬間に小さなプログラムを実行して、極小で純粋なコンピュートの実行トレースを抽出した。このデータは数時間で解析され、数日後にはコンピュートモジュールが正常に動作するようになった。Agentに300MBの汚いデータを食わせるよりも、確定的な結果を出力する足場を数時間かけて構築する方がはるかに良い。
封鎖がアクセラレータに変わった
Appleがブートチェーンを厳格化したことで、オープンソースコミュニティはMac上でLinuxを動かすために独自のドライバを開発せざるを得なくなった。この一見最も困難な選択が、記録・再生メカニズムと自動化ツールの組み合わせによって、皮肉にも近道となった。
チームの数年分の開発量を1ヶ月に圧縮できたのは、モデルが突然低レイヤーの悟りを開いたからではない。開発者がハイパーバイザを使って複雑なシステムのブラックボックスを、無限にリセット可能で結果がすぐに出る実験場に変えたからだ。クローズドなファームウェアのドキュメントを読むという道は閉ざされたが、超高速のフィードバックループを通じたブラインドテストという道は開かれていたのだ。
参考リンク:
- Cody Ho:1ヶ月でGPUドライバをゼロから構築する
- Asahi Linux プロジェクト(M1/M2 カーネルドライバの背景)