● DirectX 11“破界者”
我们知道,DirectX 11相对于DirectX 10最重要的两个更新就是并行kernel和Compute Shader,immediate Context和Deferred Context为数据的并行管理以及并行过程中的数据交换提供了前提条件,解决了并行度的问题之后,Compute Shader的出现就顺理成章了。
Compute Shader与传统shader最大的不同在于几何关联性的问题。传统shader必须对应某种几何过程,比如Vertex、Texture或者Z-buffer,这样做的好处在于可以在图形过程中将shader自动对应到操作上,但坏处也是显而易见的——所有程序员,不管你是搞理论物理的眼镜轮椅男还是写算数函数的图形门外汉,要想利用DirectX 10硬件的通用计算性能都必须要掌握GLSL和HLSL,了解图形处理过程以及整个图形流水线的特点,甚至还可能要跑去学点fortran什么的。即便后来出现了类似CUDA这类C++型的对象式编译接口,指令的图形关联还是一个必不可少的过程,对硬件的使用依旧不是很方便。于是在DirectX 11中,微软彻底取消了Compute Shader与几何过程的关联。
取消了几何关联的Compute Shader是史上第一个完全开放的数学指令型shader,Compute Shader可以透过并行管理方便的实现数据共享,可以透过树结构和延迟操作快速执行任意过程,虽然丧失了几何关联所带来的各种自动功能让Compute Shader看上去与大多数图形过程绝缘了,但事实却恰恰相反。Compute Shader的出现,不仅没有进一步的将通用计算和图形计算割裂开,反倒直接打破了传统的界限和束缚,将图形和通用计算彻底联系在了一起。有了它,显卡的通用计算能力将最大限度的成为图形计算能力。
这是怎么回事?史上第一个彻底与几何过程划清界限的通用计算专用形式的shader应用怎么可能成了图形和通用计算两个领域之间的“破界者”呢?这一切都要从一个古老但却又非常先进的技术——Deferred shading说起。