为啥没有实现 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纹理的灰度图像

如何在OpenGL中实现灰度渲染?

OpenGL:当尺寸不能被 4 整除时,灰度纹理数据布局不匹配

将灰度 OpenCV 图像传递给 OpenGL 纹理

CUDA/OpenGL InterOp:使用灰度图像作为纹理

为啥我的 OpenGL 纹理不起作用?