● 呼唤统一构架的到来
尽管DirectX 9.0C堪称完美,但它的完美本身从出发点上就存在局限。它对shader部分的补充虽然非常必要并且具有划时代的意义,对后端的本质性改进更是至今都未见超越,但DirectX 9.0C忽略了一个很致命的问题——shader单元的动作效率问题。
传统的shader单元是分立的,根据不同的需要被分成了独立的Vertex shader单元和Pixel shader单元,两组单元各司其职,分别处理不同的shader programs。表面上看专门的用特定单元运行唯一对应代码的对应式设计似乎可以达到简单高效的目的,但在实际应用中反倒出现了效率低下的问题。
不同单元在负载方面的效率问题
假定一段shader programs中仅包含10%的Vertex Shader指令,剩下的90%都是Pixel Shader指令,那么当重载的Pixel shader单元全力动作的时候Vertex shader单元实际上是处在欠载状态的。这种情况反之亦然。一段实际的shader program是不可能完全做到50:50的指令平衡设计的,再加上指令的串行吞吐特性,程序员无论如何都不可能做到指令密度的平均化。因此我们不难发现,实际应用中根据传统的API设计出来的硬件经常会出现大面积的负载不平衡的现象。虽然硬件设计者为了应对这一问题,在硬件设计之初就已经为两个单元固定了一个比例,但这实际上反倒帮了倒忙,程序员不得不尽可能的迁就固定比例硬件的效率,从而限制了他们自由发挥的空间。
既然程序端不可能解决这个问题,如何让全部的运算单元都能够在理论上达到最高效的运作模式就成了摆在新一代API面前的最大问题。
威武的商人为我们带来的解决方案很直接也很划时代——把他们统一起来。