如果最近关心微博或者朋友圈的话, 你会发现, 谷歌的TPU的宣传铺天盖地.

谷歌发布的关于TPU的论文里,性能数据是这样的: 

(1)TPU比GPU性能高15到30倍; (2)TPU比GPU在同样的性能上, 取得了30倍到80倍的功耗优势. 

顿时不少原本要买GPU服务器或者GPU工作站的小主们开始心里打小鼓了: 难道要不买GPU了, 改买TPU吗? 呵呵, 姐和你说, 谷歌不卖, 小主们买不到.

这些宣传来自各种媒体. 让人感觉GPU计算已经穷途末路, TPU即将占领深度学习行业. 看谷歌的公开资料, TPU在计算8位整数乘法和累加上, 能达到惊人的92Tops的峰值性能.  而很多手头的卡, 单精度之类的也不过几个T, 顶多10多个T . 对比的确很明显. 但事情真的如此么?

呵呵, 无需惊慌. 更不用考虑改行. 姐领你看一下GTX1080 GPU, 采用帕斯卡6.1的真正力量.

最新强力运算提升之8-bit整数乘法+累加支持.

最新6.1的GPU中, 加入了超级高速的8位整数支持, 看图:

A和B分别是32-bit的, 含有4个8位整数分量(x,y,z,w), 现在A,B的4个分量各自点乘(x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1), 然后还能免费再累加上一个32位整数C. 也就是这8次乘法和加法操作, 可以在一起被打包完成.  而且这么一堆运算, 也是单周期就可以完成的(从每线程, 吞吐率的角度说).

也只和一个单精度的float乘加操作的代价一样快. 大家都知道, 一张卡上最快的操作就是float运算了, 折算到这个打包计算上, 等效比float还要提升400%的速度! 以前4张同样性能的上一代卡(例如Maxwell甚至Kepler), 现在只需要一张卡了.

如何使用此特性? 如下:

char4 A, B;

int C, D;

D = __dp4a(A,B,C);

这这样简单的一句即可使用它. 编译器将实际的生成单条指令. (注意需要8.0正式版, 部分8.0测试版和RC还不能支持它).

这等于亲之前手工的D = A.x * B.x + A.y * B.y + A.z * B.z + A.w * B.w + C;这么一堆的乘法和加法, 是等价的. 但至少会快400%, 甚至更多. 注意上述各操作数均可以支持有符号或者无符号版本的.

此特性给GTX1080带来了什么?

性能数据: GTX1080, float: 8.87 Tflops, int8: 35.5 Tops

性能数据: GTX1080 Ti, float: 11.3 Tflops, int8: 45.2 Tops  ←两张即可顶上TPU的92Tops

所以你看, 所谓TPU的15到30倍的说法, 只是谣传, 这只有2倍的. 这就是TPU的秘诀, 如今引入了1080(Ti) 了. 而且刚才你已经学会了如何使用它. 直接可以在你的现有CUDA知识上如虎添翼---只不过用了5分钟的学习时间.

而且你知道, TPU是专用芯片, 而GPU是用来做通用计算的. 它不仅仅可以计算int8, 还能计算float, 16或者32位整数, double, 逻辑运算等等. 而买GTX1080, 这额外的4倍8-bit整数的计算性能, 是免费赠送的.很多人买他回来, 依然是用来做float或者其他方面的通用计算的. 在这些方面它依然优秀. 但即使如此. 免费赠送的额外性能, 两张卡就可以秒杀掉一张TPU了. 不需要特别的学习哦.

更多的用途:

8位整数不仅仅可以用于深度学习, 卷积, 向量点乘,以及其他8位数据的处理, 往往在图像处理等多个场合具有用途. 这些运算, 往往还需要其他数据类型的计算来配合, 以及, 一定的逻辑控制能力, GPU却可以轻松各种计算配合, 同时发挥出各个类型的数据运算的性能.  这些, 均不是只擅长TPU所能对付的. 这也是为何我们也将GPU叫做GPGPU(General Purpose GPU, 通用GPU)的原因.

哪怕有一天你决定更换为其他用途, 卡依然还在. 没有浪费. 你的知识也没有浪费. 这些均是比专用ASIC芯片的优势.

