Следует ли оптимизировать сгенерированный код SPIR-V?

В настоящее время я рассматриваю возможность переноса имеющегося у меня кода с OpenGL / GLSL на Vulkan / SPIR-V, и часть этого кода генерирует GLSL во время выполнения, поэтому мне придется вместо этого сгенерировать SPIR-V. Что мне интересно, так это то, как я должен относиться к оптимизации в сгенерированном SPIR-V.

В частности, я не могу найти никакой информации о том, какие ожидания я должен иметь от компилятора драйвера. Должен ли я ожидать, что он сам по себе будет проводить агрессивную оптимизацию и, таким образом, попытаться сохранить код SPIR-V в чистоте и сохранить в нем как можно больше «первоначального намерения», чтобы компилятор мог их рассмотреть? Или мне следует ожидать, что он будет генерировать довольно упрощенный код и попытаюсь сделать как можно более агрессивную оптимизацию при генерации SPIR-V?

Просто, возможно, для конкретных примеров, какие из этих вещей мне следует делать при генерации SPIR-V?

  • Устранить избыточные хранилища, а затем загружать локальные переменные?
  • Развертывание петли или пилинг / встраивание функции?
  • Устранение постоянного распространения / общего подвыражения?
  • Сохранять как можно больше в форме SSA, а не загружать и сохранять в локальные переменные?

Мое очень наивное ожидание состоит в том, что компилятор захочет адаптировать свои проходы оптимизации к особенностям оборудования, и поэтому я должен попытаться сохранить свой код SPIR-V чистым и высокоуровневым, где такие вещи, как развертывание цикла, уничтожат информацию и удерживать драйвер от самостоятельного развертывания, но на самом деле я просто гадаю без какой-либо реальной информации.


person Dolda2000    schedule 30.04.2017    source источник
comment
поэтому мне придется вместо этого сгенерировать SPIR-V Есть ли какие-то проблемы с использованием существующего компилятора GLSL-to-SPIR-V?   -  person Nicol Bolas    schedule 01.05.2017
comment
@NicolBolas: Да, тот факт, что я генерирую код во время выполнения, поэтому я не хотел бы полагаться на внешние инструменты.   -  person Dolda2000    schedule 01.05.2017
comment
Вы не можете включить компилятор в свой код во время выполнения? Потому что это тоже есть в виде библиотеки.   -  person Nicol Bolas    schedule 01.05.2017
comment
@NicolBolas: Во-первых, мой код написан на Java, и, по крайней мере, я не думаю, что существует существующая оболочка JNI. Кроме того, у меня есть вся доступная информация для непосредственной генерации SPIR-V, поэтому, поскольку код можно очистить от внешних зависимостей, я не понимаю, почему бы и нет.   -  person Dolda2000    schedule 01.05.2017
comment
Я бы посоветовал посмотреть на качество кода SPIR-V, сгенерированного glslang. Если он выполняет множество сложных операций сворачивания константных выражений и т. Д., Исключения мертвого кода, развертывания цикла и т. Д., То ваш код должен поступать так же. Если нет, то, вероятно, и вам не нужно.   -  person Nicol Bolas    schedule 01.05.2017
comment
@NicolBolas: На самом деле, одна из причин, по которой я задал этот вопрос, заключалась в том, что я нашел несколько мест в Интернете, где люди жаловались, что glslang недостаточно оптимизирован, но я не мог сказать, является ли glslang просто недостаточно развитым, или если эти люди искали оптимизацию, которой не должно быть.   -  person Dolda2000    schedule 01.05.2017
comment
«Не следует» в конечном итоге будет зависеть от качества реализации потребляющего SPIR-V, поэтому на этот счет ваш вопрос по существу не имеет ответа. Поскольку многие люди используют glslang, понятно, что разработчики будут создавать свой оптимизирующий код SPIR-V для обработки того, что он излучает.   -  person Nicol Bolas    schedule 01.05.2017
comment
@NicolBolas: Ну, вот почему я надеялся получить ответ от того, кто знал, что на самом деле делают реализации.   -  person Dolda2000    schedule 01.05.2017


Ответы (1)


Обычно можно ожидать, что компилятор времени выполнения (в драйвере использует SPIR-V) выполнит множество стандартных оптимизаций. Во многих реализациях это тот же бэкэнд, что и в драйвере GL, и выполняет большую часть тех же оптимизаций. Но процесс синтаксического анализа SPIR-V и его преобразования во внутреннее представление драйвера будет быстрее, если там не будет много ненужного мусора. Так что, если вы пишете свой собственный генератор, стоит приложить немного усилий для создания «чистого» SPIR-V.

Вы можете взглянуть на shaderc, который предназначен для простой в интеграции библиотеки, использующей glslang для перевода GLSL в SPIR-V, а также может запустить spirv-opt для выполнения некоторых из названных вами оптимизаций. По мере того, как spirv-opt получает дополнительную оптимизацию (в активной разработке), шейдерк подберет их.

person Jesse Hall    schedule 01.05.2017