はかせのラボ

私の頭の中を書いていく雑記ブログです

DirectX 死体になった私はResources Barriersを調べた

あいさつ

どうも、はかせです。
今日も今日とてGPUと友達になるべく
がんばります。

今日の進捗

DXRやろうとして
f:id:hakase0274:20191004164806p:plain

DirectX12のサンプルで遊んでて
f:id:hakase0274:20191004164816j:plain

「ガッシ!ボカッ!」
はかせは死んだ。スイーツ(笑)

Resources Barriers

上記の件で今日の進捗は無に帰してしまったわけですが、
さすがあれで終わりでは芸がありません。

ということで茶番を終えてこの記事の本題である
Resources Barriersについて調べた内容をまとめてみます。

Resources Barriersってのはリソースの状態を管理し、
同期させるものらしいです。( ´_ゝ`)フーン

具体的な役割としては
・リソースの状態の変更
・キャッシュコヒーレンシの確保
・パイプラインストール

この三つだそうです。

一つ目はそのまんまです。
レンダーターゲット用のリソースをプレゼント用にして
実際に描画したりとかそういったやつですね。
(サンプルでいっぱいあった)

二つ目はまずキャッシュコヒーレンシとはなんぞやってとこからです。
これは共有リソースに対する複数のキャッシュの一貫性のことらしいです。

マルチスレッドとかやってると
別スレッドで変更されたリソースのキャッシュ情報が残ってて
うにゃぁってなることがあったりするわけですが、
それが起こらないよう確保する役割があるみたいです。

三つ目もなんぞやって感じです。
これは分岐命令とかが発生したとき
その結果が出るまでの間、
パイプラインが止まってしまうことだそうです。

処理が止まっちゃうとか速度が落ちるからダメじゃん!
って感じなんですけども、
パイプラインストールは処理の順番を守るのに役立ってくれています。
前の処理の結果が出るまで待つってことは
処理の順番を守ってくれているっていうことですからね。

じゃ処理の順番守る必要あるのかって話ですが、
これはもちろんあります。

GPUで行う処理って要はドローコールと
それによって必要になる計算処理ですが、
ドローコールの順番ってかなり大切になってくるんですよね。

ドローコールの順番が変わると何が起こるかって言うと
描画順番が変わってしまうわけでそこが変わると
色々とまずいわけです。(透過処理に失敗するとかね)

なので速度は多少落ちるが正確性優先
あえてパイプラインストールを起こしているそうです。

ちなみに11まではこういったことを
バックでやっていて
それが結構なオーバーヘッドになっていたようです。

なので12ではそこをアプリ実装側に任すことで
必要最低限のコストで実現し高速化などを図っています。
(パフォーマンスと手軽さはトレードオフですね)


そんなこんなで内部的にちょっとオーバーヘッド抱えることで
正確に処理できることを獲得したわけですが、
やっぱり速度は大事です。

なので速度を落とさないために
以下の三つのことを気を付けるべきだそうです。
・D3D12_RESOURCE_STATE_COMMONと
 D3D12_RESOURCE_STATE_GENERIC_READは一部例外を除き使わない
・不必要なトランジションは避ける
・複数リソースのトランジションを纏めて発行

まず一つ目はリソースに設定できるステートなんですが、
これを指定するとリソースがあらゆる場所で使われる可能性がありますよ
GPUに伝えるそうです。

そうなると色んなとことキャッシュコヒーレンシ確保したり、
内部的にパイプラインストールがガンガン走ったり、
まぁパフォーマンスをものっそい勢いで毟っていくことになるわけですね。

ただ一部例外があってそれは
・CPUからGPUへデータを渡すとき(D3D12_RESOURCE_STATE_GENERIC_READ)
・CPUがテクスチャにアクセスするとき(D3D12_RESOURCE_STATE_COMMON)
・Copy engineに渡すCopy queueにリソースを渡す(D3D12_RESOURCE_STATE_COMMON)

この三つです。

理由はそれぞれCPUとGPUのメモリの見え方の違うか、
内部に積んでるエンジンの問題とかでそうせざるを得ないからです。

二つ目と三つ目はResources Barriersに限った話ではないですね。
やらなくていい処理はやらない方が当然処理コスト浮きますし、
一回、一回ってわけるより一か所でまとめてボンと
やった方が総コストは安く済みます。

あとがき

今回はResources Barriersについて調べてみたことのまとめでした。
といってもMicrosoftが出してる英語の動画を翻訳つけて見て
その内容をそれとなく書いただけだったりするんですけどね。

それにしてもブルスクは久しぶりでしたね~
DirectX12ナンモワカランですが、
知らないことが目の前に
ごろごろ転がっているのっていいですね。
ワクワクします。(ドキドキもしますw)

それでは今回はこの辺でノシ