分析图形着色器

时间:2016-06-28 13:45:57

标签: opengl glsl glsles

很长一段时间以来,我一直在避免使用着色器代码中的分支,而不是

float invert_value(in float value)
{
if(value == 0.0)
    return 0.0;
else
    return 1.0 / value;
}

像这样编写“聪明”的代码

float invert_value_ifless(in float value)
{
float sign_value = sign(value);
float sign_value_squared = sign_value*sign_value;
return sign_value_squared / ( value + sign_value_squared - 1.0); 
}

这将返回第一个函数的功能,并且没有分支,因此速度更快。

或者是吗?我在这里和鬼魂打架吗?

如何为速度配置图形着色器?我对最近的移动平台(Android)最感兴趣,但欢迎任何有关图形分析的建议!

2 个答案:

答案 0 :(得分:2)

它通常仍然是你原本认为的原因 - GPU通常被实现为一个非常宽的SIMD处理器,因此对每个像素执行相同的操作允许一次处理它们中的很多,而选择不同每个像素的操作使得该微积分更成问题。这就是像step这样的操作在GLSL中存活的原因。一个好的GLSL编译器通常可以消除编译时条件,并且可以通过其他方式使您的分支代码不分支,但GLSL编译器通常不如普通的离线语言编译器好,因为它们有自己的性能预算值得担心

我是一名专业的iOS人员,因此我可以详细谈论Xcode帧分析器的奇迹,并且这样做是为了获得完整的答案,但我很抱歉我无法提供很多关于Android的内容。

在Xcode中有一个帧捕获按钮。点击它,将捕获一个完整的OpenGL命令流。从那里,您将能够检查每个OpenGL命令之前和之后的所有状态和缓冲区。将报告每次通话所花费的时间。更好的是,您的GLSL代码本身将被分析到线级 - 将报告每行代码μs。而且,真正把它放在边缘,你可以直接重写你的GLSL代码并重新运行捕获的帧,以找出你的成本会发生什么。或者通常作为快速反馈的GLSL作者身份环境,尽管它并不是真正的工具。

答案 1 :(得分:0)

Android上所有主要的GPU制造商都有自己的GPU分析工具,与XCode的帧捕获大致相同。 ARMQualcommPowerVR

这样的事情必须要衡量,不幸的是,由于Android用户因各种原因没有更新的问题,野外的驱动程序的质量是变化的。