金属结构中未使用的属性是否会影响性能
Do unused properties in a metal struct hurt performance
假设我在 .metal
文件中有以下结构:
struct VertexOut{
float4 position [[position]];
float2 a;
float2 b;
};
此结构是我的片段着色器的 [[ stage-in ]]
输入。现在我的一些着色器使用 b
而有些不使用。这是否会损害性能,这意味着我应该为不需要它的着色器创建另一个没有 b
的结构吗?
答案取决于您的使用情况。内存带宽性能会受到影响,但影响很小。
如果您使用此着色器输出全屏像素并且带宽有限,则删除不需要的 float2 可能 有帮助。
但是,更改着色器通常会影响性能,因此您可能会因为不需要更改片段着色器而获得性能优势,这很可能超过任何损失。
我的一个建议是将 a 和 b 更改为 float4 a_b
并使用 a_b.xy
和 a_b.zw
访问它。寄存器对齐到 16 个字节,因此这将为您节省 space。举个例子:
struct X
{
float4 position;
float2 a;
float2 b;
};
struct Y
{
float4 position;
float2 a;
};
struct Z
{
float4 position;
float4 a_b;
};
在上面的例子中,X将使用48字节(有3个寄存器,每个16字节),而Y或Z只有32字节(有2个寄存器)。因此,使用 Z 可能会给您带来两全其美的效果。
假设我在 .metal
文件中有以下结构:
struct VertexOut{
float4 position [[position]];
float2 a;
float2 b;
};
此结构是我的片段着色器的 [[ stage-in ]]
输入。现在我的一些着色器使用 b
而有些不使用。这是否会损害性能,这意味着我应该为不需要它的着色器创建另一个没有 b
的结构吗?
答案取决于您的使用情况。内存带宽性能会受到影响,但影响很小。 如果您使用此着色器输出全屏像素并且带宽有限,则删除不需要的 float2 可能 有帮助。
但是,更改着色器通常会影响性能,因此您可能会因为不需要更改片段着色器而获得性能优势,这很可能超过任何损失。
我的一个建议是将 a 和 b 更改为 float4 a_b
并使用 a_b.xy
和 a_b.zw
访问它。寄存器对齐到 16 个字节,因此这将为您节省 space。举个例子:
struct X
{
float4 position;
float2 a;
float2 b;
};
struct Y
{
float4 position;
float2 a;
};
struct Z
{
float4 position;
float4 a_b;
};
在上面的例子中,X将使用48字节(有3个寄存器,每个16字节),而Y或Z只有32字节(有2个寄存器)。因此,使用 Z 可能会给您带来两全其美的效果。