姐想到了我们的一个客户, 在使用计算能力5.3的TX1设备, 进行鱼眼摄像头视野, 到长方形视野的变换, 里面有大量的原本是8-bit的数据计算的. 但是很遗憾他说, 他只能转换为32位整数, 因为__dp4a还不能在maxwell设备上使用.  profiler报告他的kernel已经100%使用计算单元了, 试想. 如果TX1能支持8-bit整数的400%加速能力, 该客户可以立刻节省4倍的计算时间, 或者同样的一次变换, 节省掉75%的能源使用. 这对嵌入式的场合也许很重要---也许节省的这75%能源, 可以再让你的无人机飞行个1千米, 或者可以识别出更多的猫脸.

关于性能功耗对比

本宫其实总认为, GPU也是ASIC的一种, 只不过含有丰富的指令控制功能. TPU无非是控制逻辑简单的处理器而已. 现在的帕斯卡是16nm的制程, 不妨看下TPU这种28nm的老制程, 真能达到30到80倍的功耗优势么? 废话少说,  本宫构造了一个几乎全部由dp4a指令构成的小kernel (即硬件指令的idp.4a).

 跑起来大致是这个样子的(上图), 至于很少的访存操作(几个百分点)请无视它. 可以看出, 计算单元已经压到了100%了. 并对SM里的4组SP, 取得了如右图的4.018的IPC(每秒指令数/SM, 按warp计), 的确是压的满满的了, 但是nvidia-smi或者profiler报告的功耗其实很惊人的小: 

(1)默频全功率的1080, 执行858993459200000次计算, 用时为22.636秒(如图), 

(图: nvidia-smi报告的功率消耗) 

(图: profiler报告的瞬时功率消耗)

 

实际上在测试期间, GTX1080已经远远的自动Boost超过了基本频率, 得到了平均约1853Mhz的高频率, 和1.050v的核心电压. (注意GTX1080为1607Mhz默认基本频率,  1734Mhz默认Boost).

我们知道, GPU在执行高耗能操作的时候, 例如double的FMA运算, 往往会消耗非常多的功率.同时此时一些GPU在这种高负载计算下, 连默认频率都维持不了, 会导致自动降频以满足功率预算/散热等的需要. GTX1080在进行8-bit整数点乘累加的时候, 却boost了超过常规频率约200多Mhz, 也从另外一个方面证明了在计算8位整数的时候, 是很清凉节能的.

还是让数据直接说话吧. 37.9 TOPS / 114W = 332 GOPS / W ! 我们只用1W的功率, 就能支撑起来高达300 GOPS +的8位整数计算. 不由让人惊叹.

考虑到TPU不过92 TOPS / 75W = 1226 GOPS / W. 此时GTX1080也不过只功耗上差了4倍而已. 绝对没有30到80倍的标称差距的.

这就是全部吗? 考虑到稍微降低点电压和频率(动态功耗同频率成正比, 同电压的平方成正比), 我们动点手脚(这也是NV在GTC之类的演示性能功耗比时常用的手脚):

(2)甚至可以性能功率比表现更好:

我们用nvidia-smi将功耗限定在90W(如上图) (CUDA用户或者不方便调用外部nvidia-smi程序的同学们可以使用nvml库). 这样最高可能频率会降低一点点, 而电压也会降低一点点. 此时整体功耗上可能会表现更好. 本宫和同学们具体看下:

依然是GTX1080, 执行858993459200000次计算, 用时从22.636秒延长到24.134s(入下图):

在整个计算期间,  nvidia-smi和profiler分别报告功率消耗为:

WOW! 看上去功率降低了不少. 而时间只增加了一点. 我们计算下:

858993459200000次计算/ 24.134s = 35.6 TOPS!

35.6 TOPS / 90W = 395 GOPS /W !

差一点点就1W功率能每秒计算上400G次8-bit整数运算了! 此时和TPU的1226 GOPS /W, 只相差了3倍多一点点.

(实际上在这个过程中, 即使只给GTX1080仅90W的功率预算, 它依然可以Boost到1770Mhz的频率, 并电压只有0.943V, 这里就不详说了)

所以你看, 无论峰值计算性能, 还是单位功率性能, 均只有2倍~4倍的差距而已. 但是别忘记了GPU还可以是干别的(各行各业).. 甚至哪怕这张GTX1080你下班后用来打游戏.

*(注意, 这不是一个严谨的测试. 实际功耗和参与计算的数值本身有关, 8-bit整数中0和1的位的安排位置数量不同, 会导致功耗的些许变化. 本文数据仅供参考)

