有没有办法在 Vulkan 计算着色器中使用 clz()?

Is there a way to use clz() in a Vulkan compute shader?

我有兴趣在一组 Vulkan 计算着色器中实现特定算法。该算法在某一点使用 clz() 函数。我希望我的 NVIDIA GPU 可能为此功能提供硬件支持; CUDA 显然使用了 clz 指令,而 clz() 也在 OpenCL 1.2 中。所以我不想写我自己的 clz()。有什么方法可以像 CUDA 或 OpenCL 那样调用函数吗?

我想我可以尝试将 OpenCL 内核编译为 SPIR-V 并在 Vulkan 中使用它,但我认为 Vulkan 不会对此感到非常高兴...?

我的另一个想法是,也许我可以翻译一个非常简单的 OpenCL 内核,其中包含对 SPIR-V 程序集的 clz() 调用,对我的 GLSL 着色器执行相同的操作,然后手动破解 clz()调用,因为它出现在内核汇编代码中,进入着色器的汇编代码。但我真的不知道任何关于 SPIR-V 的细节,或者 Vulkan 可能对计算着色器可能使用的 SPIR-V 指令类型施加的任何限制,所以我几乎不知道它是否真的有效。

绑定 Vulkan 的 SPIR-V 可以访问 GLSL extended instruction set,其中包括找到最高有效位的函数 FindUMSB。您可以通过 31 - FindUMSB 使用它来模拟 clz。如果硬件有明确的 clz 指令,编译器可能会分解出减法并用内部 clz.

替换表达式。