转自:http://weibo.com/ttarticle/p/show?id=2309403987017473113077
其实说到浮点计算能力,首先得区分不同精度的浮点数,虽然Linpack测试里只关心双精度的浮点计算能力,但在其他领域,有时候反而会更加关注单精度甚至是半精度的浮点计算能力。
半精度、单精度、双精度这些概念是在IEEE 754标准里定义的,浮点计数是利用浮动小数点的方式使用不同长度的二进制来表示一个数字,与之对应的是定点数。同样的长度下浮点数能表达的数字范围相比定点数更大,但浮点数并不能精确表达所有实数,而只能采用更加接近的不同精度来表达。单精度的浮点数中采用4个字节也就是32位二进制来表达一个数字,双精度浮点数采用8个字节也就是64bits来表达,当然半精度浮点数也就是采用16bits了。因为采用不同位数的浮点数的表达精度不一样,所以造成的计算误差也不一样,对于需要处理的数字范围大而且需要精确计算的科学计算来说,就要求采用双精度浮点数,而对于常见的多媒体和图形处理计算,32位的单精度浮点计算已经足够了,对于要求精度更低的机器学习等一些应用来说,半精度16位浮点数就可以甚至8位浮点数就已经够用了。
CPU和GPU最大的不同在于内部计算单元数量的差异以及处理方式的不同,CPU内部的核心数较少而且设计上更倾向于顺序串行处理数据,GPU则因为只需要支持相对单一的数据类型和计算方式,所以计算单元较小但数量更多而且更倾向于并行处理数据。一个简单的比较是现在的Intel CPU最多也就支持24核但GPU则动不动就支持几千个核了。
CPU vs GPU
对于浮点计算来说,CPU可以同时支持不同精度的浮点运算,但在GPU里针对单精度和双精度就需要各自独立的计算单元,一般在GPU里支持单精度运算的Single Precision ALU称之为FP32 core或简称core,而把用作双精度运算的Double Precision ALU称之为DP unit或者FP64 core,在Nvidia不同架构不同型号的GPU之间,这两者数量的比例差异很大。
Nvidia GPU Architecture evolution
在第三代的Kepler架构里,FP64单元和FP32单元的比例是1:3或者1:24
第四代的Maxwell架构里,这个比例下降到了只有1:32
第五代的Pascal架构里,这个比例又提高到了1:2,但低端型号里仍然保持为1:32
这种比例在这些GPU的架构图表现也非常明显,比如下面Tesla P100采用的GP100架构图中,用黄色标记的DP Unit和绿色的Core比例很明显就是1:2,所以P100的单精度性能和双精度性能也相差了一倍。
Nvidia Pascal P100 Architecture
GPU的浮点计算理论峰值能力测试跟CPU的计算方式基本一样,
理论峰值 = GPU芯片数量*GPU Boost主频*核心数量*单个时钟周期内能处理的浮点计算次数,
只不过在GPU里单精度和双精度的浮点计算能力需要分开计算,以最新的Tesla P100为例:
双精度理论峰值 = FP64 Cores * GPU Boost Clock * 2 = 1792 *1.48GHz*2 = 5.3 TFlops
单精度理论峰值 = FP32 cores * GPU Boost Clock * 2 = 3584 * 1.58GHz * 2 = 10.6 TFlops
因为P100还支持在一个FP32里同时进行2次FP16的半精度浮点计算,所以对于半精度的理论峰值更是单精度浮点数计算能力的两倍也就是达到21.2TFlops 。
Nvidia的Tesla P100基本也代表了如今GPU的最强性能,双精度5.3TFlops的计算能力也确实能秒掉采用Intel最高端E7 v4 CPU的四路X86服务器了,虽然这个理论峰值计算里面采用的GPU核心频率是Boost后的主频,相比一般计算CPU理论峰值计算能力时采用的基本主频来说并不太公平,但即使去掉Boost后提升的11%性能,单个Tesla P100的浮点计算能力也还是超过当前最高端的4路E7 v4服务器的3TFlops 了。
Tesla P100是Tesla系列里面最新的产品,相比前两代采用Kepler架构的K40和Maxwell架构的M40两款产品来说,P100不仅在单精度浮点计算性能超过前两代产品,双精度浮点性能相比Kepler更有3倍多的提升,相比Maxwell就更是高到不知道哪里去了。这三者详细的参数对比可以看下表
K40 vs M40 vs P100
Nvidia的GPU产品主要分成3个系列产品,分别面向不同的应用类型和用户群体,这三个系列产品分别是:
1.主要面向3D游戏应用的GeForce系列,几个高端型号分别是GTX1080、Titan X和GTX980,分别采用最新的Pascal架构和Maxwell架构,因为面向游戏玩家,对双精度计算能力没有需求,所以双精度计算单元只有单精度计算单元的1/32,但同时也因为受众群体较大,出货量也大,单价相比采用相同架构的Tesla系列产品要便宜很多,也经常被用于机器学习
Nvidia GeForce
2.面向专业图形工作站应用的Quadro系列,主要是针对CAD、3DMaxs、Maya这一类的设计软件做过驱动层的优化,因为针对专业用户人群,出货量少,所以采用相同架构的Quadro售价比GeForce高出许多,也很少有人会拿它去用作别的用途
3.专用GPU加速计算的Tesla系列,Tesla本是第一代产品的架构名称,后来演变成了这个系列产品的名称了,最新的第五代架构名为Pascal,对应的产品型号就是前面提到的P100。而采用前两代架构Kepler和Maxwell的产品目前也还在销售,分别对应K系列和M系列的产品,目前市面上常见的也就是K40/K80、M4/M40/M60等几个型号。K系列更适合用作HPC科学计算,M系列则更适合机器学习用途。
另外Nvidia还有一个专门针对虚拟化环境应用的GRID GPU产品,目前只有K1和K2两个型号,同样采用Kepler架构,实现了GPU的硬件虚拟化,可以让多个用户共享使用同一张GPU卡,适用于对3D性能有要求的VDI或云环境下多租户的GPU加速计算场景。K1上集成了4颗入门级的Kepler GPU,支持的CUDA核心数量较少只有768核,但提供更大的总显存容量16GB,K2则集成了2颗高端的Kepler GPU,支持3072个CUDA核心数,显存容量虽然较少只有8GB但因为采用GDDR5相比K1的DDR3提供更高的带宽能力。
Nvidia GRID K1&K2
以两者中性能更好的K2来看,使用了2颗Kepler GK104 的GPU芯片,每个GK104的GPU内含1536个FP32 CUDA Core和64个FP64 Units (24:1)
单精度浮点数 理论峰值 = 2 GPU * 1536 FP32 Core * 2 * 745MHz = 4.58TFlops
双精度浮点数 理论峰值 = 2 GPU * 64 FP64 core * 2 * 745MHz = 0.19TFlops