现代GPU具有许多并行着色单元。我想知道在这种情况下如何管理纹理缓存。

#1 楼

在顶层,GPU被细分为许多着色器核心。笔记本电脑或平板电脑中的小型GPU可能只有几个核心,而高端台式机GPU可能只有数十个核心。

除了着色器核心之外,还有纹理单元。根据GPU,它们可以与每个着色器核心一个纹理单元组合在一起,或者在两个或三个着色器核心之间共享一个纹理单元组合在一起。

整个芯片共享一个L2缓存,但是不同单元将具有单独的L1缓存。纹理单元具有纹理高速缓存,着色器单元具有用于指令和常量/统一的高速缓存,并且可能是用于缓冲区数据的单独高速缓存,这取决于缓冲区加载是否是与纹理加载不同的路径(取决于GPU架构)。 >
纹理单元独立于着色器核心而异步运行。当着色器执行纹理读取时,它会通过它们之间的一条小总线向纹理单元发送一个请求。然后,着色器可以继续执行(如果可能),否则它可能会挂起并允许其他着色器线程在等待纹理读取完成时运行。

纹理单元分批处理一堆请求并执行它们上的寻址数学运算-选择mip级别和各向异性,将UV转换为texel坐标,应用钳位/包装模式等。一旦知道所需的texel,便会通过缓存层次结构读取它们,这与内存读取的工作方式相同CPU(首先查看L1,如果不在L2中,则查看L2,然后是DRAM)。如果许多待处理的纹理请求都想要相同或附近的纹理像素(就像他们经常那样),那么您将在这里获得很大的效率,因为您只需很少的内存事务就可以满足许多待处理的请求。所有这些操作都是流水线的,因此当纹理单元等待一批内存时,它可以为另一批请求做寻址数学,依此类推。

数据返回后,纹理单元将解码压缩格式,根据需要进行sRGB转换和过滤,然后将结果返回到着色器核心。

评论


$ \ begingroup $
谢谢!那真的很有帮助。重新处理常量/统一缓存。除了可以提高制服缓存命中率的精度(中,低)外,它们还有其他技巧吗?我申报制服的顺序有什么区别(关于包装得更紧密)?
$ \ endgroup $
–费里拉·里拉
15年8月28日在18:32

$ \ begingroup $
@PhilLira包装可以发挥作用,是的。编译器将插入填充,以防止矢量被划分为16个字节的边界,因此请避免这种情况。我不认为mediump / lowp实际上在制服上做任何事情,至少在台式机GPU上(也许在移动设备上)。我不会太担心统一的缓存命中率。如果有的话,这是非常罕见的瓶颈。
$ \ endgroup $
–内森·里德(Nathan Reed)
15年8月28日在20:23

$ \ begingroup $
@NathanReed好的答案。但是“将UV转换为纹理像素坐标”是什么? UV是纹理坐标,用于获取纹理纹理[u] [v]。
$ \ endgroup $
– Nikos
20年8月4日在21:49

$ \ begingroup $
@Nikos不完全是。 UV在[0,1]范围内,并且必须转换,以找到所需的实际纹理像素集(给定纹理大小,环绕模式和过滤模式)。
$ \ endgroup $
–内森·里德(Nathan Reed)
20年8月4日在22:52

$ \ begingroup $
@NathanReed哦,我的天哪。谢啦!
$ \ endgroup $
– Nikos
20年8月4日在23:44