为什么OpenGL灰度纹理性能增益没有实现?

为什么OpenGL灰度纹理性能增益没有实现?,opengl,opengl-es,metal,Opengl,Opengl Es,Metal,我使用OpenGL计算着色器处理图像,该着色器仅将源纹理复制到目标纹理 在第一个测试中,源纹理和目标纹理都是BGR8,在第二个测试中,它们都是R8 灰度纹理内存大约比彩色纹理小4倍,因此我希望在第二次测试中获得4倍的速度。但是,我只能获得大约1.5倍的速度增益 谁能告诉我是不是出了什么事 附加代码,第一次使用.bgra8Unorm,第二次使用.r8Unorm kernel void copyKernel(texture2d<half, access::read> inTexture

我使用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);
}
内核无效
copyKernel(texture2d inTexture[[texture(0)]],
纹理2D outTexture[[纹理(1)],
uint2 gid[[螺纹位置在网格中]]{
half4 inColor=输入读取(gid);
outTexture.write(不彩色,gid);
}

注意:以下假设您正确地分析了性能(使用等)

每个过程都有与之相关的成本。这是实际工作的成本,包括内存访问等。但做任何事情都有成本:执行过程的开销

虽然做这项工作的成本往往取决于要做多少工作,但间接成本通常是固定的。这意味着你所做的工作越少,与之相关的管理费用就越高


因此,当您降低工作压力时,流程的性能将更加依赖于调用操作的固定开销。在您的例子中,最初的3分量纹理副本可能不是一个完整的工作开始。因此,在提高性能的同时,减少工作量并没有减少调用该工作的开销。

注意:以下假设您正确地分析了性能(使用等)

每个过程都有与之相关的成本。这是实际工作的成本,包括内存访问等。但做任何事情都有成本:执行过程的开销

虽然做这项工作的成本往往取决于要做多少工作,但间接成本通常是固定的。这意味着你所做的工作越少,与之相关的管理费用就越高


因此,当您降低工作压力时,流程的性能将更加依赖于调用操作的固定开销。在您的例子中,最初的3分量纹理副本可能不是一个完整的工作开始。因此,在提高性能的同时,减少工作对调用该工作的开销没有任何影响。

不能保证较小的内存占用将直接与同等的速度提高相关。内存可能不是你的瓶颈。请发布代码,以便我们更好地了解您的管道。根据您的问题,我们目前无法提供太多的信息。无法保证较小的内存占用将直接与同等的速度提高相关。内存可能不是你的瓶颈。请发布代码,以便我们更好地了解您的管道。根据你的问题,我们现在没有什么可以继续的。是的,系统对纹理读写进行了一些优化,因此总吞吐量超过了理论内存带宽,所以当我优化代码时,只得到了很小的增益,因为系统已经做了一些优化是的,系统对纹理读写进行了一些优化,因此总吞吐量超过了理论内存带宽,因此当我优化代码时,只获得了很小的增益,因为系统已经进行了一些优化