イベント
[GDC 2023]Windowsの新ファイルシステム「DirectStorage」でSSD時代のPCゲームローディングは爆速化する
セッションタイトルは「DirectStorage〜Optimizing Load-Time and Streaming」だ。 |
David Ziman氏(Senior Member of Technical Staff) |
まずはDirectStorageが登場した背景から説明しよう。
一般的なソフトウェアと同じく,ゲームもメインメモリにあるプログラムをCPUで実行して動作する。そのときに,さまざまなデータをストレージから読み出して,メインメモリやGPUのグラフィクスメモリに配置するのだが,従来はHDDを想定したファイルシステムが介在することで,SSDのパフォーマンスを十分に発揮できなかった。また,圧縮したデータの展開にCPUを要することも多く,システムメモリで展開したデータをグラフィクスメモリに転送する工程自体がボトルネックとなるケースもあった。
PlayStation 5(以下,PS5)や,Xbox Series X/S(以下,XSX)といったゲーム機では,このボトルネックを解消するストレージ高速化技術を採用した。PS5では,SoC(System-on-a-chip)に統合した独自のI/Oコントローラを中核とする高速データローディングシステム(関連記事)を,一方のXSXでは「Xbox Velocity Architecture」を搭載している。
PCゲームでも,こうしたストレージ高速化技術が求められ,ゲーム機を後追いする形で,MicrosoftのマルチメディアコンポーネントAPI「DirectX」に追加されている(関連リンク)。
今回の講演を行ったAMDのDavid Ziman氏(Senior Member of Technical Staff)は,「DirectStorageが搭載されるまで,Windowsのファイルシステムは,ゲーム向けの設計になっていなかった」と話す。
そもそもの大前提として,Windowsでは,ファイルにアクセスするときに,ファイルシステム層を介すのが必須とされている。加えて,パーティションマネージャやボリュームマネージャからも情報を取得する必要がある。このほかにも,ファイルシステムによるデータ圧縮や暗号化といったサブシステムの介入まで受け入れなければならず,即時的な処理が求められる用途への配慮が少なかったのだ。
これまでは,ゲームを含めた多くのソフトウェアにおいて,ストレージに対して,一度に読み書きするデータの容量がそれほど大きくなかったり,同時多発的なデータの読み書きが多くなかったりしたため,Windowsのファイルアクセスによる問題が目立たなかった。
その一方で,Ziman氏によると「ゲームが必要とするデータ量が大幅に増えたことで,従来のファイルアクセスの仕組みでは,ストレージが高速化しても理想のパフォーマンスが出せなくなってきた」という。
ゲームにおいては,あるデータを読み出すときに,そのデータに関連したデータを読み出す,さらにそのデータに関連したデータを……といった状況が起きる。Ziman氏も「ゲームでは,Dependency(ここでは依存性よりも従属性という意味が強い)を伴った,連続的なストレージデバイスへのアクセスが頻発する」と話す。
さて,SSDの場合,PCI Express(以下,PCIe) Gen 5接続に対応した製品は,理論値最大10GB/sの転送速度を実現している。また,ハイエンド市場向けGPUでは,グラフィックスメモリの容量が16GBを超えるようになってきた。
もし,この容量16GBのグラフィックスメモリへ,データを転送するときにかかる時間は16GB÷10GB/sなので,2秒未満となるはずだ。しかし,実際はデータのアクセスにさまざまなボトルネックがあり,30秒以上かかることもある。
ストレージ本来のスペックから考えると,読み出し時間は2秒前後になるはず |
実際は30秒以上かかる |
Windowsの標準のファイルシステムでも,一度に読み込ませるブロックサイズを大きくして,ストレージへのキュー深度(Queue Depth:ここでは,ストレージが同時に処理できる命令数という意味)を上げると,ブロックサイズが大きければ大きいほど,ファイルアクセスの実行速度は向上する。
Queue Depthが1の場合における,ブロックサイズごとのデータ読み出し速度(MiB/s) |
Queue Depthが64の場合におけるデータ読み出し速度 |
ただし,ストレージの性能を引き出すには,ブロックサイズとQueue Depthの最適化が必要になる。
DirectStorageはWindows 11でフルパワーを発揮する?
こうした問題を解決するために誕生したのが,DirectStorageということになる。
グラフィックス関連データを従来のシステムで,GPUのグラフィックスメモリに読み出したときのフロー図 |
DirectStorageを活用すると,データを読み出すまでのプロセス数は従来と変わらないが,CPUで行う処理が激減する |
Ziman氏によると,DirectStorageは,Windows 10とWindows 11の両方に対応しているのだが,Windows 11でのみで利用できるファイルアクセスの仕組みがあるという。
1つめは,「Bypass I/O」だ。これは,ファイルにアクセスするときに,ファイルシステムやボリュームマネージャ,パーティションマネージャへのアクセスを飛ばして,ストレージのデータを読み出すものである。NVMe対応SSDでのみ利用できるそうだ。
ただ,Bypass I/Oは,Windowsの暗号化機能「BitLocker」や,ファイルシステムの圧縮機能,暗号化機能が有効なボリュームでは動作しないという。これは,DirectStorageが,SSDから読み出したデータを直接利用する仕組み上,仕方がない面と言えよう。PCゲームファンからすると,ゲームをインストールするドライブには注意する必要があるということでもある。
2つめは,ファイルにアクセスするときに必要な入出力に関する要求と,完了の通知についてCPUを介さずに自動処理する「IORing File API」だ。
Windows 10では,この2つの仕組みが利用できないため,DirectStorageの効果を十分に発揮できるとは言い難い。Windows 10を使い続けているゲーマーも,そろそろWindows 11へ移行したほうがよいのかもしれない。
また,さまざまな事情によって,DirectStorageを意図的に無効化(CANCELLATION)する仕組みも備わっている。たとえば,ゲームにおける特定の場面において,DirectStorageによってフレームレートが落ちたり,遅延が増えたりする,あるいはそれが予想できる場合に行われるとのことだ。
Ziman氏は,「SSDやCPU,GPUの性能がそれほど高くない低スペックのPC環境では,DirectStorageの無効化を検討する場合がある」と述べる。
圧縮データの展開をGPUで実行可能に
「DirectStorageにおいて,読み出したデータは圧縮されていることが望ましい」とZiman氏は話す。それは,ストレージが使用する容量を節約できるというだけでなく,データへのアクセス効率が向上するというメリットもあるからだ。
SSDとメモリ間は,圧縮した小さなデータで転送して,メモリ上でデータを展開すれば,「帯域の使用率を抑えつつ,大量のデータを読み込めた」ことになる。
仮にPCIeやグラフィックスメモリの帯域幅が広くても |
根本となるストレージの帯域が7.8GB/sならば,伝送路全体の転送速度は,最終目的地となるグラフィックスメモリまで7.8GB/sのままだ。そのため効率的なデータ伝送が必要になる |
データ圧縮の標準的手法として,DirectStorageでは「GDeflate」という技術を採用している。
Ziman氏は,GDeflateを「圧縮と展開の両方において,GPUで実行するのに最適化された圧縮技術」と評価した。Microsoftも,基本的にはGDeflateの利用を推奨しているそうだ。
もちろん,ゲームの都合で,独自の圧縮技術を用いることも可能だ。ただ,独自技術で圧縮したデータをGPUで展開するのは,技術的に不可能ではないが,難度が高いだろうとのこと。
読み出したデータの展開については,「CPUで実行する」オプションと,「GPUで実行する」というオプションが選択できる。読み出したデータがCPUで実行するプログラムに関連したものであるならば,CPUでデータを展開してメインメモリ上に置くのは自然な選択だ。また,独自の圧縮技術を使ったデータを展開する場合は,先に触れたようにGPUでの処理が難しいことから,CPUでの実行となるそうだ。
その一方で,読み込んだデータがグラフィックス関連データであれば,GPUに任せたほうがいいだろう。
最近のCPUは,マルチコアを有効に活用すれば,複数の圧縮データを並列に展開できる。「データの種別や圧縮に使用する技術によっては,GPUで実行するのが正しいとは言い切れないかもしれない」とZiman氏は説明していた。
なお,DirectStorageでは,何らかの事情がある場合,「圧縮をしない」という選択肢も選べるようになっている。
DirectStorageの効果は?
細かな最適化は必要となるものの,DirectStorageを使うことで,CPUの負荷が低減するほか,ファイルの入出力を高速に行えるようになる。そのため,Ziman氏は「基本的にDirectStorageは,使って損がない機能である」と話す。
ただし,DirectStorageは活用の仕方や,状況によっては,理想どおりの効果を発揮しないこともある。実装後もこまかな最適化を行う必要があるという |
それでもDirectStorageで得られる効果は大きい |
とくに開発中のゲームが,PS5やXSX,PCでのリリースを予定する場合には,ゲーム機が採用するファイルアクセスの仕組みに近いDirectStorageは導入しやすいように思える。
続いて,Ziman氏は,AMDが開発したDirectStorageの技術デモを披露した。これは,一人称視点のゲームを模したデモで,ゲームフィールドをうろうろしていると,突然,ロボット(BusterDrone)やUFO(CommandModule),スペースシャトル(SpaceShuttle),軽飛行機(X1),ラジカセ(BoomBox)といったオブジェクトが出現するというものだ。なお,括弧内の表記は後に紹介するグラフの項目名に対応している。
このデモで出現する3Dオブジェクトは,その都度,DirectStorageで読み出しているという。このデモでは,出現するまでの時間を「DirectStorage(有効/無効)」「データ圧縮(あり/なし)」「データ展開の実行(CPU/GPU)」といった組み合わせで,比較できるようになっている。
条件ごとにDirectStorageの性能を比較することができる |
テストを実行すると,色で動作状況を表示する。このスライドでは,右上の「DirectStorage有効かつ,GPUでデータ展開」の場合が,常に一番乗りで緑色になっており,ほかのケースよりも高速に処理できていた |
セッションの最後に,Ziman氏は,この技術デモを用いて計測したデータをもとにした,DirectStorageの分析と考察を紹介した。
まず,デモに登場した3Dオブジェクトに用いられているテクスチャをGDeflateで圧縮したときの圧縮率は,オリジナルサイズに対して3分の1〜8分の1サイズになっているようだ。
各3Dオブジェクトに適用されていたテクスチャのデータ容量 |
GDeflateによる圧縮率。(ただし,各テクスチャはDirectXでブロック圧縮する前の生画像ファイル) |
DirectStorage有効時と無効時の読み出し時間は,DirectStorage有効時が圧倒的に速かった。また,DirectStorage有効で,データ処理をCPUで行った場合とGPUの場合を比べると,GPUのほうが高速だったという。
結果は,「DirectStorageあり」の読み込み時間が「DirectStorageなし」より圧倒的に速く,圧縮データの展開は「GPUで展開」の方が「CPUで展開」よりもさらに速くなっている。なお,この結果から,データサイズが大きいほど,速度の向上率が高いことも見えてくる。
なお,このテストで用いたPCのスペックは,CPUが「Ryzen 9 7900X」,GPUが「Radeon RX 7900 XTX」,チップセットはX670E,メインメモリは容量32GBのDDR5-6000,SSDはNVMe対応とのこと。
気になるのは,圧縮データの展開にGPUを用いたことによる,グラフィックス描画への影響だ。これについて,Ziman氏は「影響はある」という。CPUでデータを展開したときと比べて,GPUでの描画処理は15〜20%低下したそうだ。この数字だけ見ると,かなり影響が大きそうに思えるが,実際はわずか10〜160msほどの影響に留まる。一般的なゲームでは,GPUによるデータ展開処理を短時間に一気行わず,時間方向に分散して行えば,問題はなさそうだ。
パフォーマンス低下率 |
データ展開に掛かった時間 |
上がDirectStorage有効,下がDirectStorage無効。水色の領域が,読み出した圧縮データを展開して,メモリに配置するまでのタイムラインとなる |
ただ,ゲームをする環境によって状況が異なるようだ。Ziman氏は,「エントリー市場向けのGPUでは,データ展開とグラフィックス処理の両方を行うのは難しいかもしれない。動作PCのスペックによっては,データ展開をCPUに任せたほうがいい場合もある」と改めて説明を加えた。ここは,ユーザーごとに使用するデバイスのスペックがバラバラなPCプラットフォームならではの難しい所だ。ゲームごとに,DirectStorageの動作をチューニングする必要があるということなのだろう。
4Gamerの「GDC 2023」記事一覧
- この記事のURL: