网上关于GPU编程优化的文章很多,本篇博客带领读者更深入的理解GPU编程以及各个函数的运行时间,为开发者优化Shader编程提供一些指导。除了Shader编程中的变量定义精度优化,还有函数的优化,下面给读者展示如下:
在PC端执行
Shader代码在PC端使用的函数执行时间:
该图是以DX11为例,用|隔开的数据,前面的部分是计算单分量时的指令数,后面的部分是计算float4时的指令数。通过上图给给读者总结一下:
- 反三角函数非常费
- abs和saturate是免费的
- 除了反三角函数外,fmod和smoothstep比预期更费
- log,exp,sqrt(单分量)的成本实际上很低,所以由他们组合成的pow也不高
- sin,cos在DX11使用了专门一条单指令,成为了低成本函数
另外,绝大部分GPU是一次性计算4个分量,计算一个float4和只计算单个float耗时是一样的。当计算float时,剩下三个分量的时长会被浪费。
在移动端执行
由于硬件不同,每条指令的时间成本确实可能是不一样的。下面通过具体的Shader代码样例给出主流GPU的执行时间,供参考:
左边对应的是每行的代码,右边是执行所需时间,通过上图可以看出:1/x, sin(x), cos(x), log2(x), exp2(x), 1/sqrt(x)这些指令的时间成本是一样的,而且和普通的四则运算很接近,