複数のシェーダーユニットを考慮したテクスチャキャッシュの動作


11

最近のGPUには、多くの並列シェーディングユニットがあります。そのシナリオでテクスチャキャッシュがどのように管理されるか知りたいのですが。

回答:


14

トップレベルでは、GPUはいくつかのシェーダーコアに分割されます。ノートブックやタブレットの小さなGPUはコアが数個しかないかもしれませんが、ハイエンドのデスクトップGPUは数十個しかないかもしれません。

シェーダーコアに加えて、テクスチャユニットもあります。それらは、GPUに応じて、シェーダーコアごとに1つのテクスチャユニット、または2つまたは3つのシェーダーコアで共有される1つのテクスチャユニットと一緒にグループ化できます。

チップ全体が単一のL2キャッシュを共有しますが、異なるユニットには個別のL1キャッシュがあります。テクスチャユニットにはテクスチャキャッシュがあり、シェーダーユニットには命令と定数/ユニフォームのキャッシュがあり、バッファロードがテクスチャロードとは別のパスであるかどうかに応じて、バッファデータ用の個別のキャッシュがある場合があります(GPUアーキテクチャによって異なります)。

テクスチャユニットは、シェーダーコアから独立して非同期で動作します。シェーダーがテクスチャの読み取りを実行すると、それらの間の小さなバスを介してテクスチャユニットにリクエストが送信されます。シェーダーは、可能であれば実行を継続できます。または、中断されて、テクスチャの読み取りが完了するまで待機している間、他のシェーダースレッドを実行できます。

テクスチャユニットは一連のリクエストをバッチ処理し、ミップレベルと異方性を選択し、UVをテクセル座標に変換し、クランプ/ラップモードを適用するなど、アドレッシング計算を実行します。必要なテクセルがわかると、それらを介してそれらを読み取ります。キャッシュ階層。メモリの読み取りがCPUで機能するのと同じ方法(最初にL1を調べ、そこにない場合はL2を調べ、次にDRAMを調べます)。多くの保留中のテクスチャリクエストがすべて同じまたは近くのテクセルを必要とする場合(それらはよくあるように)、少数のメモリトランザクションだけで多くの保留中のリクエストを満たすことができるため、ここで多くの効率が得られます。これらの操作はすべてパイプライン処理されるので、テクスチャユニットが1つのバッチでメモリを待機している間、別のバッチのリクエストのアドレッシング計算を実行できます。

データが返されると、テクスチャユニットは圧縮形式をデコードし、必要に応じてsRGB変換とフィルタリングを実行してから、結果をシェーダーコアに返します。


1
ありがとう!それは本当に役に立ちました。定数/ユニフォームキャッシュの再調整。精度以外のヒント(mediump、lowp)を使用して、ユニフォームのキャッシュヒット率を向上させることはできますか?ユニフォームを宣言する順序は違いますか?
フェリペ・リラ

2
@PhilLira Packingは、違いを生み出すことができます。コンパイラーは、ベクトルが16バイト境界を超えて分割されるのを防ぐためにパディングを挿入するので、それを避けてください。mediump / lowpは、少なくともデスクトップGPU(おそらくモバイル)で、ユニフォームに対して実際には何もしないと思います。ただし、キャッシュヒット率の均一性についてはあまり気にしません。これがボトルネックになることはほとんどありません。
ネイサンリード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.