Благодаря ответу Юрия Килочека я смог найти решение с помощью параллельного prefix-sums / scan
Предположим, к данным был добавлен массив «флаг», который равен 1, если соответствующая ячейка массива не равна нулю, иначе 0. Затем « параллельное исключительное сканирование » в массиве флагов даст индекс compressed_array, в который вызовы с активным флагом должны записывать свое соответствующее содержимое «массива» (операция разброса).
In Vulkan this can be implemented efficiently using подгруппы .
Однако каждая подгруппа обычно может выполнять сканирование только до 32 (Nvidia) или 64 (AMD) элементов, в то время как локальная группа может быть в несколько раз больше. Чтобы выполнить сканирование всей локальной группы, необходим многоуровневый подход сканирования как , описанного здесь, и , кодированного здесь .