Asahi Linux開発者のVTuberが「AppleのM1 GPUをLinuxで動作させるためのドライバー開発」について語る

GIGAZINE



Apple独自開発のSoCであるM1チップを搭載したMacでの動作を目指すLinuxディストリビューション・Asahi Linuxの開発に携わる開発者兼VTuberの朝日リナ氏が、M1 GPUのドライバー開発についてAsahi Linux公式ブログで解説しています。

Tales of the M1 GPU – Asahi Linux
https://asahilinux.org/2022/11/tales-of-the-m1-gpu/

リナ氏によれば、近年のGPUはほぼすべて、以下のようなメインコンポーネントで構成されているとのこと。

・ユーザー定義のプログラムを実行して三角形(頂点データ)とピクセル(フラグメントデータ)を処理する「シェーダーコア」
・三角形を画面上のピクセルに変換する「ラスタライズユニット」「テクスチャサンプラー」「レンダー出力ユニット」、およびシェーダーと一緒に動作するその他のビット
・アプリから描画コマンドを受け取り、それらを処理するシェーダーコアを設定する「コマンドプロセッサ」
・GPUを使用して特定のアプリに属するメモリ領域へのアクセスを制限し、異なるアプリがクラッシュしたり干渉したりできないようにする「メモリ管理ユニット(MMU)」

これらのコンポーネントを合理的かつ安全に扱うために、最近のGPUのドライバーは「ユーザー空間ドライバー」と「カーネルドライバー」の2つに分かれています。ユーザー空間ドライバーはシェーダープログラムのコンパイルと、OpenGLVulkanなどのAPI呼び出しをコマンドプロセッサのコマンドリストに変換する役割を担います。一方、カーネルドライバーはMMUを管理してアプリごとにメモリを割り当てたり、コマンドプロセッサにコマンドを送信する方法やタイミングを決定します。

ユーザー空間ドライバーとカーネルドライバーの間には、各GPU系用にカスタマイズされたカスタムAPIが存在します。これらのAPIはドライバーごとに異なり、LinuxではUAPIと呼ばれます。UAPIによって、ユーザー空間ドライバーがメモリの割り当てや解放をカーネルドライバーに依頼したり、コマンドリストをGPUに送信したりすることが可能になります。つまり、Asahi LinuxでM1のGPUを動作させるためには、M1 GPUのユーザー空間ドライバーとカーネルドライバーの2つが必要になると、リナ氏は解説しています。

Asahi Linux向けのM1 GPUドライバーで先に出来たのは、ユーザー空間ドライバーでした。2021年1月に、Asahi LinuxプロジェクトでGPU関連を主導しているAlyssa Rosenzweig氏が開発開始から1カ月も経たないうちに、リバースエンジニアリングによって三角形をレンダリングすることに成功しました。


当時はまだカーネルドライバーは開発されていませんでしたが、Rosenzweig氏はmacOSのGPUドライバーのUAPIをリバースエンジニアリングし、メモリを割り当てて独自のコマンドをGPUに送信することで、ユーザー空間ドライバーの動作に成功しました。その後、Rosenzweig氏はLinuxのユーザー空間グラフィックスライブラリであるMesa用のM1 GPU OpenGLドライバーを開発し、その後OpenGL ES 2.0適合性テストの75%をクリア。さらにRosenzweig氏は、2022年8月には、M1 GPUのOpneGLドライバーを使って実際にゲームをプレイすることに成功したと発表しています。

そこで、リナ氏はカーネルドライバーの開発に着手しました。最初の数カ月は、M1 GPU向けにApple Silicon用最小開発環境であるM1N1ハイパーバイザーの開発と改善に取り組んでいたそうですが、その中でM1 GPUの特殊さに気付いたとのこと。

