4

似乎在某个时间点,Nvidia 有一个扩展允许OpenGL 1.1的半浮点值,但显然从那时起*世界一半已在某个时候被现代 GLSL 规范回收。

今天我可以在 CUDA 中使用 16 位浮点值没问题,NVIDIA 支持 16 位浮点数的硬件应该没有问题,而且它们似乎在 HLSL 中支持它们,甚至在 HLSL 交叉编译中支持它们似乎是矛盾的SPIR-V 而 GLSL 不适用于 Nvidia。似乎 SPIR-V 具有支持 16 位浮点所需的所有原语,无论使用主扩展(KHR),因此似乎没有理由禁止我使用它们。

我不确定为什么,尽管有 Nvidia 卡,但我不能利用 16 位浮点运算,而且如果我想利用它,显然被迫使用 AMD或完全切换 API。肯定有某种方法可以为两者实际使用真正的 16 位浮点值吗?

我不是在询问主机到设备分配的缓冲区(IE 顶点缓冲区)。是的,您可以将它们分配为带有 KHR 扩展的 16 位浮点数,并且没有太大问题,但在实际着色器中,使用 16 位浮点数,而不是强制转换为 32 位浮点数的 16 位浮点数是我担心的。

4

1 回答 1

5

您可能正在使用 glslang 编译器将您的 GLSL 编译为 SPIR-V。使用该编译器,对 GLSL 的特定于平台的扩展并不是真正的“特定于平台的”。接收 SPIR-V 代码的编译器和 Vulkan 通常很重要。

因为 GL_AMD_gpu_shader_half_float 功能直接映射到 SPIR-V 功能而不是 AMD 扩展,所以 glslang 将输出使用该Float16功能的 SPIR-V 代码。只要接收 Vulkan 实现提供该Float16功能,就可以了。

当然,您并不好,因为 Vulkan 实现提供此功能。没有 Vulkan 功能或扩展,甚至 VK_AMD_gpu_shader_half_float 都提供这种 SPIR-V 功能。如果 Vulkan 不提供该功能,则您无法将使用上限的 SPIR-V 着色器传递给它。

也就是说,您可以编译使用它的着色器,但目前您不能将这些着色器传递给 Vulkan 。

于 2018-04-17T22:36:33.083 回答