bfloat 类型比 VK_KHR_16bit_storage 扩展提供的 fp16 有什么好处吗?

问题描述 投票:0回答:1

在 vulkan api 中,有两个使用 16 位类型的扩展,即

VK_KHR_16bit_storage
VK_KHR_shader_float16_int8
。因此,如果硬件支持这些扩展,则可以声明 fp16 类型变量以提供性能优势。

最近我读了一篇关于在着色器中使用 bfloat 类型变量的文章链接到文章。在文章中,他们修改了着色器编译器,并在编译过程中将 fp32 变量转换为 bfloat 类型。

我的问题是,与上面提到的 vulkan 扩展提供的简单 fp16 相比,在图形管道中使用 bfloat 类型是否有任何好处?我看到的一个好处是这些扩展依赖于 GPU 本身。但是,如果 GPU 支持 bfloat,编译器可以转换 fp32 变量。

提前致谢!

gpu glsl precision vulkan float32
1个回答
0
投票

对于支持 bfloat 的硬件,bfloat 和常规 16 位 IEEE-754 浮点之间的计算效率非常相似。 bfloats 的大小为 16 位,因此两者的内存访问时间都比另一个快。

与常规 16 位 IEEE-754 浮点相比,bfloat 的主要性能优势在于 bfloat 和 32 位浮点之间的转换非常简单。您只需从 32 位浮点中截断 16 位,现在就得到了等效的 bfloat。 16 位 IEEE-754 浮点转换稍微复杂一些。如果您进行大量此类转换,这可能会很重要。

但是,您链接到的文章并不是关于在着色器中显式使用 blfoats。它是关于获取使用 32 位浮点数的代码并将其更改为在背后使用 bfloat。也就是说,转换是在没有原始着色器作者请求的情况下发生的。

使用常规 16 位 IEEE-754 浮点数执行此操作非常危险。原因是这些浮点数的值范围大大缩短。如果我编写的代码需要完整的 32 位浮点范围,则转换为 16 位可能很容易开始吐出 INF,从而破坏计算。

但是,bfloats 的范围与 32 位浮点数几乎相同。它们的精度低得多,但它们的范围几乎相同。就人类可检测的视觉破损而言,代码往往更能容忍较低精度的结果,而不是范围不足的结果。

这使得这种后台代码转换不太可能产生不可接受的结果。

© www.soinside.com 2019 - 2024. All rights reserved.