Opengl 对GLSL中的图像单元设置只读/写的性能影响

Opengl 对GLSL中的图像单元设置只读/写的性能影响,opengl,glsl,image-unit,Opengl,Glsl,Image Unit,在中,access可以是GL\u READ\u,GL\u WRITE\u ONLY,或GL\u READ\u WRITE。 我假设它们应该匹配GLSL中图像单元(例如,image2D或imageBuffer)上的readonly和writeonly限定符 在设置只读或写时,我没有注意到任何差异(2013年,NVIDIA 319.49驱动程序)。当然,我可能不会做任何会导致经济放缓的事情,因此看不到任何改善。这些限定符也可能被当前的GL实现忽略 GL实现在什么情况下可以使用只读/写,为什么存在

在中,
access
可以是
GL\u READ\u
GL\u WRITE\u ONLY
,或
GL\u READ\u WRITE
。 我假设它们应该匹配GLSL中图像单元(例如,
image2D
imageBuffer
)上的
readonly
writeonly
限定符

在设置只读或写时,我没有注意到任何差异(2013年,NVIDIA 319.49驱动程序)。当然,我可能不会做任何会导致经济放缓的事情,因此看不到任何改善。这些限定符也可能被当前的GL实现忽略

  • GL实现在什么情况下可以使用只读/写,为什么存在
我想到了缓存一致性,但是
一致性
/
volatile
限定符是否已经涵盖了这一点?我用过这些,它们看起来很管用

  • 是否有人在使用readonly/writeonly时体验到性能或结果上的差异,它们有多重要

如果已经多年了,请不要害怕回答,我很想知道,我相信其他人也很想知道。

它只向驾驶员提示内存应该如何使用。这取决于驱动程序是否进行优化。我没有看到任何不同的NVidia驱动程序。有一点是肯定的,如果在只读映像中写入,则结果是未定义的。读取仅写图像时也是如此。但是,即使这对今天的驱动程序没有影响,您仍然应该将它们与您对这些图像的实际操作保持一致:未来的驱动程序可能会使用这些提示来优化内存访问。

它只向驱动程序提示内存应该如何使用。这取决于驱动程序是否进行优化。我没有看到任何不同的NVidia驱动程序。有一点是肯定的,如果在只读映像中写入,则结果是未定义的。读取仅写图像时也是如此。但是,即使这对今天的驱动程序没有影响,您仍然应该将它们与您实际使用这些图像的操作相一致:未来的驱动程序可能会使用这些提示来优化内存访问。

请看,问题是这些访问策略没有实际的实施。OpenGL故意不定义写入只读图像的行为,原因如下所述。除其他外,这允许在实现结束时为许多不同的优化策略使用只读属性提供很大的灵活性(将其视为提示而不是严格的规则)。因为行为未定义,所以您是对的,它们可以被实现忽略,但是不应该被应用程序开发人员忽略。调用未定义的行为是一颗滴答作响的定时炸弹

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


您没有看到任何性能改进这一事实并不令人惊讶。这是一个非常新的特性,在驱动程序对访问策略做任何深入的操作之前,您必须给它几年的时间。只要您自己不违反提示,提供提示不会造成任何伤害。

请看,问题是这些访问策略没有实际执行。OpenGL故意不定义写入只读图像的行为,原因如下所述。除其他外,这允许在实现结束时为许多不同的优化策略使用只读属性提供很大的灵活性(将其视为提示而不是严格的规则)。因为行为未定义,所以您是对的,它们可以被实现忽略,但是不应该被应用程序开发人员忽略。调用未定义的行为是一颗滴答作响的定时炸弹

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


您没有看到任何性能改进这一事实并不令人惊讶。这是一个非常新的特性,在驱动程序对访问策略做任何深入的操作之前,您必须给它几年的时间。只要你自己不违反提示,提供提示不会有任何坏处。

是的,但我更感兴趣的是司机会如何处理这些信息。我不喜欢在不知情的情况下使用功能的想法。有一点相关,
restrict
没有实现,现在它是你应用程序的一个方便的关键字。@jozxyqk:我正要回答,然后我读了评论,并在他的回答中写道:“我