主要内容

什么是半精度?

IEEE®754半精度浮点格式是将16位的字分成1位的符号指示符年代,一个5位偏置指数e,和一个10位的分数f

显示半精度数据类型的位分配示意图。

因为类型的数字一半存储使用16位,他们需要更少的内存比数字类型,使用32位,或者,它使用64位。但是,由于它们存储的比特数较少,类型的数字较少一半表示的精度低于类型的数字

下表给出了支持的浮点数据类型的范围、偏置和精度。金宝app

数据类型

较低的限制

高温限制

指数的偏见

精度

一半

2−14≈6.1·10−5

(2−2-10)·215≈6.5·104

15

2−10≈10−3

2−126≈10−38

2128≈3·1038

127

2−23≈10−7

2−1022≈2·10−308

21024≈2·10308

1023

2−52≈10−16

有关半精度数据类型介绍的视频,请参见半精确是什么?而且建模与代码生成中的半精确数学

半精度应用

当算法包含较大的或未知的动态范围(例如反馈循环中的积分器)或当算法使用难以在定点设计的操作时(例如量化)时,使用浮点表示会更有优势。半精度数据类型仅占用16位内存,但其浮点表示形式使其能够处理比相同大小的整数或定点数据类型更宽的动态范围。这使得半精度特别适合于一些图像处理和图形应用。当半精度用于深度神经网络时,训练和推理所需的时间可以减少。通过使用一半精度作为查找表的存储时间,可以减少查找表的内存占用。

MATLAB例子

  • 雾整改(GPU编码器)-雾校正图像处理算法通过卷积、图像颜色空间转换和基于直方图的对比度拉伸来增强输入图像。这个例子展示了如何生成和执行CUDA®用于这些图像处理操作的半精度数据类型的MEX。

    应用雾校正算法前后的道路图像。

  • 半精度Sobel法边缘检测(GPU编码器)- sobel边缘检测算法采用输入图像并返回输出图像,该输出图像强调与输入图像中边缘对应的高空间频率区域。这个示例展示了如何使用用于输入图像和Sobel操作符内核值的半精度数据类型生成和执行CUDA MEX。

    应用Sobel边缘检测算法对辣椒前后图像进行检测。

  • 生成使用半精度数据类型的Sobel边缘检测代码(MATLAB编码器)这个例子展示了如何从MATLAB生成一个独立的c++库®函数使用半精度浮点数对图像进行Sobel边缘检测。

金宝app例子

  • 半精度定向场控制算法这个例子实现了一个同时使用单精度和半精度的面向场控制(FOC)算法。

  • 半精度数据类型的图像量化这个例子展示了量化对图像的影响。虽然定点数据类型并不总是产生可接受的结果,但半精度数据类型(它使用与定点数据类型相同的位数)产生的结果与单精度结果相当。

    用于定点、半精度和单精度数据类型的棋盘图像上显示的量化效果。

  • 半精度数据类型的数字分类-这个例子比较了训练过的神经网络分类模型在双精度和半精度下的结果。

  • 将单精度查找表转换为半精度这个例子演示了如何将单精度查找表转换为使用半精度查找表。半精度是存储型;查找表计算使用单精度执行。转换为半精度后,内存的大小查找表块减少了一半,同时保持所需的系统性能。

在嵌入式应用程序中使用半精度的好处

半精度数据类型比其他浮点类型(如single和double)使用更少的内存。虽然它只占用16位内存,但它的浮点表示形式使它能够处理比相同大小的整数或定点数据类型更宽的动态范围。

FPGA

在硬件上使用时,与单精度数据类型相比,半精度数据类型使用的面积显著减少,并且具有较低的延迟。半精度对于低动态范围应用尤其有利。

下图显示了在Xilinx中使用半精度实现面向场的控制算法的优点®Virtex®7硬件。

比较Fmax, dsp, LUTs和切片的单精度和半精度。

GPU

在支持半精度数据类型的gp金宝appu中,算术运算比单精度或双精度更快。

在像深度学习这样需要大量计算的应用中,使用一半精度可以在不显著损失精度的情况下提供显著的性能优势。使用GPU Coder™,您可以从深度学习工具箱™生成用于预测各种经过训练的深度学习网络的优化代码。您可以配置代码生成器以利用NVIDIA®用于NVIDIA gpu的TensorRT高性能推理库。TensorRT通过组合网络层和优化内核选择,提高了延迟、吞吐量和内存效率。您还可以配置代码生成器以利用TensorRT的精确模式(FP32、FP16或INT8)来进一步提高性能并减少内存需求。

CPU

在支持半精度数据类型的cp金宝appu中,算术操作比单精度或双精度更快。的手臂®目标本身支持半精度数据类型,您可以从MATL金宝appAB或Simulink生成原生半C代码金宝app®.看到半精度的代码生成

半精度MATLAB

MATLAB中的许多函数都支持半精度数据类型。金宝app有关支持的函数的完整列表,请参见金宝app一半

半精度金宝app

Simulink中的信号和块输出可以指定半精度数据类型。金宝app半精度数据类型支持用于参数和块子集的模拟和代码生成。金宝app要查看支持半精度的块,在命令行输入:金宝app

showblockdatatypetable

块,支持半精度显示和金宝appX在标签栏中一半.有关Simulink中半精度支持的详细信息,请参见金宝app金宝appSimulink中的半精度数据类型金宝app

半精度的代码生成

半精度数据类型支持C/ c++代码生成,使用GPU Coder生金宝app成CUDA代码,使用HDL Coder™生成HDL代码。对于GPU目标,半精度数据类型使用NVIDIA GPU中可用的原生半数据类型,以获得最大性能。

有关MATLAB和Simulink中半精度代码生成支持的详金宝app细信息,请参见金宝app半精度代码生成支持金宝app而且Simulink中的半精度数据类型金宝app

对于原生支持半精度的特殊类型的嵌入式硬件目标,例如金宝app_Float16而且_fp16对于ARM编译器的数据类型,您可以使用Embedded Coder生成原生半精度C代码®MATLAB编码器™.有关更多信息,请参见从Simulink模型生成本地半精度C代码金宝app而且使用MATLAB编码器生成本地半精度C代码

另请参阅

|||

相关的话题