Неиспользуемые свойства металлической структуры ухудшают производительность
Предположим, у меня есть следующая структура в .metal
файл:
struct VertexOut{
float4 position [[position]];
float2 a;
float2 b;
};
Эта структура является [[ stage-in ]]
вход для моих фрагментов шейдеров. Теперь некоторые из моих шейдеров используют b
а некоторые нет. Повреждает ли это производительность вообще, значит я должен создать другую структуру без b
для шейдеров, которым это не нужно?
1 ответ
Ответ зависит от вашего использования. Будет производительный удар по пропускной способности памяти, но он будет довольно небольшим. Если вы выводили полный экран пикселей с помощью этого шейдера и пропускная способность была ограничена, удаление ненужного float2 может помочь.
Однако при смене шейдеров часто наблюдается снижение производительности, поэтому вы, возможно, получаете выигрыш в производительности, поскольку нет необходимости менять фрагментные шейдеры, что, возможно, перевешивает любые потери.
Одно из предложений, которое я хотел бы сделать, - это изменить a и b, чтобы float4 a_b
и получить к нему доступ a_b.xy
а также a_b.zw
, Регистры выровнены до 16 байтов, так что это сэкономит вам место. Возьмите этот пример:
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 потенциально даст вам лучшее из обоих миров.