Есть ли способ использовать 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
,