数日前 実験結果が公開されました の立ち上げに基づく組織 3D仮想空間内のLinuxカーネル オンラインマルチプレイヤーゲームの。
この実験 これはVRChatで行われ、独自のシェーダーを使用して3Dモデルをロードできます。。 考案されたアイデアを実装するために、RISC-Vアーキテクチャに基づくエミュレーターが作成されました。このエミュレーターは、ピクセルシェーダーの形式でGPU側で実行されます。
プロジェクトについて
エミュレーターは、C言語での実装に基づいています。 その作成には、ミニマリストのriscv-rustエミュレーターの開発が使用され、Rust言語で開発されました。 準備されたCコードは、VRChatへのロードに適したHLSL言語のピクセルシェーダーに変換されます。
エミュレータ rv32imasu命令セットアーキテクチャを完全にサポートし、 SV32メモリコントロールユニット および周辺機器の最小限のセット (UARTとタイマー)。 準備された機能は、VRChat仮想世界から直接対話できるLinuxカーネル5.13.5およびBusyBoxの基本的なコマンドライン環境をロードするのに十分です。
2021年250月頃、VRChatで完全なLinuxカーネルを実行できるエミュレーターを作成することにしました。 そのプラットフォームに固有の制限があるため、選択したツールはシェーダーである必要がありました。 そして、数か月の作業の後、最大2080 kHz(5.13.5 Tiで)で実行可能なHLSLピクセルシェーダーに世界初のRISC-V CPU / SoCエミュレーター(私が知っている)を導入できることを誇りに思います。 MMUをサポートするLinuxXNUMXを起動します。
エミュレーターは、独自の動的テクスチャー(Unity Custom Render Texture)の形式でシェーダーに実装され、実行時にエミュレーターを制御するために使用されるVRChat用に提供されたUdonスクリプトによって補完されます。
エミュレートされたシステムのメインメモリの内容とプロセッサの状態は、2048×2048ピクセルのサイズのテクスチャとして保存されるため、エミュレートされたプロセッサは250kHzで動作します。 Linuxに加えて、Micropythonもエミュレーターで実行できます。
Linuxを実行するには、少なくとも32 MiBのメインメモリ(RAM)が必要だと思いましたが、安全を確保して64にします。パフォーマンスの違いは大きくなく、十分なVRAMが必要です。
当初、主なパフォーマンスの懸念はクロック速度でした。 つまり、XNUMXフレームで実行できるCPUサイクル数です。
データストレージを整理するには 読み取りと書き込みのサポートを備えた永続的な、 長方形の領域にリンクされたカメラオブジェクトの使用に関連するトリックが使用されます シェーダーによって生成され、レンダリングされたテクスチャの出力をシェーダーの入力に向けます。 したがって、 ピクセルシェーダーの実行中に書き込まれたピクセルは、次のフレームを処理することで読み取ることができます。
ピクセルシェーダーが適用されると、テクスチャ内のピクセルごとに、シェーダーの個別のインスタンスが並行して起動されます。
この機能は実装を大幅に複雑にし、エミュレートされたシステム全体の状態を個別に調整し、処理されたピクセルの位置を、それにエンコードされたエミュレートされたシステムのCPUまたはRAMコンテンツの状態と比較する必要があります(各ピクセルは128ビットをエンコードできます)情報)。
この場合、シェーダーコードでは、perlプリプロセッサーperlppが使用された実装を簡素化するために、多数のチェックを含める必要があります。
ある人のために スペックに興味がある それは言及されています:
- コードはGitHubにあります
- 64 MiBのRAMからCPU状態を差し引いたものが、2048×2048ピクセル(128 bpp)の整数形式のテクスチャに格納されます。
- バッファスワッピングを備えたUnityカスタムレンダリングテクスチャにより、フレーム間の状態のエンコード/デコードが可能になります
- コンピューティングおよびUAVシェーダーはVRChatでサポートされていないため、ピクセルシェーダーがエミュレーションに使用されます
最後に あなたがそれについてもっと知りたいなら、詳細を確認できます 次のリンクで。