「ステージングバッファ」の版間の差分
Administrator (トーク | 投稿記録) 編集の要約なし |
|||
| 1行目: | 1行目: | ||
'''ステージングバッファ'''([[英語]]:staging | '''ステージングバッファ'''([[英語]]:staging buffer)とは、 | ||
* [[CPU]]は[[VRAM]]にアクセスできない | |||
* [[GPU]]は[[メインメモリ]]にアクセスできない | |||
という問題を解決すべく確保される中継用のメモリ領域のことである。 | |||
CPUはVRAMにアクセスできないのならば、 | |||
* メインメモリにステージングバッファを確保して、 | |||
* VRAMの内容を丸々コピーすればいい | |||
という考え方である。 | |||
[[コンピュートシェーダー]]([[GPGPU]])では計算結果を取り出すのに必須の概念である。 | |||
なお、[[CUDA]]では全自動で実行されるので意識する必要がない。 | |||
== 概要 == | == 概要 == | ||
| 21行目: | 32行目: | ||
[[GPU]]は[[メインメモリ]]にアクセスできないのでステージングバッファはVRAM上に確保される。ステージングバッファからメインメモリへの転送は無駄に思えるが構造的に仕方がない。 | [[GPU]]は[[メインメモリ]]にアクセスできないのでステージングバッファはVRAM上に確保される。ステージングバッファからメインメモリへの転送は無駄に思えるが構造的に仕方がない。 | ||
== 備考 == | |||
最近では「ステージングバッファへのコピーは無駄な処理」という考えのもと、 | |||
[[CPU]]から[[VRAM]]にアクセスできるようにしてしまう「[[hUMA]]」などという新機能も提案されている。 | |||
2021年4月2日 (金) 02:35時点における版
ステージングバッファ(英語:staging buffer)とは、
という問題を解決すべく確保される中継用のメモリ領域のことである。
CPUはVRAMにアクセスできないのならば、
- メインメモリにステージングバッファを確保して、
- VRAMの内容を丸々コピーすればいい
という考え方である。
コンピュートシェーダー(GPGPU)では計算結果を取り出すのに必須の概念である。 なお、CUDAでは全自動で実行されるので意識する必要がない。
概要
CPU上で「構造体の配列」などとして作成したバーテックスバッファなどの各種バッファは、GPUに転送されると内部的に「GPUが処理しやすい」ように再配置が行われ、CPU側からは再度読み取れなくなる。基本的には一方通行だ。
しかしながら「再度読み取りたい」という需要が一部にあった。
たとえば高水準の3Dモデルの読み込みライブラリなんかを使用すると、わずか1行で3Dモデルを読み込めたりして便利ではあるが、「頂点の座標」などの細かい情報は得られないことがある。その一方で物理演算エンジンには3Dモデルのその見えない座標情報を求めるものが多い。この両方を使いたい場合にドハマリする。いわゆる「階層化の有害性」だ。
さらにコンピュートシェーダーの普及で「再度読み取りたい」という需要が激増した。
そこで最近のGPUには「CPUが処理しやすい配置に変換コピーするコマンド」が用意されており、そのコピー先となる一時バッファ的な「ステージングバッファ」というものが生まれた。
手順的にはこんな感じだ。
- ステージングバッファを確保する
- 頂点バッファなどをステージングバッファに変換コピーする
- ステージングバッファをメインメモリに単純コピーする
- ステージングバッファを解放する
GPUはメインメモリにアクセスできないのでステージングバッファはVRAM上に確保される。ステージングバッファからメインメモリへの転送は無駄に思えるが構造的に仕方がない。
備考
最近では「ステージングバッファへのコピーは無駄な処理」という考えのもと、 CPUからVRAMにアクセスできるようにしてしまう「hUMA」などという新機能も提案されている。