统一影响着色器流程和性能
Uniform affecting shader flow and performances
我正在试验 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);
}
创建两个具有不同制服的程序不会改变任何东西。
有谁知道为什么会有如此巨大的差异,为什么驱动程序看不到 "inlining" 目录可能更快?
编辑:将大小作为统一标准也有影响,但不如目录大。
如果你有兴趣看看它的样子(FRAPS 提供了 fps 计数器):
快速说明:我 运行 在 nVidia 760M GTX 上使用 OpenGL 4.2 和 glsl 420。此外,puush 的 jpeg 负责图像中的颜色。
一个很好的猜测是 UBOs 存储在共享内存中,但可能需要偶尔往返全局内存 (vram),而非统一版本存储那一小段数据在寄存器或常量内存中。
但是,由于 OpenGL standard 并未规定数据的存储位置,因此您必须查看分析器,并尝试更好地了解 NVIDIA 的 GL 实现的工作原理。
我建议您从分析开始,使用 NVIDIA PerfKit or NVIDIA NSIGHT for VS。就算是想,现在也太麻烦了吧。如果你想编写高性能代码,你应该开始习惯这个过程。您最终会看到它变得多么容易。
编辑:
那为什么这么慢呢?因为在这种情况下,一个失败的优化(数据不在寄存器中)可能导致其他(如果不是大多数其他)优化也失败。而且,巧合的是,优化对于 GPU 代码来说是绝对必要的 运行 快速。
我正在试验 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);
}
创建两个具有不同制服的程序不会改变任何东西。
有谁知道为什么会有如此巨大的差异,为什么驱动程序看不到 "inlining" 目录可能更快?
编辑:将大小作为统一标准也有影响,但不如目录大。
如果你有兴趣看看它的样子(FRAPS 提供了 fps 计数器):
快速说明:我 运行 在 nVidia 760M GTX 上使用 OpenGL 4.2 和 glsl 420。此外,puush 的 jpeg 负责图像中的颜色。
一个很好的猜测是 UBOs 存储在共享内存中,但可能需要偶尔往返全局内存 (vram),而非统一版本存储那一小段数据在寄存器或常量内存中。
但是,由于 OpenGL standard 并未规定数据的存储位置,因此您必须查看分析器,并尝试更好地了解 NVIDIA 的 GL 实现的工作原理。
我建议您从分析开始,使用 NVIDIA PerfKit or NVIDIA NSIGHT for VS。就算是想,现在也太麻烦了吧。如果你想编写高性能代码,你应该开始习惯这个过程。您最终会看到它变得多么容易。
编辑:
那为什么这么慢呢?因为在这种情况下,一个失败的优化(数据不在寄存器中)可能导致其他(如果不是大多数其他)优化也失败。而且,巧合的是,优化对于 GPU 代码来说是绝对必要的 运行 快速。