我知道这个问题可能看起来有点没有根据,但如果有人知道任何理论/有关于这个主题的实践经验,那么如果你分享它会很棒.
我正在尝试优化我的一个旧着色器,它使用了大量的纹理查找.
我有三个可能的映射平面中的每一个的漫反射,普通,高光贴图,对于一些靠近用户的面,我还必须应用贴图技术,这也带来了很多纹理查找(如parallax occlusion mapping).
分析表明纹理查找是着色器的瓶颈,我愿意将其中一些删除.对于输入参数的某些情况,我已经知道纹理查找的一部分是不必要的,显而易见的解决方案是执行类似(伪代码)的操作:
if (part_actually_needed) {
perform lookups;
perform other steps specific for THIS PART;
}
// All other parts.
Run Code Online (Sandbox Code Playgroud)
现在 - 问题来了.
我不记得确切(这就是为什么我说这个问题可能会不接地),但在某些纸张最近,我读(不幸的是,不记得名字了)类似下面的内容指出:
所提出的技术的性能取决于基于硬件的条件分支 的实施效率.
在我即将开始重构大量着色器并实现我所讨论的if基于优化的优化之前,我记得这种说法.
所以 - 在我开始这样做之前 - 有人知道着色器中分支的效率吗?为什么分支会在着色器中造成严重的性能损失?
甚至有可能我只能通过if基于分支的方式恶化实际性能?
你可能会说 - 试试看.是的,如果这里没有人帮助我,那就是我要做的事:)
但是,在这种if情况下,新GPU可能会有效,对于一些较老的GPU来说可能是一场噩梦.除非你有很多不同的GPU(这不是我的情况),否则很难预测这类问题
所以,如果有人知道这些或具有这些着色器的基准测试经验,我将非常感谢您的帮助.
实际工作的剩余脑细胞几乎没有告诉我,GPU上的分支可能远不如分支CPU(通常具有非常有效的分支预测方法和消除缓存未命中)那么有效,仅仅因为它是GPU(或者说可能很难/不可能在GPU上实现).
不幸的是,我不确定这个陈述是否与实际情况有任何共同之处......