4

我有兴趣在一组 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 指令施加任何限制,所以我几乎不知道这是否真的有效。

4

1 回答 1

8

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

于 2016-08-19T20:14:46.940 回答