2016-06-28 58 views
0

相当一段时间以来,我一直在回避,而不是像这样剖析图形着色器

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); 
} 

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

写“聪明”的代码在我的shader代码分支,这将返回什么第一个函数确实没有分支,因此速度更快。

是这样吗?我在这里与幽灵战斗吗?

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

+1

“*我是鬼打架吗?*” [是,你是。(http://stackoverflow.com/q/37827216/734069) –

+0

优秀的答案有尼科尔。 – Leszek

+0

这是否与幽灵战斗呢?而不是 如果(a> 0时)B =(1-α)/(2-A) 否则B =(1 +α)/(2 +α) 写入 SIGNA =符号(一); b =(1-signA * a)/(2-signA * a); ? – Leszek

回答

1

它往往仍然是,你可能最初认为的原因 - 一个GPU经常被实现为一个非常宽的SIMD处理器,所以执行相同的操作每个像素允许一次,而采摘处理了很多人每个像素的不同操作使得这个微积分更有问题。这就是为什么像step这样的运营在GLSL中生存的原因。一个好的GLSL编译器通常可以消除编译时条件,并且可以通过其他方式使分支代码不分支,但GLSL编译器通常不如普通离线语言编译器好,因为它们有自己的性能预算来担心。

我是一个专业的iOS人员,所以我可以详细地谈谈Xcode框架分析器的奇妙之处,并且会为完整答案带来好处,但是我很抱歉无法提供有关Android的更多信息。

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

0

所有主要的GPU制造商在Android上有自己的GPU性能分析工具,做大致相同Xcode的帧捕获。 ARMQualcommPowerVR

这样的事情必须进行测量,不幸的是,由于Android用户因各种原因而未更新的问题,野外驾驶员的质量是可变的。

+0

是的,我试图使用Adreno Profiler ATM,但由于某种原因,当我将它连接到手机时,'找不到adreno profiler enabled app'.... 我会尝试一些:) – Leszek

+0

是的,我的GPU分析工具的经验一般是挫败感。如果您正在寻找快捷方式,我知道PowerVR的着色器编辑器可以对各种GPU架构进行循环计数估计,而无需在设备上运行着色器(我希望其他供应商具有类似的功能,但我不知道当然)。得出想法可能就足够了。 – Columbo