Есть ли способ использовать clz() в Vulkan Compute Shader?

Я заинтересован в реализации определенного алгоритма в наборе вычислительных шейдеров Vulkan. Алгоритм использует функцию clz() в одной точке. Я ожидаю, что мой NVIDIA GPU, вероятно, предлагает аппаратную поддержку для этой функции; CUDA, очевидно, использует инструкцию clz, и clz() также присутствует в OpenCL 1.2. Поэтому я не хочу писать свой собственный clz(). Могу ли я вызвать функцию так, как это сделали бы CUDA или OpenCL?

Я полагаю, я мог бы попытаться скомпилировать ядро ​​OpenCL для SPIR-V и использовать его в Vulkan, но я не думаю, что Vulkan был бы очень рад этому...?

У меня была еще одна мысль: возможно, я смогу перевести очень простое ядро ​​OpenCL, содержащее вызов clz(), в сборку SPIR-V, сделать то же самое с моим GLSL-шейдером, а затем вручную взломать вызов clz(), как он выглядит в коде сборки ядра, в код сборки шейдера. Но я на самом деле ничего не знаю о деталях SPIR-V или о каких-либо ограничениях, которые Vulkan может накладывать на то, какие инструкции SPIR-V могут использовать вычислительные шейдеры, поэтому я едва ли представляю, может ли это на самом деле работать.

1 ответ

Решение

Связанный с Vulkan SPIR-V имеет доступ к расширенному набору команд GLSL, который включает в себя функцию FindUMSB, который находит самый значимый бит. Вы можете использовать это, чтобы подражать clz при выполнении 31 - FindUMSB, Это возможно, если аппаратное обеспечение имеет явный clz инструкция, что компилятор может вычесть вычитание и заменить выражение внутренним clz,

Другие вопросы по тегам