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

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

我的另一个想法是,也许我可以将包含clz()调用的非常简单的OpenCL内核转换为SPIR-V程序集,对GLSL着色器执行相同的操作,然后手动修改clz()调用,如下所示在内核汇编代码中,进入着色器的汇编代码。但是我对SPIR-V的细节一无所知,或者Vulkan对计算着色器可以使用哪种SPIR-V指令可能有什么限制,所以我几乎不知道这是否真正可行。

最佳答案

绑定到Vulkan的SPIR-V可以访问GLSL extended instruction set,其中包括函数FindUMSB,该函数查找最高有效位。您可以通过执行clz使用它来模拟31 - FindUMSB。如果硬件具有明确的clz指令,则编译器可能会减去减法并将表达式替换为内部clz

07-27 13:41