为啥没有实现 OpenGL 灰度纹理性能增益?
Posted
技术标签:
【中文标题】为啥没有实现 OpenGL 灰度纹理性能增益?【英文标题】:Why OpenGL grayscale texture performance gain not achieved?为什么没有实现 OpenGL 灰度纹理性能增益? 【发布时间】:2018-05-03 14:03:04 【问题描述】:我使用OpenGL计算着色器处理图像,着色器只复制源纹理到目标纹理。
在第一次测试中,源纹理和目标纹理都是BGR8,在第二次测试中,它们都是R8。
灰度纹理内存大小大约比彩色纹理小 4 倍,所以我希望在第二次测试中获得 4 倍速度。但是,我只能获得 1.5 倍的速度增益。
如果有什么问题,谁能告诉我?
附上代码,第一次两个纹理使用.bgra8Unorm,第二次使用.r8Unorm,
kernel void
copyKernel(texture2d<half, access::read> inTexture [[texture(0)]],
texture2d<half, access::write> outTexture [[texture(1)]],
uint2 gid [[thread_position_in_grid]])
half4 inColor = inTexture.read(gid);
outTexture.write(inColor, gid);
【问题讨论】:
不能保证较小的内存占用将直接与等效的速度增加相关。内存可能不是您的瓶颈。请发布代码,以便我们更好地了解您的管道。根据您的问题,我们目前无能为力。 【参考方案1】:注意:以下假设您正确地分析了您的性能(使用timer queries 等)。
每个过程都有与之相关的成本。实际做这项工作是有成本的,其中包括内存访问等。但也有做任何事情的成本:执行整个过程的开销。
虽然做这项工作的成本往往取决于有多少工作要做,但间接费用通常是固定的。这意味着您做的工作越少,相对于该工作的管理费用更多。
因此,当您减轻工作压力时,流程的性能将更加依赖于调用操作的固定开销。在您的情况下,最初的 3 组件纹理副本可能并不是很多工作。因此,减少工作量,同时提高性能,对调用该工作量的开销没有任何作用。
【讨论】:
是的,系统对纹理读写做了一些优化,所以总吞吐量超过了理论内存带宽,所以当我优化我的代码时只获得了很小的收益,因为系统已经这样做了一些优化以上是关于为啥没有实现 OpenGL 灰度纹理性能增益?的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL:当尺寸不能被 4 整除时,灰度纹理数据布局不匹配