关于帕斯卡6.1的面纱

实际上lady我在日常的使用和测试中, 发现所谓的Pascal 6.1, 可以看成是16nm升级版的Maxwell而已. 但是增加了额外赠送的int8能力. 以及, 类似double原子操作, 等等一些小改动. 甚至你看CUDA C编程指南手册, 会发现里面很多对于pascal的地方只是说, 本处同maxwell, 然后无内容. 但是这些小改动, 等于在maxwell的基础上, 免费赠送给了大家(想想谷歌免费送你一块TPU). 同时功耗上大幅度降低了.

想想一台8卡的机器, 满载功耗可能1-2KW. 如果是公司使用, 可能商用电很多地区在1元左右, 满载一天就是24元~48元. 一年下来就是小一万到两万电费, 很可能同样的任务,  在Pascal上能节省甚至有50%的功耗, 此时一年过去, 可能就节省了大约一万人民币. 因此虽然是升级版的Maxwell, 虽然你可以完全不要它赠送你的400%的堪比TPU的额外性能, 你依然需要考虑它能节省的后期使用成本.

说到这里, Lady我不禁想起, 当前风靡一时的挖矿大军. 在2012年左右, 挖矿风行一时, 有种叫比特币的东西, 虽然lady是女生, 但依然知道这是依靠计算一种叫SHA256的算法来生成利润的. 但是当年很遗憾, 铺天盖地都是A卡. N卡性能直接成渣.  因为当年A卡的整数真心太优秀了.

那么这些年来, 历代N卡, 对整数依然是完全无视么?

类FPGA的3输入查找表指令, N卡默默提升的400%整数逻辑运算

这些年来, NV直面AMD的整数挑战, 进行了历代N卡的强力整数升级, 但是很遗憾, 依然很多人停留在老印象, 像是我们一些的进行密码破解的用户, 还是张口闭口要A卡, 其实不知, N卡已经极度进化了整数运算了, 现在这些行业将重新变成N卡的领域.

实际上如刚才所说, 6.1的pascal其实只是升级版的maxwell. 而正是从Maxwell起, NV引入了专用的超强按位逻辑处理能力, Pascal依然拥有它, 而且是更高性能, 更低功耗的它. 这就是长期被人无视的LOP3.LUT指令.  这神奇的东西就如同FPGA一样, 可以对任意3个32-bit整数输入, 得到任意32-bit输出(所有排列组合情况均可实现). 废话不说, 看此段代码:

int A,B,C, D;

D = (A & B) ^ (A & C) ^ (B & C);

在Kepler卡上(例如: K80), 编译器会生成4步操作(两个&和2个^, 一个&被节省掉了). 

但在Maxwell/Pascal上, 只有一条指令(大致意思, 本次不是专业的讨论): D = 查表(A,B,C,表内容);

该指令和float指令一样, 是单周期的(按吞吐率算). 这样, 原本某需要4次才能完成的整数计算, 现在一次性就能完成了. 此特定32-bit整数运算, 瞬间性能翻4倍!

而对于普通的D = A | B | C; 这种, 也可以连续进行或运算, 当然, 提速是200%. 也依然可观的.

而这里的查找表, 和某些FPGA的LUT非常类似, 甚至这里的表内容(一个8-bit整数), 也和某些处理器内容一样(例如AVX-512的新的三元逻辑运算指令).

这样, 如同当年比特币的sha256经历了从A卡到FPGA到专用ASIC的演变, 已经不再需要GPU了. 但是N卡现在提供的类FPGA操作, 可以快速的大量压缩很多计算. 依然在各个科学计算领域, 和密码查找之类的场合重新发挥作用(请需要计算各种哈希, 各种彩虹表压缩之类的用户火速联系本宫购卡).

也就是从这一代起, NV真正的补全了作为通用的GPGPU的能力.

关于N卡从数学专用的浮点计算, 到补全整数运算, 追赶AMD, 并开始超越它的恩恩怨怨和风情.

下次lady将给出适合专业用户看的文章:

<直击AMD! N卡历代记 之 整数之王的诞生>.

此文章lady我将塑造用户对N卡整数计算的信心, 并直接讲解现代N卡的优势, 和对用户的有益之处, 扭转用户对N卡整数不行的偏见, 将整数用户们, 带回到N卡上来.

敬请期待(To be continued).