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

mjw*_*ach 4 shader opencl vulkan spir-v

我对在一组Vulkan计算着色器中实现特定算法感兴趣.该算法在一个点使用clz()函数.我希望我的NVIDIA GPU可能为这个功能提供硬件支持; CUDA显然使用clz指令,而clz()也在OpenCL 1.2中.所以我不想写自己的clz().有没有办法让我以CUDA或OpenCL的方式调用函数?

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

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

Nic*_*las 8

Vulkan绑定的SPIR-V可以访问GLSL扩展指令集,其中包括FindUMSB找到最高位的函数.你可以用它来模拟clz31 - FindUMSB.如果硬件具有显式clz指令,则编译器可以将减法分解出来并用内部替换表达式clz.