我对在一组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指令有任何限制,所以我几乎不知道这是否真的可以实现工作
答案 0 :(得分:7)
Vulkan绑定的SPIR-V可以访问GLSL extended instruction set,其中包含函数FindUMSB
,它找到最重要的位。您可以通过执行clz
来使用它来模拟31 - FindUMSB
。如果硬件具有明确的clz
指令,则编译器可以将减法分解出来并用内部clz
替换表达式。