均匀影响着色器流量和性能

时间:2015-04-05 19:51:48

标签: c++ c opengl

我正在尝试使用OpenGL片段着色器,通过两次通过(一个水平,一个垂直)完成一个巨大的模糊(300 * 300)。

我注意到将方向作为制服(vec2)传递比在代码中直接写入(140到12 fps)慢10倍。

即:

vec2 dir = vec2(0, 1) / textureSize(tex, 0);
int size = 150;
for(int i = -size; i != size; ++i) {
    float w = // compute weight here...
    acc += w * texture(tex, + coord + vec2(i) * dir);
}

似乎比以下更快:

uniform vec2 dir;
/*
  ...
*/
int size = 150;
for(int i = -size; i != size; ++i) {
    float w = // compute weight here...
    acc += w * texture(tex, + coord + vec2(i) * dir);
}

使用不同的制服创建两个程序不会改变任何东西。

有谁知道为什么会有这么大的差异,为什么司机不会看到“内联”目录可能会更快?

编辑:将大小作为制服也会产生影响,但不如dir那么多。

如果您有兴趣了解它的外观(FRAPS提供fps计数器):

快速说明:我使用OpenGL 4.2和glsl 420在nVidia 760M GTX上运行。此外,puush的jpeg负责图像中的颜色。

1 个答案:

答案 0 :(得分:2)

一个好的猜测是UBOs存储在共享内存中,但可能需要偶尔往返全局内存(vram),而非统一版本将这些小数据存储在寄存器中或恒定的记忆。

但是,由于OpenGL standard没有规定您的数据存储位置,因此您必须查看分析器,并尝试更好地了解NVIDIA的GL实施方式。

我建议您首先使用NVIDIA PerfKitNVIDIA NSIGHT for VS进行性能分析。即使你认为,现在也是太麻烦了。如果您想编写高性能代码,您应该开始习惯该过程。你会看到它最终会变得多么容易。

编辑:

那为什么它这么慢?因为在这种情况下,一个失败的优化(数据不在寄存器中)可能导致其他(如果不是大多数其他)优化也失败。而且,巧合的是,优化对于GPU代码运行速度是绝对必要的。