现代建筑是否支持半精度?

计算科学 数字 浮点 精确 硬件
2021-12-11 21:20:29

我是计算机科学的新手,我想知道现代架构是否支持半精度,就像单精度或双精度一样。我认为 IEEE-754 标准的 2008 年修订版引入了四倍精度和半精度。

4个回答

Intel 支持 IEEE float16存储格式

自 Ivy Bridge (2013) 以来,英特尔支持 IEEE half 作为处理器中的存储类型。存储类型意味着您可以获得内存/缓存容量/带宽优势,但在转换为 IEEE 半精度格式和从 IEEE 半精度格式转换后,计算是以单精度完成的。

英特尔对 BFloat16 的支持

英特尔已宣布在 Cooper Lake 和 Sapphire Rapids 中支持 BF16。

我为英特尔工作。我引用官方消息,不会评论谣言等。

很好奇 IEEE FP16 与 BF16 的相对优点。这个话题有很多分析,例如https://nhigham.com/2018/12/03/half-precision-arithmetic-fp16-versus-bfloat16/

非英特尔硬件支持

以下是有关其他处理器的信息。请根据需要与供应商核实。

http://on-demand.gputechconf.com/gtc/2017/presentation/s7676-piotr-luszcek-half-precision-bencharking-for-hpc.pdf列出了以下硬件支持:

  • AMD - MI5、MI8、MI25
  • ARM - V8.2-A 中的 NEON VFP FP16
  • NVIDIA - Pascal 和 Volta

NVIDIA Ampere 也支持 FP16 ( https://devblogs.nvidia.com/nvidia-ampere-architecture-in-depth/ )。

在我看来,不是很统一。低精度算术似乎在机器学习中获得了一些关注,但人们对低精度的含义有不同的定义。有 IEEE-754 一半(10 位尾数,5 位指数,1 位符号),还有 bfloat16(7 位尾数,8 位指数,1 位符号),它有利于动态范围而不是精度,以及各种其他格式(NVidia 的19 位 TensorFloat,AMD 的 fp24,也许更多?)。这些东西大部分都在专用的 GPGPU 类型的硬件上运行。

相比之下,float 和 double 具有普遍认可的含义,作为 IEEE-754 兼容的 32 位 (23/8/1) 和 64 位 (52/11/1) 表示。

接受的答案提供了一个概述。我将添加更多有关 NVIDIA 处理器支持的详细信息。我在这里描述的支持是 16 位、符合 IEEE 754 的浮点算术支持,包括加法、乘法、乘法加法以及与其他格式的转换。

麦克斯韦(大约 2015 年)

最早的IEEE 754 FP16(“二进制16”或“半精度”)支持出现在 Maxwell 一代的 cc(计算能力)5.3 设备中,但这种计算能力仅在Tegra TX1 处理器(SoC,例如 Jetson)中实现.

帕斯卡(约 2016 年)

Pascal系列成员具有​​“全速率”(cc 6.0、6.2)或“低速率”(cc 6.1)FP16 吞吐量。cc6.2 再次成为 Tegra 系列产品 TX2。cc 6.0 和 6.1 用于各种产品系列的各种处理器,例如 GeForce、Quadro 和 Tesla。这里的“全速率”是指当使用 half2 数据类型(两个半量在相同的寄存器和指令)。

图灵沃尔特(2017、2018)

VoltaTuring家族成员 (cc 7.x) 以“全速率”支持 FP16,此外还在TensorCore操作中使用该格式。

安培(2020 年 5 月)

最近发布的Ampere 架构 A100 GPU还以类似于 Volta 和 Turing 的方式支持 FP16,并为TF32 数据类型引入了额外的功能,这是一种尾数与 FP16 尾数大小(位数)相同的格式,以及指数与 FP32 指数的大小相同。 Bfloat16功能也在 Ampere 中宣布。

除了最近宣布的 Ampere 架构处理器,跨计算能力(包括架构)的 16 位浮点运算(和其他运算)的支持和吞吐量可以在CUDA 编程指南的表 3 中找到。吞吐量是按时钟、每个多处理器计算的,因此需要根据 GPU 类型和规格进行相应调整。这些吞吐量不适用于 TensorCore 操作,峰值吞吐量通常仅适用于处理 half2 数据类型(两个半量打包在一个 32 位字中)时。

您可以通过以下方式了解您的硬件是否支持半精度:

$ lscpu | grep Flags | grep f16c
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti ssbd mba ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req md_clear flush_l1d

f16c指令记录在这里