性能影响在GLSL中的图像单元上设置readonly / writeonly

时间:2013-10-29 10:20:48

标签: opengl glsl image-unit

glBindImageTexture()中,access可以是GL_READ_ONLYGL_WRITE_ONLYGL_READ_WRITE。 我假设这些匹配GLSL中图像单元(例如readonlywriteonly)上的image2DimageBuffer限定符。

设置readonly或writeonly(2013,NVIDIA 319.49驱动程序)时,我没有发现任何差异。当然,我可能不会做任何会导致减速的事情,因此看不到任何改善。当前的GL实现也可能忽略这些限定符。

  • 在什么情况下GL实现可以使用readonly / writeonly,为什么它们存在?

缓存一致性会浮现在脑海中,但coherent / volatile限定词是否已涵盖此问题?我已经使用了它们,它们似乎有效。

  • 使用readonly / writeonly时,是否有人在性能或结果方面有所不同,他们有多重要?

如果已经有好几年了,请不要害怕回复,我很有兴趣知道,我也确定其他人也是。

2 个答案:

答案 0 :(得分:2)

它只告诉驱动程序应该如何使用内存。这取决于驱动程序是否进行优化。我没有看到NVidia驱动程序有任何区别。有一件事是肯定的,如果你用只读图像写,结果是不确定的。读取只写图像也是如此。但即使它对今天的驱动程序没有任何影响,你仍然应该使用它们与你实际对这些图像做的一致:未来的驱动程序可能会使用这些提示来优化内存访问。

答案 1 :(得分:2)

请注意,事实上没有实际执行这些访问策略。由于下面将要解释的原因,OpenGL故意将写入的行为保留为未定义的只读图像。除此之外,这允许在实现结束时具有很大的灵活性,以将只读属性用于许多不同的优化策略(将其视为提示而非严格规则)。由于行为未定义,您是对的,实施会忽略 ,但 不应 应用程序开发人员忽略了调用未定义的行为是一个定时炸弹。

为此,当您尝试将某些内容存储在只读映像中时,GLSL(或一般着色器)中不存在发出错误的机制,从而使执行此策略变得更加困难。您可能希望的最好的是在编译时进行某种静态分析,稍后在运行时根据绑定图像纹理的访问策略进行验证。这并不是说将来可能不会发生,但目前还没有这样的功能。 GLSL提供的唯一功能是编译时保证readonly变量不能与着色器中的imageStore (...)一起使用。简而言之,GLSL限定符在编译时强制执行,但绑定映像的访问策略不在运行时。

您没有看到任何性能提升这一事实并不令人惊讶。这是一个非常新的功能,你必须在驱动程序对访问策略做任何深刻的事情之前给它几年。只要你自己不违反它,它就不会伤害任何提示。