● 最初的杂乱无章和第一次统一
CPU的多级cache体系,或者说原教旨意义上的cache体系的最大特点,在于通过预测以及多级高速大带宽sram对较慢的系统主存进行预取,从一般意义上来讲,L1的命中率一定会比作为扩展出现的L2更高。无论包含式cache还是排斥式,CPU的cache系统都是面向整个核心开放且功能是统一的。纹理缓冲与之最大的不同,在于L1可以被视作只为整个TMU单元提供服务,而L2则既要为充当L1的扩展缓冲,又要为Vertex Texture Fetch拾取并进行顶点纹理相关操作提供帮助。
Vertex Texture操作效果
在最初的DirectX 9.0C出现的时候,Vertex shader单元具备在TMU单元进行材质操作之前即通过Vertex Texture和Vertex Lighting按照程序要求提前访问材质库的能力,这样做可以为整个模型附上最基本的带光照信息的底层纹理,方便对Vertex shader单元对几何外形进行调节。但这一步骤的调整使得TMU之外出现了第二个需要缓冲材质的单元,因此为其开辟第二组临时缓冲区域以及由此带来的凌乱的缓冲区域及功能划分,就成了DirectX 9.0C不得不背负的负担。
实际上不仅仅是DirectX 9.0C的问题,纵观GPU乃至整个显示核心的发展史,缓冲区域及功能杂乱无章以及各自为政始终是图形处理器最大的“特色”。因为最初的功能分化,几乎每一种硬件管线功能都要求对应且独立的buffer,而buffer渐渐地就演变成了cache。除了我们在这里面对的Texture cache之外,ATI研发的几乎所有GPU构架都具有回写缓冲,ROP里也有Z-cache和Stencil-cache,甚至还有各种shader cache,就连output buffer曾经也可以被看做是一种cache……各自为战不仅让设计难度随着单元和功能需求的增多而不断放大,更让希望使用更好硬件资源的程序员们苦不堪言。
AMD GPU的每一个角落都能看到"cache“
随着DirectX 10的出现,Vertex Shader和Pixel Shader单元通过ALU的形式被统一成了Unified Shader。传统的Vertex Texture Fetch的功能被全新的统一单元所替代并实现,这让两组先前纹理缓冲作用不一服务单元不同的情况得到了好转。因为不再需要对不同单元负责,现在L2 Texture cache终于可以作为L1 Texture cache的扩展缓冲而安心工作了。
哦?这么说DirectX 10不仅统一了shader,更功德无量的统一了缓冲体系,让缓冲体系杂乱无章的局面得到改善喽?不……DirectX 10的出现虽然确实让Texture cache体系获得了统一,但它却引入了另一个以前从来没出现过的缓冲——shared memory,简称shared。