半精度浮点数计算,浮点运算( 二 )


Nvidia CUDA核心工作流程但图形处理器的使用者看到如此高效能的浮点运算处理器的时候就在思考如何能让这类设备承担除了图形计算之外的浮点计算性能 。乘着GPGPU(General-purpose GPU)概念的逐渐兴起,显卡上的统一渲染架构的出现,也让这种计算方式真正成为现实 。Nvidia在2007年正式发布了CUDA并行计算平台 。
之后也出现了如openCL的通用计算API(应用程序编程接口) 。到此我们突然发现,GPU都来抢CPU的浮点运算饭碗了,但为什么CPU非但没有取消浮点运算单元,反而其浮点运算性能越来越强??AMD推土机架构示意图其实并不是没有人想到这样的情况,而是已经与产品这么做了,就是AMD的推土机架构 。这个架构放弃了之前的一个核心就由一套整数运算单元和浮点运算单元的组合,而是让两个核心共享一个浮点运算单元组成一个簇,而AMD将这种架构叫做CMT,又称为群集多线程技术,之后又将相对与Intel有优势的GPU核心集成进CPU中,产生了APU处理器 。
AMD当时还为此成立了HSA基金会,为解决CPU和GPU的内存统一寻址问题,也提出了hUMA技术并用在了Sony的PS4游戏机上 。Sony Playstation 4主机,CPU和GPU共享8GB GDDR5内存那为什么厂商做了这么多还是做不到用大规模的GPU取代CPU中的浮点运算单元呢?运算精度才是重点 。
CPU中的浮点运算单元是为了更高精度浮点运算准备的 。如在最新Intel处理器中的AVX指令集可以处理512位扩展数据,这样大大提升了计算精度和速度 。而GPU中的处理器都是为高度并行计算而设计的结构相对简单的核心,这些核心每一个都是SIMD处理器,但是能够处理的数据精度是有限的,在Nvidia以及AMD图形处理器上支持的数据精度大多是单精度和双精度浮点计算(FP32和FP64),甚至随着机器学习,深度学习,神经网络的流行,最新的图形处理器甚至支持了半精度浮点运算(FP16) 。
其次,由于在计算精度上相较于CPU中的浮点运算单元不高,所以在这些处理器中也没有内置数据校验和数据补偿处理的运算单元 。所以对于使用GPU进行科学计算的人,需要在编程阶段就避免这样的问题 。同时CPU和GPU在设计上就是非常不同的,CPU的浮点单元个数很少,但是单个浮点运算单元所提供的性能是很强的 。而GPU中是用过海量的SIMD单元堆砌出来的浮点运算能力 。
【半精度浮点数计算,浮点运算】在CPU设计时,还需要设计大量的多级缓存来提高CPU的运算速度 。而GPU中通常只为这些SIMD处理单元内置不多的缓存,而提供大量的内存(显存) 。所以综合上面的分析,我们可以得出的结论是虽然GPU拥有更强大的浮点运算性能,但是限于其计算单元的设计,统一内存架构的设计,其还是不能完全取代CPU中的浮点运算核心 。

推荐阅读