通常、カーネルドライバーはMMUによるメモリの管理とコマンドのスケジューリングをメインに行います。しかし、M1のGPUには「ASC」と呼ばれるコプロセッサがあり、このASCがAppleファームウェアを実行してGPUを管理します。ASCは「RTKit」と呼ばれるApple独自のリアルタイムOSを実行する完全なARM64 CPUで、電源管理やコマンドのスケジューリング、障害回復、パフォーマンスカウンター、温度測定などすべてを管理しているとのこと。そのため、macOSのカーネルドライバーはGPUと直接通信することはなく、すべてファームウェアを介して実行され、共有メモリ内のデータ構造を使用して何をすべきかを指示します。リナ氏によれば、このデータ構造が非常に複雑である上に、GPUファームウェア自身と一緒に共有カーネルアドレス空間にあるため、共有メモリ内のデータ構造だけをユーザー空間に移動させてレンダリングコマンドを設定させるのは無理だとのこと。

そこで、リナ氏はM1N1ハイパーバイザー向けにPythonでデータ構造を記入していたのを利用し、PythonでのM1 GPUのカーネルドライバー開発を始めたとのこと。このPythonで書いたカーネルドライバーを使ってレンダリングした三角形が以下。

????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????? pic.twitter.com/dz68hvalLv

— Asahi Linya / 朝日りにゃ〜 // @[email protected] (@LinaAsahi)


ただし、リナ氏によればこの三角形の表示はあくまでもプロトタイプによるデモンストレーションに過ぎないとのこと。そこでリナ氏は、LinuxのDRMカーネルインターフェースをモックしてユーザー空間のダミー処理に置き換えるライブラリ「drm-shim」上でRosenzweig氏が開発したM1 GPU OpenGLドライバーを動作させ、VTuberの2Dアバターを動かすツール・Inochi2Dを実行。さらにPythonインタープリターを組込み、M1N1開発フレームワーク上でPython製カーネルドライバーにコマンドを送り、本物のM1搭載MacとUSB経由で通信してデータをやり取りし、GPUファームウェアと連携して自分のアバターをレンダリングできるかどうかをテストしました。

その結果が以下。なめらかな表示はできていませんが、レンダリング自体には成功しています。ほかにもデスクトップ環境「GNOME」やウェブブラウザのFirefoxなどのGUIを動作させることにも成功しています。


その後、プログラミング言語のRustがLinuxカーネルに正式採用されるというウワサが流れました。リナ氏によれば、RustはGPUドライバーを記述するにはかなり有利な言語であると考え、Rustの勉強を始めたとのこと。リナ氏は「Rustを使えば使うほど、Rustが好きになりました。Rustのデザインは、良い抽象化とソフトウェアデザインに導いてくれるように感じます。コンパイラは非常にうるさいですが、一度コードがコンパイルされれば、確実に動作するという確信を与えてくれます。時には、自分が使おうとしている設計にコンパイラが満足せず、その設計に根本的な問題があることに気づくこともありました」と語っています。

通常、複雑なカーネルドライバーを一から作成する場合、メモリリークをはじめとするさまざまな問題が噴出するそうですが、Rust製のGPUドライバーでは、いくつかのロジックバグとメモリ管理の問題を修正するだけで済んだとのこと。その結果、Rust製のカーネルドライバーは2022年10月にOpen GL適合性のテストを99%合格しています。

Apple M1環境でLinuxを動かす「Asahi Linux」のGPUドライバーがついに99%以上という成績でテストをパスしたという報告 – GIGAZINE


また、2022年11月にはAsahi Linux上でゲーム「マインクラフト」を動かすことに成功したと報告されています。


ここまで開発が進められたドライバはOpenGL対応のものですが、Vulkan対応については開発途上とのこと。ただし、2022年11月23日にはVulkanによる立方体の描画に成功しています。記事作成時点で使っているUAPIがまだプロトタイプであるため、将来的にVulkanを完全サポートするドライバーを開発するためには、UAPIを追加あるいは再設計する必要があるとリナ氏は述べています。


なお、M1 GPUドライバーのビルドとインストールは非常に複雑で、記事作成時点ではまだリリースは難しいとのことですが、リナ氏は2022年末までにオプトインテストビルドとしてAsahi Linuxに導入したいと考えているそうです。

この記事のタイトルとURLをコピーする

Source

タイトルとURLをコピーしました