В настоящее время я рассматриваю возможность переноса имеющегося у меня кода с OpenGL / GLSL на Vulkan / SPIR-V, и часть этого кода генерирует GLSL во время выполнения, поэтому мне придется вместо этого сгенерировать SPIR-V. Что мне интересно, так это то, как я должен относиться к оптимизации в сгенерированном SPIR-V.
В частности, я не могу найти никакой информации о том, какие ожидания я должен иметь от компилятора драйвера. Должен ли я ожидать, что он сам по себе будет проводить агрессивную оптимизацию и, таким образом, попытаться сохранить код SPIR-V в чистоте и сохранить в нем как можно больше «первоначального намерения», чтобы компилятор мог их рассмотреть? Или мне следует ожидать, что он будет генерировать довольно упрощенный код и попытаюсь сделать как можно более агрессивную оптимизацию при генерации SPIR-V?
Просто, возможно, для конкретных примеров, какие из этих вещей мне следует делать при генерации SPIR-V?
- Устранить избыточные хранилища, а затем загружать локальные переменные?
- Развертывание петли или пилинг / встраивание функции?
- Устранение постоянного распространения / общего подвыражения?
- Сохранять как можно больше в форме SSA, а не загружать и сохранять в локальные переменные?
Мое очень наивное ожидание состоит в том, что компилятор захочет адаптировать свои проходы оптимизации к особенностям оборудования, и поэтому я должен попытаться сохранить свой код SPIR-V чистым и высокоуровневым, где такие вещи, как развертывание цикла, уничтожат информацию и удерживать драйвер от самостоятельного развертывания, но на самом деле я просто гадаю без какой-либо реальной информации.