为什么 OpenGL 灰度纹理性能增益没有实现?
Why OpenGL grayscale texture performance gain not achieved?
我使用 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);
}
注意:以下假设您正确地分析了您的表现(使用 timer queries 等)。
每个过程都有与之相关的成本。有实际完成工作的成本,其中包括内存访问等。但是也有做任何事情的成本:执行该过程的开销。
虽然完成这项工作的成本往往取决于有多少工作要做,但管理费用通常是固定的。这意味着您所做的工作越少,更多 间接费用 相对 的工作。
因此,当您减轻工作压力时,流程的性能将更加依赖于调用操作的固定开销。在您的情况下,最初的 3 分量纹理副本可能不是很多工作。因此,在提高性能的同时减少工作,对调用该工作的开销没有任何作用。
我使用 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);
}
注意:以下假设您正确地分析了您的表现(使用 timer queries 等)。
每个过程都有与之相关的成本。有实际完成工作的成本,其中包括内存访问等。但是也有做任何事情的成本:执行该过程的开销。
虽然完成这项工作的成本往往取决于有多少工作要做,但管理费用通常是固定的。这意味着您所做的工作越少,更多 间接费用 相对 的工作。
因此,当您减轻工作压力时,流程的性能将更加依赖于调用操作的固定开销。在您的情况下,最初的 3 分量纹理副本可能不是很多工作。因此,在提高性能的同时减少工作,对调用该工作的开销没有任何作用。