在某个时间点,Nvidia有一个扩展允许OpenGL 1.1的半浮点值,但显然从那时起*现代GLSL规范的世界half has been reclaimed在某个时刻。
今天我可以使用16bit floating point values in CUDA没有问题,NVIDIA支持16位浮点数的硬件应该没有问题,而且他们似乎在HLSL中支持它们,甚至似乎contradictory support them in HLSL cross compilation SPIR-V而GLSL不适用于Nvidia。似乎SPIR-V具有支持16位浮点所需的所有原语,无论primary extensions(KHR)如何,所以似乎没有理由禁止我使用它们。
我不确定为什么,尽管拥有Nvidia卡,我无法利用16位浮点运算,显然forced to use AMD或完全切换API如果我想要的话利用这一点。当然必须有一些方法来实际使用真正的16位浮点值?
我不是在询问主机到设备分配的缓冲区(IE顶点缓冲区)。是的,您可以将它们分配为带有KHR扩展的16位浮点数并且不会出现太多问题,但在实际着色器中,使用16位浮点数,而不是16位浮点数被强制转换为32位浮点数是我所担心的。
答案 0 :(得分:1)
您可能正在使用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_gup_shader_half_float,都提供此SPIR-V功能。如果Vulkan不提供此功能,那么您无法通过使用上限的SPIR-V着色器。
也就是说,您可以编译使用它的着色器,但是您无法将这些着色器传递给Vulkan at present。