CUDA 8混合精度编程
Mixed-Precision Programming with CUDA 8
论文地址:https://devblogs.nvidia.com/mixed-precision-programming-cuda-8/
更新,2019年3月25日:最新的Volta和Turing GPU现在加入了张量核,加速了某些类型的FP16矩阵数学。这使得在流行的人工智能框架中进行更快、更容易的混合精度计算成为可能。使用张量磁芯需要使用CUDA9或更高版本。NVIDIA还为TensorFlow、PyTorch和MXNet添加了自动混合精度功能。想多学点还是自己试试?在这里获取流行的人工智能框架的tensor核心优化示例。
在软件开发的实践中,程序员很早就学会了使用正确的工具来完成工作的重要性。当涉及到数值计算时,这一点尤其重要,因为在精度、精度和性能之间的权衡使得选择数据的最佳表示非常重要。随着Pascal GPU体系结构和CUDA 8的引入,NVIDIA正在扩展可用于混合精度计算的工具集,包括新的16位浮点和8/16位整数计算功能。
“随着在不同精度下计算的相对成本和易用性的发展,由于体系结构和软件的变化,以及GPU等加速器的破坏性影响,将看到混合精度算法的开发和使用越来越多。”—Nick Higham,Richardson应用数学教授,曼彻斯特大学。
许多技术和高性能计算机应用需要32位(单浮点数,或FP32)或64位(双浮点数,或FP64)浮点的高精度计算,甚至还有依赖更高精度(128位或256位浮点)的GPU加速应用。但是有许多应用需要低精度的算法。例如,在快速增长的深度学习领域的研究人员发现,由于训练深层神经网络时使用的反向传播算法,深层神经网络结构对错误具有自然的弹性,一些人认为16位浮点(半精度,或FP16)足以训练神经网络。
与精度更高的FP32或FP64相比,存储FP16(半精度)数据减少了神经网络的内存使用,允许训练和部署更大的网络,并且FP16数据传输比FP32或FP64传输花费的时间更少。此外,对于许多网络,可以使用8位整数计算来执行深度学习推断,而不会对精度产生显著影响。
除了深度学习之外,使用摄像机或其真实传感器数据的应用程序通常不需要高精度浮点计算,因为传感器生成低精度或低动态范围数据。射电望远镜处理的数据就是一个很好的例子。正如将在本文后面看到的,使用8位整数计算可以大大加快用于处理射电望远镜数据的互相关算法。
在计算方法中结合使用不同的数值精度称为混合精度。NVIDIA Pascal体系结构通过在32位数据路径中添加向量指令(将多个操作打包到一个数据路径中),为能够利用较低精度计算的应用程序提供了旨在提供更高性能的功能。具体地说,这些指令操作16位浮点数据(“半”或FP16)和8位和16位整数数据(INT8和INT16)。
新的NVIDIA Tesla P100由GP100 GPU供电,可以以FP32的两倍吞吐量执行FP16算法。GP102(Tesla P40和NVIDIA Titan X)、GP104(Tesla P4)和GP106 gpu都支持指令,这些指令可以对2和4元素8位向量执行整数点积,并累加为32位整数。这些指令对于实现高效的深度学习推理以及射电天文学等其应用具有重要价值。
在这篇文章中,将提供一些有关半精度浮点的详细信息,并提供使用FP16和INT8矢量计算在Pascal gpu上可实现的性能的详细信息。还将讨论各种CUDA平台库和api提供的混合精度计算能力。
A Bit (or 16) about Floating Point Precision
每一位计算机科学家都应该知道,浮点数提供了一种表示法,允许在计算机上对实数进行近似,同时在范围和精度之间进行权衡。浮点数将实值近似为一组有效数字(称为尾数或有效位),然后按固定基数的指数缩放(当前大多数计算机上使用的IEEE标准浮点数的基数为2)。 常见的浮点格式包括32位,称为“单精度”(“float”在C派生的编程语言中)和64位,称为“双精度”(“double”)。根据IEEE 754标准的定义,32位浮点值包括符号位、8个指数位和23个尾数位。64位双精度包含一个符号位、11个指数位和52个尾数位。在本文中,对(较新的)IEEE754标准16位浮点半类型感兴趣,包含一个符号位、5个指数位和10个尾数位,如图1所示。