考虑多个着色器单元的纹理缓存如何工作


Answers:


14

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

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

整个芯片共享一个L2高速缓存,但是不同的单元将具有单独的L1高速缓存。纹理单元具有纹理高速缓存,着色器单元具有用于指令和常量/统一的高速缓存,并且可能具有用于缓冲区数据的单独的高速缓存,这取决于缓冲区加载是否是与纹理加载不同的路径(因GPU架构而异)。

纹理单元独立于着色器核心而异步运行。当着色器执行纹理读取时,它会通过它们之间的一条小总线向纹理单元发送一个请求。然后,着色器可以继续执行(如果可能),否则它可能会挂起,并在等待纹理读取完成时允许其他着色器线程运行。

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

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


1
谢谢!那真的很有帮助。重新处理常量/统一缓存。除了可以提高制服缓存命中率的精度(中,低)外,它们还有其他技巧吗?我申报制服的顺序有什么区别(关于更紧密的包装)?
费利佩·里拉

2
@PhilLira Packing可以有所作为,是的。编译器将插入填充,以防止矢量被划分为16个字节的边界,因此请避免这种情况。我不认为mediump / lowp实际上在制服上做任何事情,至少在台式机GPU上(也许在移动设备上)。我不会太担心统一的缓存命中率。如果有的话,这是非常罕见的瓶颈。
内森·里德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.