我正在尝试使用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负责图像中的颜色。
答案 0 :(得分:2)
一个好的猜测是UBOs存储在共享内存中,但可能需要偶尔往返全局内存(vram),而非统一版本将这些小数据存储在寄存器中或恒定的记忆。
但是,由于OpenGL standard没有规定您的数据存储位置,因此您必须查看分析器,并尝试更好地了解NVIDIA的GL实施方式。
我建议您首先使用NVIDIA PerfKit或NVIDIA NSIGHT for VS进行性能分析。即使你认为,现在也是太麻烦了。如果您想编写高性能代码,您应该开始习惯该过程。你会看到它最终会变得多么容易。
编辑:
那为什么它这么慢?因为在这种情况下,一个失败的优化(数据不在寄存器中)可能导致其他(如果不是大多数其他)优化也失败。而且,巧合的是,优化对于GPU代码运行速度是绝对必要的。