Как эффективно поднять поле VkDispatchIndirectCommand для нескольких значений subgroupSize - PullRequest
0 голосов
/ 28 января 2019

Я играю с вычислительными шейдерами в Вулкане и столкнулся с проблемой, которую не могу решить, к моему удовлетворению.У меня 2 вычислительных шейдера.Первый вычисляет количество необходимых вызовов (среди прочего) во втором и записывает их (косвенно через atomicAdd - каждый вызов добавляет неизвестную сумму ко всему) в поле VkDispatchIndirectCommand.Проблема в том, что VkDispatchIndirectCommand представляет количество рабочих групп, а не вызовов, и количество вызовов на рабочую группу должно быть не менее subgroupSize (например, 32 в nvidia).Моя первая попытка исправить количество между двумя запусками шейдеров на стороне хоста привела к огромному падению производительности.Какой будет лучший подход или есть даже идеальное решение на вулкане, о котором я просто пока не знаю.

1 Ответ

0 голосов
/ 28 января 2019

При использовании atomicAdd звучит так, что количество желаемых вызовов рассчитывается распределенным образом по всем вызовам первой отправки.Предполагая, что вы не можете это изменить, и действительно нуждаетесь в пост-процессе для преобразования количества вызовов в число рабочих групп, вы можете запустить очень маленькую отправку (один поток) после первой, которая выполняет это преобразование перед косвенной отправкой.По сути, это то, что вы делаете на CPU, но выполняются на GPU конвейерным способом, который должен иметь меньшую задержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...