C++23 标准中的 bfloat16_t 是什么?

Bro*_*her 9 c++ floating-point c++23

Cppreference文档包含 5个stdfloat新类型:float16_tfloat32_tfloat64_tfloat128_tbfloat16_t虽然前 4 种类型是不言自明的(分别是 16、32、64 和 128 位的浮点数),但最后一种类型bfloat16_t对我来说根本不清楚。这个类型代表什么?它的名字中的是什么b意思?

Nic*_*las 15

“bfloat16”指的是一种相当新的 16 位浮点格式,它不是有效的 IEEE-754/IEC 60559 定义的格式。但这与他们有关。

BINARY16 只是 BINARY32,其组件编号较小。但尺寸变化是均匀分布的;它具有较小的尾数和较小的指数。

Bfloat16 选择不同的方式来使用其 16 位。它选择保持指数与 BINARY32(8 位)相同的大小,同时将尾数缩小到 7 位(显式)。这使得 bfloat16 和 BINARY32 之间的转换变得更快。

它确实有一些特殊情况的奇怪之处,但总的来说,它是一个截断的 BINARY32。尽管它得到数量惊人的 GPU 硬件的广泛支持,但它并不是真正的标准。

bfloat16 的实用性归结为两点:转换速度和 BINARY16 的妥协。

BINARY16 是一种很棒的颜色格式。对于高动态范围渲染的许多情况来说,最大范围仅比零高 5 个十进制数量级就足够了。

但这种妥协对于机器学习操作来说是一个问题。如果精度很重要,那么您将不得不花费 32 位来获得它。但如果精度不是那么重要,那么能够在不影响范围的情况下节省 16 位,在这些应用中可能会很有用。