我使用OpenGL计算着色器来处理图像,着色器只将源纹理复制到目标纹理。
在第一次测试中,源和目标纹理都是 BGR8 ,在第二次测试中,它们都是 R8 。
灰度纹理内存大小比颜色纹理小约4倍,因此我希望在第二次测试中获得 4x速度。但是,我只能获得 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);
}
答案 0 :(得分:3)
注意:以下假定您正确分析了您的效果(使用timer queries等)。
每个流程都有与之相关的成本。实际工作的成本包括内存访问等。但是,执行任何的成本也是:执行该过程的开销。
虽然完成工作的成本往往取决于需要做多少工作,但管理费用通常是固定的。这意味着您所做的工作越少,更多的开销成本相对于该工作。
因此,当您减轻工作压力时,流程的性能将更加依赖于调用操作的固定开销。在您的情况下,原始的3组件纹理副本可能不是很多工作开始。因此,在提高性能的同时减少工作,并没有对调用该工作的开销做任何事情。