Неиспользуемые свойства металлической структуры ухудшают производительность

Предположим, у меня есть следующая структура в .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 потенциально даст вам лучшее из обоих миров.

Другие вопросы по тегам