Следует ли оптимизировать сгенерированный код SPIR-V?
В настоящее время я рассматриваю возможность переноса имеющегося у меня кода из OpenGL/GLSL в Vulkan/SPIR-V, и часть этого кода генерирует GLSL во время выполнения, поэтому вместо этого мне придется генерировать SPIR-V. Что мне интересно, так это то, как я должен относиться к оптимизации в сгенерированном SPIR-V.
В частности, я не могу найти какую-либо информацию о том, какие ожидания мне следует ожидать от компилятора драйвера. Стоит ли ожидать, что он выполнит агрессивную оптимизацию самостоятельно и, таким образом, попытается сохранить чистоту кода SPIR-V и сохранить в нем как можно больше "первоначальных намерений", чтобы компилятор мог на него взглянуть? Или я должен ожидать, что он произведет довольно упрощенную генерацию кода и попытается сделать как можно более агрессивную оптимизацию при создании SPIR-V?
Просто, возможно, для конкретных примеров, что из такого рода вещей я должен делать при создании SPIR-V?
- Устранить избыточные хранилища, а затем загрузить локальные переменные?
- Разматывание петли или отслоение пилинга / функции?
- Постоянное распространение / устранение общего подвыражения?
- Сохранить как можно больше в форме SSA вместо загрузок и сохранять в локальные переменные?
Я очень наивно ожидал, что компилятор захочет адаптировать свои этапы оптимизации к особенностям аппаратного обеспечения, и поэтому мне следует постараться сохранить мой код SPIR-V чистым и высокоуровневым, где такие вещи, как развертывание цикла, будут уничтожать информацию и не дать водителю принять решение о его развёртывании, но я просто догадываюсь без какой-либо реальной информации.
1 ответ
Обычно можно ожидать, что компилятор времени выполнения (в драйвере использует SPIR-V) выполнит много стандартных оптимизаций. Во многих реализациях это тот же самый бэкэнд, что и в драйвере GL, и выполняет большую часть тех же оптимизаций. Но процесс разбора SPIR-V и перевода его во внутреннее представление драйвера будет быстрее, если там не будет много ненужного мусора. Поэтому, если вы пишете свой собственный генератор, стоит приложить немало усилий для создания "чистого" SPIR-V.
Вы можете взглянуть на shaderc, который предназначен для простой в интеграции библиотеки, которая использует glslang для перевода GLSL-to-SPIR-V, а также может запустить spirv-opt для выполнения некоторых названных вами оптимизаций. По мере того, как spirv-opt получает дополнительные оптимизации (в процессе активной разработки), shaderc будет их подбирать.