Исправление
Решение заключалось в явном задании значения для requiredSubgroupSize. Конечно для более гибкого решения надо использовать значение gl_SubgroupSize. А все циклы, смещения и проверки динамически рассчитывать на основе реального размера подгруппы в момент выполнения.
Вывод, стоивший мне вечера:
1. Vulkan — это не CUDA. Перенос алгоритмов вслепую — путь к ошибкам которые будет непросто
исправить.
2. Размер subgroup — это runtime-переменная. Если вы явно не зафиксировали его, будьте готовы к чему угодно. Или учитывайте это в реализации ваших алгоритмов.
3. Документация — ваш лучший друг. Но спецификация Vulkan — это еще один способ провести увлекательные выходные так как она не всегда актуальная и связная, плюс отсутствуют примеры для вот таких особенных случаев. Но если хорошо поискать можно найти соответствующие разделы.
В итоге это был просто очень интересный баг, который заставил меня погрузиться в архитектурные особенности Vulkan и GPU.
Если вам было интересно и хочется попробовать себя в разработке под GPU для машинного обучения присоединяйтесь к проекту Adept.
Post #6
226
- 👍 3
- ❤ 1