欢迎光临KOTOO财情




一窝疯“人工智能芯片”前,你需要知道的几件关于 GPGPU 的事

2024-11-26 253

听说拜“人工智能”与“深度学习”之所赐,GPU 应用看起来很夯,大家抢著挖矿让显卡一片难求,搞得最近 nVidia 和 AMD 的股价涨得很凶。

喔齁。

随着 1999 年 8 月 31 日发表的 GeForce 256(NV10),nVidia 创造了“GPU”(Graphic Processing Unit)这个看起来好像非常伟大的名词,其近 20 年演进,颠覆了众人对“处理器”一词的传统认知,也衍生琳琅满目、鸡同鸭讲、让人摸不着头绪、需劳驾计算机结构大师的教科书,长篇大论厘清命案现场的“技术行销名词”,而追求绘图处理器泛用化的 GPGPU,在 nVidia 的推波助澜下,更激发了无数人对未来的期望、憧憬、与幻想,甚至是令人匪夷所思的误解、谬误,与浮夸。

部分读者可能并未经历过显示芯片市场,从百家争鸣,一路仿佛 x86 处理器的市场发展,走上 nVidia 与后来被 AMD 并购的 ATI,双雄相争的过往,特此野人献曝,寄望可递上一块让你挺立于没顶时代洪流中的踏脚石,也希望可以顺便唤回老骨头读者学生时代的珍贵回忆。

有鉴于在这资讯大爆炸的网络时代的普遍现象:毋需倡议提高国文教材的文言文比重,也不必端起出师表临卷涕泣,一篇白话文只要字数超过 500,就会经常性诱发基础阅读能力不佳的大脑 buffer overflow,只看标题引文关键字自动脑补后,就开始留言发表原作者根本不知所云完全一头雾水的高见,所以本文从头到尾一问一答,不留下任何一丝一毫“误读”的可能性,也尽量避开因 GPU 厂商行销需求,大量孳生的专有“技术行销名词”与缩写,更忌讳“用名词解释名词”,减少阅读时“卡弹”的概率。

本文章节依序如下:

  • 什么是 GPU?
  • 学理角度的 GPU是什么?
  • GPU 为何多执行绪?
  • SIMD 的三种常见型态?GPU 何以承先启后?
  • 为何 GPU 是多执行绪 SIMD?
  • GPU 双雄又是如何定义 GPU 的运算型态?
  • 什么是 GPGPU?
  • GPU 双雄的产品演进?
  • 为何要先不伤现在,再讲求未来?
  • 从 HPC 到工人智慧……人工智能。
  • 回首 20 年来时路。

近年来英明神武天下无敌的 GPU,到底是什么?

根据不学无术的笔者脑内考证,nVidia 对 GPU 一词的最初技术定义是“整合的 3D 转换(Transform)、打光(Lighting)、三角设定(Triangle Setup)/裁切(Clipping)与成像引擎(Rendering Engine),每秒能处理至少 1 千万个多边形的单芯片处理器”。

我们很清楚,这“定义”已毫无任何意义。

说穿了,这只是蓄意突显当时只有 nVidia 率先支援 DirectX 7.0 硬件 Transform & Lighting(Hardware T&L)的行销手法,刻意集中打击产品发展与公司营运已陷入困境的衰退霸权 3dfx。

笔者还依稀记得,3dfx 曾经花了很大工夫在网站首页用酷炫的 Flash 拚命宣传“Banshee 2”(Voodoo 3 的昵称,根本只是补回第二个 TMU 的 Banshee)与 VSA-100 叠叠乐的 Voodoo 4/5 系列,其 1,600×1,200 60fps 和反锯齿的实用性。

3dfx 在 2000 年破产后,即被 nVidia 并购,其末代产品“Rampage”核心设计团队,后来接手操刀由 IBM 代工制造、nVidia GPU 历史不朽名作 GeForce 6(NV40)系列,拯救了深陷 NV30 灾难的 nVidia。

总而言之,现在只要是绘图芯片,GPU 几乎等同于代名词,连过去无缘躬逢其盛的 2D 前辈,也同样鸡犬升天,被“追封”这个在今日已失去意义的空头衔,而某些仅需提供 2D 画面输出、隐身于某些特殊应用,如服务器 IPMI BMC 的绘图核心(提醒你,Matrox G200 还活得好好的喔),就不在本文的雷达搜索半径之内。

以学理的角度来看,GPU 的本质到底是什么?

GPU 本质上多样化的平行性,涵盖了指令阶层、多执行绪、SIMD(单指令多资料流)、与以多处理器环境的 MIMD(多指令多资料流),那我们该以哪个角度来理解 GPU?

直接在这里讲结论:GPU 是“由数个多执行绪架构的 SIMD 处理器(如 nVidia 的 SM / SMX / SMM,AMD 的 SIMD Engine / CU),所组成的 MIMD 多处理器环境”,硬件层级可简述如下:

GPU 的灵魂在于“被执行绪区块排程器(Thread Block Scheduler)指派给执行该程式码的多执行绪 SIMD 处理器(Multi-thread SIMD Processor),对 GPU 以巨大的暂存器档案,掩盖内存延迟”,那层看起来很像 MIMD 的外皮,完全不是重点,请对 GPU 的认知,聚焦在 SIMD 和多执行绪上。

为何 GPU 的多执行绪像纺纱机般地千丝万缕?

答案很简单:需要同时执行滔滔不绝的多执行绪隐藏内存延迟。

CPU 通常使用快取内存来减少存取主内存的次数,防止内存延迟拖慢指令管线执行效率,但 GPU 因平行处理与存取材质,绘图系统的内存往往“高带宽,高延迟”,需多执行绪“交替掩护”,隐藏内存存取延迟,如第一个执行绪等待内存存取结果时,开始执行第二个执行绪,维持执行单元满载。

不像 CPU 借由分支预测减少管线停滞,GPU 多半使用类似上述处理内存延迟的方式,减轻分支指令造成的效能损伤,但一般而言,通常 GPU 处理分支指令的效能比 CPU 来得差。

相异于泛用 CPU 的指令执行流程,绘图管线并非“一条肠子通到底”,横跨数个运算特性相异的功能阶段,要稳定执行效能,需更有效精确掌握所有功能单元的执行状态与资源分配。

简而言之,“以硬件为基础的多重执行绪管理与排程”是近代 GPU 的最重要技术核心,当同时数几百条、个别代表一个像素(Pixel)的执行绪,去绘制同一张画面,每个 SIMD 执行绪区块、等同一个 8-32 像素的处理时,光要有效同步化,避免少数执行绪拖垮整体效能,就是非常不简单的挑战,而充分将 GPU 的巨大运算潜力发挥到极限,更是举足轻重。

SIMD 三种常见形式(向量运算、SIMD 扩充指令集、GPGPU)的异同?

因单指令多资料(SIMD)可单指令启动多笔资料运算,比起每道资料运算都需要执行一道指令的多指令多资料(MIMD)享有更多潜在的能量效率。

另外,就程序员的角度,SIMD 对上 MIMD的最大优点,不外乎可以延续既有的循序性思考,却可利用资料阶层的平行化运算提升效能。在设法理解 GPU 的本质和优点前,绝不可忽略这点。

时下常见的 SIMD 有三种:

  1. 历史悠久的向量架构电脑,像 1976 年的 Cray-1 超级电脑与后代子孙,和今天依然很有名的 NEC SX 系列向量处理器(没研究过超级电脑,总得听过日本横滨那台 Earth Simulator 吧)。
  2. 近 20 年来蓬勃发展的多媒体 SIMD 指令集延伸,想必各位对 PowerPC 的 AltiVec 及 x86 指令集一路从 MMX、3D Now!、SSE、SSE2、SSE3、SSE4(别忘了还有还没开始就结束的 SSE5,但这是 AMD 打算推的)、AVX、AVX2 到 AVX-512 的演进一点不陌生。
  3. 近十年来从起步跌跌撞撞,到今日看似有模有样的 GPGPU。

这三种架构看起来很像,但本质上有太多根本性的差异,先简单解释 SIMD 最简洁美观的向量电脑,再以其为基准点,去检视这三者的异同,更能体验 GPU 微架构暗藏的“撇步”,这是厂商的行销简报不会告诉你的奥秘。

向量(Vector)运算是一种简单到有时候还真的不知道该如何好好阐述的平行计算方式。在科学计算中,有大量彼此不相关的资料进行同一种运算,正好便于单一指令,对不同的资料,执行相同的重复操作。

向量电脑撷取以不同“跨度”(Stride)散布于内存各处的资料元素,“聚集”(Gather)于大型的循序式暂存器档案,存取非循序的内存位置,并将全部元素重塑为紧密结构,在这些暂存器中进行资料运算,再将运算结构“分散”(Scatter)回内存中,像多维阵列和稀疏矩阵,就是能够充分发挥向量电脑威力的场合。

为了说明向量处理的基本概念,下面举一个循环操作范例,将阵列 B 内的 16 个元素个别加上 1,再将结果存入阵列 A:

I = 1,16

A (I) = B (I + 2) + 1

其中常数 1 和阵列 A / B 中的每个元素是“纯量”(Scalar),通常一条纯量指令只能处理一个或一对算子,处理 n 个或 n 对算子,至少就需要 n 个指令。

在一般的电脑上,就会变成这样的程式循环:

I = 1

取出B (I + 2)

计算B (I + 2) + 1

存入 A (I) = B (I + 2) + 1

I = I + 1

连续跑 15 次,直到 I=16 为止。不仅旷日费时,且可能因处理器的分支预测错误,而拖累管线效能(在这范例,理论上会发生一次)。

但导入向量运算“整排处理”,事情就简单了:

取出 B (I + 2)

计算 B (I + 2) + 1

存入 A (I) = B (I + 2) + 1

第一个指令取出阵列 B 的 16 个元素,第二个指令对阵列 B 的每个元素分别加上 1,第三个指令则将结果存入阵列 A。三个指令即可搞定,更不会制造分支负担。

由此可见,向量运算有非常明显的优点:

一、向量处理流程比传统的“纯量”(Scalar)运算,可避开修改循环控制变数与条件判断。请别忘了泛用 CPU 的世界,还有让人感到极度恶心“分支伤害”、“分支预测”与“分支预测错误的折损”。

二、因一个指令就可做到数十、数百个指令才能完成的运算,减少指令数,可节约反复从内存撷取指令并解码再执行的带宽及时间,利于打造复数执行管线架构。拜“运算方向固定”与“不同向量运算指令之间,并无控制流程相依性”之所赐,也较易于打造更深的指令执行管线。

相对于多执行绪的 GPU,向量电脑采取截然不同的方法隐藏内存延迟,借由内存与向量暂存器之间的区块传送,向量载入与储存都只付出一次性的延迟。

三、内存存取模式与行为也是固定的,不需要考虑太多特殊情况,如少量却频繁的随机存取,也降低了设计最佳化内存系统的门槛。

但俗语说的好,魔鬼藏在细节内,抽丝剥茧后,你才会看到向量电脑真正的奥妙之处,以及 GPU 以不同奇计淫巧继承而来的特色。

首先,程式同时需要长短不一、在执行期间会受到变更的向量长度,该怎么办?这时候向量长度暂存器(VLR,Vector-Length Register)就派上用场了,编译器设定 VLR 的值,就可以控制任何向量运算的长度(当然,不能超过向量暂存器的最大长度),包含载入与储存。

这更意味着向量电脑极为重大的优势:向量暂存器的长度可以在后来的产品世代继续成长,不需要变更指令集,就可持续提升计算能力,但反观受制于现有 CPU 指令集编码格式与暂存器数量限制的 SIMD 多媒体指令集,每当变更向量长度,就得大兴土木,叠床架屋个几百个指令(如你感到好奇,可自行拿起计算机算算 Intel 从 MMX 到 AVX-512 增加多少 SIMD 指令)。

GPU 则是将透过硬件机能,将巨大的向量长度,拆散到数以万计的暂存器,没有这样的困扰。

更何况,GPU 因具有 I/O 装置的特质,提供了介于编译器和硬件之间的间接性,让 PTX 变成与底层硬件脱钩的虚拟指令集(类似 Java 的 Binary Code),而非会绑死相容性的二进制机器码,日后要“动摇国本”,难度也远比 CPU 简单,像 nVidia 与 AMD 历代 GPU 微架构多年来吃饱没事基因突变,但也完全没有影响到软件堆叠,驱动程式品质就再看看了。

其次,所谓“博观而约取,厚积而薄发”,我们需要指定一道向量指令内,替向量循环中的每一个元素运算进行条件式执行,例如:先对 1 3 5 元素作加法,再让 2 4 6 元素作减法,接着再让剩下的元素作乘法,该怎么作?向量遮罩暂存器(Vector-Mask Register)就堂堂登场了,任何被执行的向量指令,只会处理向量遮罩暂存器中那些被指定为 1 的元素,而被指定为 0 的元素则不受任何影响。

乍看之下,编译器让遮罩中充满了大量的 0 是非常浪费运算效能的蠢事,但这种设计消除了传统泛用 CPU 的分支处理与控制相依性,速度反而更快。很不幸的,基于和无法“不需要变更指令集,就可以提升向量处理效能”的相同理由,SIMD 多媒体指令集多半没有这样的设计。

那需管理数以千计 Stream Processor 的 GPU 有没有向量遮罩暂存器呢?答案是:有,但是你看不见,GPU 是用内部硬件功能提供向量遮罩,遮蔽掉特定的 Stream Processor,而不像向量电脑是让软件编译器去直接操作暂存器。

最后,向量电脑一次性从散落在内存各处的算子素“聚集”至向量暂存器内,运算结束后再一次性“分散”回内存四处,内存子系统需同时处理多个内存载入与回存的能力,大量独立运行的 Memory Bank 与预先撷取机能,指令集也需提供索引(Index)式载入与储存等精巧的定址模式,增加向量编译器能够将程式码向量化的机会,尽管执行起来通常远比非索引的状况慢得多。通常向量电脑会配置专属的控制处理器(Control Processor)来辅助,如为索引式载入与储存,自动递增内存位址。

论内存子系统,Cray 在 2002 年发表 Cray X1 向量运算超级电脑所采用的 Multi-Streaming Processor(MSP)是很鲜明的案例:一个 X1 节点,由四组 MSP、16 组内存控制器与 32 片内存卡板所组成。

并不是把一堆处理器核心硬塞到单芯片内,看起来有很好的账面理论运算效能,就可称之为“单芯片超级电脑”,空有运算效能没用,内部的总线与内存子系统更需密切配合以克竟全功。至于时下 GPU 内存子系统的效能水准,除了延迟很长,相信就没有太多需要特别挑剔的地方了。

所有载入都是聚集、所有储存都是分散的 GPU,GPU 程序员需保证所有聚集中和分散中的所有位址,都是指向相邻的位置,GPU 硬件中扮演着跟向量电脑控制处理器相同角色的“执行绪区块排程器”,需在执行期间辨认出这些位址的序列,确认他们是否相邻,将聚集与分散,转变为高效率的跨度式内存存取。

泛用 CPU 的 SIMD 多媒体指令集上的聚集分散式内存存取呢?很抱歉,原先几乎没有这些宝具,是近期才慢慢的补完。以 x86 指令集为例,演进如下,效能怎样,在此不做评论:

  • 2011 年 1 月:Sandy Bridge 微架构:AVX 指令集刚问世时,没有聚集和分散指令。
  • 2011 年 6 月:Xeon Phi x100 系列(Knights Corner):其 VPU 指令集(IMCI,Intel Many Core Instructions)提供聚集和分散指令,但 Xeon Phi x100 只能作为辅助处理器,不能执行 x86 指令。
  • 2013 年 6 月:Haswell 微架构:AVX2 指令集新增聚集指令。
  • 2013 年 6 月:Xeon Phi x200 系列(Knights Landing):要直接跟 GPGPU 打对台,就得硬著头皮全上了。
    1. AVX-512F 指令集同时支援聚集与分散指令。
    2. AVX-512PF 指令集增加聚集与分散的预先撷取(Prefetch)版本。
    3. AVX-512CD 指令集增加侦测位址冲突(Address Conflict)的分散指令。

一路看下来,SIMD 三种型态摆在一起比比看,受制于现有 CPU 指令集的包袱,相较简洁优美的向量电脑和仰仗先进硬件承先启后的 GPU,带有强烈“附赠”色彩的 SIMD 多媒体指令集看起来似乎有点废废的,但也并非毫无一无可取之处,因近代多工操作系统的迫切需求,虚拟内存管理就是 CPU 最强的地方,尤其是按需求分页(Demand Paging)的功能,也是 GPU 双雄努力补强中的弱点。

如何从“多执行绪 SIMD”的角度来检视 GPU 的全貌?

为方便读者理解,这里举两个范例,以求公平,nVidia 和 AMD 都得被笔者拖上台现场表演给大家看,推广 CUDA 已久的 nVidia 戏分一定会比较多。

nVidia G80(Tesla 1.0 微架构,GeForce 8 系列)家族执行 CUDA 时,一个多执行绪 SIMD 处理器(SM,Streaming Multiprocessor),包含 8 个 Stream Processor(SP,又称为 CUDA Core),此外还包含 8,192 个暂存器、16kB 共享区域内存与共用的快取内存,如常数、材质等。每个执行绪对应一个 Stream Processor(有些文章将此翻译为“流处理器”或“串流处理器”,但笔者偏好沿用原文)。

CUDA 的执行绪有三个阶层,对应 GPU 的硬件层级,由大到小:

这里需要特别注意:从 CUDA 的程式模型角度来看,8 个 Stream Processor 组成是四个一组,实际上可看成两组 4D 的 SIMD 处理器。

为什么 4 个一组?道理也很简单,3D 影像的“颜色”和“位置”,都需要四个数值,分别是 RGB 三原色加上 Alpha 半透明通道、与 XYZ 三维座标与 W 远近参数,各需要四次运算。同理可证,这也是 AMD 近代 GPU 的底层运算单元是 4D + 1D 或 4D 的缘故,而不是像啥 5D 6D 7D 这些乍看之下还以为是 Canon 单眼型号的模样。

每个运算都最少有 4 时脉周期的延迟,起码要执行 32 个执行绪(8 SP x 4 时脉周期)才可能隐藏运算延迟,初代 CUDA 以硬件自动分组、以 32 个执行绪为单位(Warp),“塞”给一个 SM。如转换成“喂食”两个 4D SIMD 处理器的角度,就是需要两组 16 个执行绪,也就是两组“半个 Warp”(Half-Warp)。

想得简单一点,一个 Warp 代表画面的一块小方格。

所有执行绪被加以区块化,并以 32 执行绪为组群而执行。如一个 Warp 内的执行绪碰到停滞,例如等待显示内存,此时可切到另一个 Warp 的执行绪,掩盖内存延迟。一旦区块内的执行绪并非 32 的倍数,SM 的执行绪排程器会将剩下的执行绪包成一个 Warp,浪费 GPU 的计算能力,这是开发 CUDA 程式时需要特别注意的地方。

同一个 Warp 内的执行绪,将“执行相同的程式码”,但“处理不同的资料”,这时候,你就看见鬼影幢幢的 SIMD 灵魂了。

但执行绪的数量受制于暂存器总量,G80 一个 SM 总计有 8,192 个暂存器,假如一个执行绪占用 16 个暂存器,单一 SM 的执行绪上限是 512(512 执行绪 × 16 暂存器=8,192),等于 16 个 Warp,如一超过,就需要将一部分的资料搬移到 GPU 外部的显示内存,降低执行效率,在撰写 CUDA 程式时,并不能无止尽的增加执行绪的数量,而共享的资源,如区域内存和快取,也是开发程式时需深思熟虑之处。

事实上,每个 SM 可以管理的区块和执行绪都有其上限,也跟着 GPU 微架构世代而演进,例如:

  • Tesla 1.0(G80)是 8 个区块、768 执行绪(24 Warp)
  • Tesla 2.0(GT100)是 8 个区块、1,024 执行绪(32 Warp)
  • 后来的 Fermi 增加到 8 个区块、1,536 执行绪(48 Warp)
  • Maxwell 之后到 Pascal 激增到 32 个区块、2,048 执行绪(64 Warp)

对技术再不敏感的读者,在这里也可以察觉一个显而易见的残酷事实:对 GPU 底层架构不够熟悉,根本写不出像样的高效率程式,充分榨干 GPU 的运算潜能。

GPU 双雄如何定义如此诡异的运算架构?

觉得 G80 太老旧?那我们瞧瞧引领 nVidia GPU 更大幅接近主流泛用 CPU 的 Fermi 微架构(GF100,GeForce GTX 480),其 SM 组成结构如下:

  • 两组 16 个Stream Processor(CUDA Core)组成的 SIMD 运算单元,总共 32 个,当然你可以把 16 个 SP 看成 4 个 4D SIMD 处理器。
  • 16 个载入/储存单元,一个时脉周期内最多可以执行 16 个执行绪。
  • 4 个特殊功能单元,计算像平方根、倒数、sine 和 cosine 等三角函数。
  • 32768 个 32 位元宽暂存器。
  • 暂存器和内存都具备 ECC 纠错机能。
  • 64kB SRAM,可设定为“16kB L1 资料快取内存+48kB 区域共享内存”或“48kB L1 资料快取内存+16kB 区域共享内存”。
  • 所有 SM 共用 768kB L2 资料快取内存,这让 Fermi 长得更像 CPU。

观念等同于“多执行绪 SIMD 处理器”的 SM,其 Stream Processor 与暂存器数目,随着不同世代的 GPU 微架构而有所更动(如 Fermi 是 Tesla 1.0 的四倍),以 Fermi 为例,任何一个指令都最少需要两个时脉周期来完成,套用 G80 的状况,等于是需要塞一个打包后的 32 执行绪(也就是前面提到的 Warp),给 16 个 Stream Processor 组成的 SIMD 运算单元,而且要保持满载,一次要塞两个。

为改善硬件使用率,Fermi 微架构的每个 SIMD 处理器,都拥有两个执行绪排程器(也就是负责切 Warp 的苦主)与两个相对应的指令分派单元,在每两个时脉周期内,从每个执行绪派发一道指令给运算、载入储存与特殊功能单元。

这就是 SIMD 运算结构与“前仆后继”的多执行绪两者结合而来的威力,nVidia 将 CUDA 程式设计模型,命名为前所未见的“单指令多执行绪”(SIMT,Single Instruction, Multiple Thread),而 AMD 则称之为单指令多重执行样板(SIMI,Single Instruction, Multiple Instance),实际上讲的是一模一样的概念,但撰写计算机结构教科书的大师和开班授课的教授心里怎样五味杂陈,我们就不得而知了,毕竟 CPU 和 GPU 在计算机结构的家谱中,并没有共同的祖先。同场加映 AMD GPGPU 的技术基石 GCN(Graphic Core Next)。在 GCN 问世之前,AMD GPU 的 Stream Processor 是四个绑在一起的 VLIW4 结构,一道指令同时用到这四个 Stream Processor,如须发挥最高利用率,编译器需最佳化排程设法塞好塞满。但 GCN 可同时执行四个执行绪,一道指令仅用到一个 Stream Processor,如果指令都可以在一个时脉周期内完成的话,也可以用好用满。

爬文至此,相信各位看倌堆积在脸上的营业式笑容,已经转化成一阵阵抽搐的嘴角,附带着劫后余生的表情。我们现在进入主题:GPGPU 是什么。

GPGPU 是什么?

GPGPU(General Purpose computing on GPU)直接翻译为“图形处理器通用计算”,讲白话一点,就是让 GPU“不务正业”,去做和传统绘图无关的通用计算任务,特别是适用于单指令多数据流(SIMD)的高密度浮点运算。

GPGPU 并非 GPU 与生俱来的“本能”,而是随着 GPU 引进以着色器微中心的可程式化绘图管线、陆续支援标准 32 位元单精度与 64 位元倍精度浮点标准并符合 IEEE 754 规范(后来 IEEE 754-2008 再加上浮点乘积和)后,才慢慢蕴含通用运算的潜力。

整体来说,GPU 适合一次进行大量相同的运算。CPU 则较有弹性,能同时进行变化较多的工作。两者相辅相成,没有哪边可以彻底取代对方的可能。

对比“泛用”的 CPU,使用 GPU 来进行运算工作,主要有几个潜在的优势:

  • 更巨量的执行单元:以 nVidia 最高阶显卡 Titan Xp(GP102-450)为例,内含 3840 个 Stream Processor,时脉约 1.5GHz,32 位元单精确度浮点数的最高理论效能高达 12Tflops。高效能泛用 GPU 虽然有更高的时脉,但执行单元与理论运算效能却远逊于同时期的 GPU,而且 GPU 多半仍采用较主流桌上型处理器和服务器 CPU 落后的制程。不意外,CPU 的晶体管大多数都砸在控制单元和快取内存了。
  • 更巨大的内存带宽:前述的 nVidia Titan Xp 有 547.7GB/s 的理论内存带宽,而配置 HBM2 内存界面的 Tesla P100 16GB 版本是惊人的 720GB/s,Tesla V100 更是惊世骇俗的 900GB/s,反观世界上最高阶的伺服 器CPU,如 IBM Power9,装上 Memory Buffer,最多也“仅”230GB/s(没 Memory Buffer 时,8 通道 DDR4 会减半成 120GB/s),更不用提 Intel Xeon 和 AMD EPYC 这些 x86 便宜货了。
  • 和高阶 CPU 相比,价格远较低廉:例如一张 Pascal 微架构的 Titan Xp 包括 12GB GDDR5X 内存的价格,“才”1,200 美元,而 Intel Xeon 的旗舰 8180M 一颗就 13,011 美元,足足可以买 10 张还有得找,相信各位“矿工”对此特别有感。

当然,天底下没有白吃的午餐,GPU 也有它的缺憾:

  • 平行不够高,效能不会好:GPU 的运算单元数量很多,不能高度平行化的工作,所能带来的效益就不高。
  • 浮点不够准,整数不够快:碍于成本和效能,GPU 通常只支援不符合 IEEE 754 的 32 位元单精确度浮点数, 有些运算的精确度可能较低(这对重视运算输出结果的高效能运算很伤)。nVidia 是迟至 Fermi 世代的 CUDA compute compatibilty v2.0,才算完备 IEEE 754,但很多硬件加速的数学函式,其输出结果,并不保证与 CPU 一致。

此外,许多 GPU 并没有独立的整数运算单元,整数运算的效率较差,偏偏人工智能和深度学习(可视为类神经网络换个称呼)仍是以整数运算为主的应用,我们将会在后面看到 nVidia 在踏上人工智能之路前,补强整数运算的罩门。

  • 只适合一路油门踩到底:GPU 通常没有分支预测等复杂的辅助流程控制单元(就算有,也会很慢),对分支密集、大量条件判断的应用程序,如数据库,效率会比较差,而且是非常差。
  • 内存容量受限,升级不易:GPU 都会搭配高带宽(加上高延迟)的内存,如 GDDR,但如要处理更大更复杂的问题时,仍需要更多的内存容量,在增加容量时保有高带宽,并维护内存资料的可靠性,也是一大挑战。当时下 CPU 可随时扩充至 TB 等级的容量,nVidia Tesla P100 和V100 也仅杯水车薪的 16GB。

为实现高带宽,GDDR 绘图特化内存直接焊接在与 GPU 同一块板子上,毫无日后升级的弹性(早期显卡还有办法这样作,现在就没辙了),就无须浪费篇幅讨论了。

  • 内存系统仍为化外之民:因多半以独立 GPU 芯片与专属显示内存的形式存在,其外部 I/O 装置的特性,也强迫资料需要在系统主内存与显示内存之间搬来搬去。

nVidia CUDA 程式分为两个部分:Host 端和 Device 端。Host 端是指在 CPU 执行的部分,而 Device 端则是在 GPU 执行的部分,Device 端的程式又称为 kernel。通常 host 端程式将资料准备好后,复制到 GPU 的内存,再由 GPU 执行 device 端程式,完成后由 host 端程式将结果从显卡的内存中取回至系统主内存。由于 CPU 与 GPU 之间多半经由 PCI Express 沟通,降低效能在所难免。

“内存容量不足且难以升级”与“缺乏对 GPU 内存的直接存取”的缺陷,解决方案不外乎“让系统和 GPU 共享统一的实体内存,或著在逻辑上是统一的、结合于单一的内存位址空间”。

以 AMD GCN(Graphic Core Next)的 x86 虚拟内存、与 nVidia 从 Pascal 开始支援的 Unified Virtual Memory为 例,简单来讲,就是将显卡上的 GDDR5,变成 CPU 可识别并直接存取的系统内存。AMD 在 2013 年筹建 HSA(Heterogeneous Systems Architecture)基金会时发布的 hUMA(heterogeneous Uniform Memory Access),则进一步让 GPU 可以染指 CPU 那丰硕但速度差很多的系统内存容量。

  • 开发环境还不够安定:GPGPU 的程式模型的成熟化与标准化在 2012 年之后才成型,早期  NVIDIA 和 AMD / ATI 就有各自不同的程式模型(一个 CUDA,一个 Stream),是经过多年发展与折冲,才勉强有现在的成果,要迅速发展适合 GPGPU 的应用程序,仍是相当有挑战性的工作。
  • 难以一招半式闯江湖:相对“不分指令集架构,所有人只会越长越像”的 CPU,GPU 的微架构演进远比 CPU 激进,这也意味着同一套程式最佳化手段,难以放诸天下而皆准,这也间接拉高 GPGPU 普及化的困难度,因为难以一次开发在所有 GPU 都可以跑很快的应用程序,对 GPU 底层了解不够,就很难写出高效率的程式码。

nVidia 和 AMD 的 GPU 微架构大相径庭,然后光 AMD 一个世代的产品线,就可以涵盖三到四种不同时期的微架构,让人挑产品时挑到想翻白眼,而“使用 Intel 的编译器在 AMD 的 CPU 执行 SPEC CPU,也是可以跑很快,最佳化哲学都很类似”就没有这样的困扰。

万丈高楼仆街起

恭喜各位,撑到现在,总算进入最受读者欢迎的画唬烂编年史时间了。

以硬件视角为中心,GPGPU 发展史,大致有以下里程碑,关于 GPGPU API(如 OpenCL)的细节,因就笔者个人观点,整个 GPGPU 生态系统是 2015 年之后才接近成熟,在此不谈,否则就没完没了。

GPU 通用运算的酝酿期:2000 年至 2006 年。

  • 2000 年 11 月 12 日:微软发布 DirectX 8.0,可程式化绘图管线的 Vertex Shader(顶点着色器)与 Pixel Shader(像素着色器)开始吸引众人眼球,将焦点聚集在显示芯片厂商和游戏开发者将如何接招的好戏。
  • 2001 年 2 月 28 日:nVidia 发表全世界首款对应 DirectX 8、150nm 制程的 GeForce 3(NV20),也难逃多数芯片设计商的宿命:全新架构尚未成熟的产品常常举步维艰,而 GeForce 3 Ti 500 系列可改电阻升级成 Quadro 专业绘图卡的神迹,更让人啧啧称奇(感谢熟识的光华店家帮忙操刀,笔者有幸躬逢其盛此精神上的胜利)。

值得一提的是,初代 Xbox 的整合绘图芯片组 NV2A 是 NV20 的衍生物,能做成 nForce 芯片组来卖,肯定是不得了的大事,当然这件好事没有发生,Intel 绝不会让此事成真。

  • 2002 年 11 月 18 日:经过多次延宕,nVidia 发表 130nm 制程的 GeForce 5(NV30),为 CG 程式语言与 DirectX 9 的 Shader 2.0,外挂 nVidia 自行扩充的 Cine FX 着色器功能、与 32 位元浮点精确度,让 NV30 的晶体管数量激增至前代的两倍,加上尚未成熟的 GDDR2 内存,造成极为严重的高热问题,而仅仅 128 位元的内存界面宽度,更成为限制其效能表现的紧箍咒,最后惨遭“精简设计哲学”的 ATI Radeon 9700 / 9800(R300)迎头痛击。

严格说来,NV30 跟 GPGPU 毫无瓜葛,但笔者不得不在此特别拖出来游街示众品头论足一番:

  • 微软决定游戏规则的影响力:nVidia 万万没想到 DirectX 9 的 Pixel Shader 竟然开了一个“FP24”的后门,让 ATI 可以用比较低的像素浮点精确度,硬拼更高的运算效能,让 FP16 和 FP32 二选一的 nVidia 里外不是人:16 位元精度品质不太好,32 位元精度速度又太慢。
  • 游戏与通用难以两者兼备:和个人电脑的 CPU 一样,GPU 先以游戏优先的绘图市场为首要设计考量,“兼差”过头,随时可能在激烈的市场竞争中意外翻船,这也是限制 GPGPU 发展的潜在关键因素,Tesla 2.0 后的 nVidia 和 Southern Island 后的 AMD,都采取“先不伤身体,再讲求效果”的保守路线。

我们继续往下看 nVidia 和在 2006 年 7 月并购 ATI 的 AMD,在 2006 年直到 2012 年的草创时期,两边一来一往,你揍我一拳我踹你一脚你尻我一棒我捅你一刀的激烈交锋。

  • 2006 年 8 月 23 日:为高效能运算市场,以 Radeon X1800(R520)为基础再设计,AMD 第一世代“Stream Processor”首款产品 Radeon X1900 XT 系列(R580)首度支援 32 位元单浮点精确度。

DirectX 10(Direct Compute 4.x)/OpenGL 3.3:统一着色器架构与 64 位元双倍浮点精确度。

  • 2006 年 11 月 9 日:nVidia 耗费近 5 亿美元研发经费与 4 年光阴,世界首款对应 DirectX 10 统一着色器(Unified Shader)架构,支援 32 位元单浮点精确度的 GeForce 8 系列(以 G80 为首的 Tesla 1.0 微架构),初代 CUDA 的载具,堪称是 nVidia GPU 微架构史上最大的突破,也是 nVidia 正式迈入 GPGPU 的起点(笔者心目中的原点其实是 NV30,但绝对会被乡民骂翻,想想还是算了)。

nVidia 并购 AEGIA 而来的 PhysX 物理引擎,也成功移植到 CUDA,也代表 G80 之后的 nVidia GPU 均可让坐在电脑前面的人有机会“亲自体验如强烈的爆炸、具有互动反应的碎片、逼真的流水,以及栩栩如生的角色等动态”。

而扬弃过往向量化的运算方式,后来改名为 CUDA Core 的 Stream Processor(SP)将所有着色器运算通通拆成 1D 纯量,以求更好的执行单元利用效率、并以高速两倍以上时脉运行(有没有让你想到Intel Pentium 4 的两倍时脉整数运算器?),也让 Tesla 1.0 看起来更接近一般的泛用处理器。

Tesla 1.0 还有一个值得大书特书的里程碑:nVidia GPU 的总线纯 PCI Express 化,甩开 AGP 过渡期,这对 GPGPU 应用也带来潜在的助益。

关于 G80 最有趣的八卦:nVidia 保密极度彻底,发表前其他竞争对手的 NDA 产品时程表和规格比较表,完完全全认定 G80 仅为分离式着色器 G70 的演化版,连当时任职于某 IT 周刊的笔者自己都不小心上当,相信下巴差点掉下来的受害者绝不只笔者一人。

  • 2007 年 5 月 14 日:AMD 初次对应 DirectX 10 与统一着色器架构的 Radeon HD 2900(R600,初代 VLIW5 的 TeraScale 微架构)首度支援 64 位元双倍浮点精确度,但其效能仅单精确度的五分之一,而走上“超大+超热+超贵=超生”之路的 R600 家族也中断了 AMD“恐龙化”GPU、转向“两颗打一颗”的设计路线。

  • 2008 年 6 月 1 日:以 Tesla 2.0 之首 GT200 为基础、对应 DirectX 10.1 与 CUDA 1.3 的 Tesla C1000 系列成为 nVidia 首款支援 64 位元双倍浮点精确度的 GPU,但效能也仅单精确度的“十二分之一”。

着色器分频──更精确一点,是让“多执行绪 SIMD 处理器”的时脉远超过核心时脉──从 GT200 开始,比例固定为核心的两倍。

  • 2008 年 6 月 25 日:开始支援 OpenCL 1.1 的 AMD Radeon HD 4800 系列(R700)创下单芯片 32 位元单浮点精确度理论效能达 1Tflops 的里程碑,而继承 RV670、率先支援 GDDR5 内存的 RV770,因兼备效能与价格竞争力,则成为 AMD 显示芯片发展史上罕见的巨大成功。

此外,因 HD 4770 让 AMD 提早“浅尝”台积电 40nm 制程,避开了 nVidia 在 Fermi 世代因 40nm 制程阵痛期遭遇的麻烦。

DirectX 11(DirectCompute 5.0):完整的 IEEE 754-2008 标准与浮点乘积和指令(FMA)。

比一比这时期的 GPU 双雄主力,双方的微架构差异性,一目了然,nVidia 高时脉极致效益,AMD 低时脉人海战术。但假以时日,“假设”某方突然两者兼备面面俱到,市场的恐怖平衡,天平的一侧就会瞬间倒向其中一边。

  • 2009 年 9 月 23 日:AMD 的 Radeon HD 5000 系列“Evergreen”(第二代 VLIW5 TeraScale 微架构)世代在 DirectX 11 捷足先登,浮点运算规格“不得不”完全符合 IEEE 754-2008 的规范,AMD GPU 也开始支援 OpenCL 1.2。
  • 2010 年 3 月 27 日:因导入 40nm 制程不顺,nVidia 推出“Fermi 不完全体”GTX 480(GF100),除了支援 DirectX 11,浮点运算规格也完全符合 IEEE 754-2008 的规范,也可进行单倍浮点精确度的乘积和(Tesla 2.0 只能作双倍)。

从 Fermi 开始,nVidia 让 GPGPU 专用的 Tesla 产品线使用 64 位元双倍浮点精确度执行单元比例更高的高阶核心,分而治之,让一般消费型显卡和专用运算卡拖钩,以防一般消费者不需要的“外挂”伤害产品竞争力。

  • 2010 年 11 月 9 日:“Fermi 完全体”GTX 580(GF110)诞生。开始正式进入 GPGPU 世界的 nVidia GPU,从 G80 一路到 Fermi,OpenCL 都是支援到 1.1,1.2 是后面的故事。
  • 2010 年 12 月 15 日:“Northern Island”家族中 Radeon HD 6900(Cayman)系列引进 VLIW4 格式的第三代 TeraScale,将“四个简单的向量运算单元(4D)加上一个专属复杂特殊运算的单元”(T Unit),改造为“四个可处理所有工作的运算单元”(4D T Unit),改善指令排程与执行单元的利用效率,为 AMD 真正进入 GPGPU 的 GCN(Graphic Core Next)预作准备。
  • 2012 年 1 月 9 日:“Southern Island”家族采用 28nm 制程的 Radeon HD 7970(Tahiti XT)导入第一世代 GCN,AMD GPU 正式进入 GPGPU 的世界,虽然上市没多久就惨遭 nVidia 的 Kepler 微架构海扁一顿,但也开启了 AMD 第一次挖矿奇迹。

nVidia 和 AMD 的制程微缩皆“黏”在台积电 28nm 很长一段时间,直至 2016 年中旬。

从此之后,nVidia 与 AMD 就手牵手一同过着幸福美满共同瓜分市场的好日子?

才怪。

打开 GPGPU 这个潘多拉的盒子后,要兼顾现有游戏绘图市场与“前途似锦”的通用运算应用,求不伤业绩再讲求愿景,才是对 nVidia 和 AMD 最严酷的考验,两边的实力消长也就此展开序幕,直至今日 nVidia 在市场占有率甩开 AMD 的现况。

摆荡于“现在”与“未来”的翘翘板

同样立足于个人电脑市场的巨大地基,GPU 走向 GPGPU 的轨迹,极度近似 x86 CPU 征服服务器市场的历程,借由个人电脑市场的“量”获取长期稳定发展的基础与摊平研发成本的利基,也是 GPGPU 的最重要资产。

但现实生活告诉我们,“资产”和“包袱”是硬币的正反两面,一旦不小心油门踩到底冲过头,无法善尽在“本分”保持卓越的责任,就会两头皆空,从 Fermi 开始,nVidia 不惜牺牲 64 位元双倍浮点精确度的效能,也要小心翼翼地确保现有游戏市场的竞争力,谨慎地微调多执行绪 SIMD 处理器的资源分配,就是最好的例证(被迫困死在台积电 28nm 制程也是原因之一)。

进入GPGPU 世界后的 nVidia GPU 之“多执行绪 SIMD 处理器”Streaming Multiprocessor,内部运算执行单元配置,简单整理如下,特殊功能单元等细节就不谈了。

  • 2012 年 3 月 22 日:GeForce GTX 680(GK104-400),28nm 制程 Kepler 微架构的首发,堪称是 AMD 一连串恶梦的开端。nVidia 在 Kepler 世代做了几件很重要的创举:
    1. 可能是被出师不利的 Fermi 烫到了,改变过去先推出旗舰芯片再一路往下砍功能单元的产品推出节奏,新型微架构先抢滩登陆中阶市场,结果万万没想到显卡市场就此轰动上演了“中驷 KO 上驷”的欢乐脱线剧场,nVidia 原先设定的中阶不小心打爆了 AMD 的高阶产品,极可能连 nVidia 自身也始料未及,AMD 就这样莫名其妙一蹶不振。
    2. nVidia 放弃了从 Tesla 2.0 开始的着色器两倍时脉分频,将提高时脉的投资,转向激增执行单元密度,核心编号“中阶”的 GK104 的 Stream Processor 数量竟高达 GF100 的三倍,改名为 SMX 的 SIMD 多执行绪处理器,就包了 192 个 Stream Processor,整整是 Fermi 的 6 倍,暂存器也加倍至 65,536 个(吃了威而刚的 GK210,更倍增到 131,072 个暂存器)。
    3. 以后见之明来看,在 Kepler 之前,nVidia 的以高时脉纯量执行单元利用效率见长,AMD 则猛堆 VLIW 执行单元以量取胜,但 Kepler 却像冷战末期的苏联水下核能攻击潜舰一样的质量俱佳, AMD 没能马上追咬,被 nVidia 一举打垮,一点都不让人感到意外。
    4. 因应激增的执行资源,SMX 的执行绪区块排程器倍增到四倍,指令分派单元从两个变成八个。
    5. nVidia GPU“终究”也有类似 CPU 的 Turbo Boost 动态超频,虽然那个超频幅度,连主板偷偷打开超频模式都还不如(还有骨灰玩家记得陞技的 2.5% 事件吗?)
    6. 但家用版 Kepler 的 64 位元双倍浮点精确度的效能比例,却从 Fermi 的八分之一,剧降至廿四分之一,摆明想靠激增的执行单元“以量取胜”,用三倍的值执行单元去填补三分之一的降幅,但取消着色器分频的损失就得利用其他架构性的效率强化来弥补了。善男信女诚心诚意亟需高效能双倍浮点?请认命掏出白花花的钞票购买 GK110 和 GK210 的 Tesla 运算卡。
    7. PCI Express 3.0,不解释。

nVidia 这致命一击究竟何等沉重?有板卡大厂高阶主管私下赠送笔者一片 Radeon HD 7970,笔者就毫不犹豫的黑猫快递转赠给台南友人,背后的千言万语,一切尽在不言中,不想跟电费过不去。

总之,AMD 就在独立显卡市场的势力版图节节败退,一路苦战至 2016 年,偶尔靠着优异的挖矿效能,才勉强稍有起色。相信各位不会不理解,笔者在此不愿排兵布阵品头论足,这段 AMD 被 nVidia 逼到悬崖边缘、令人不忍卒睹的黑暗时期产品线。

谈到挖矿,就不得不岔题一下 AMD 第一代 GCN 曾经享有的压倒性优势:比特币基于 SHA256 的杂凑计算(Hash,从资料中建立较小的“指纹”)会用到大量的 32 位元整数回转计算,好死不死,nVidia 要三道指令才能完成,AMD 只要一个指令就可搞定,总时脉数更远低于 nVidia,结果一张 500 美元、2,048 个 Stream Processor 的 Radeon HD 7970 挖比特币的效率竟然是 999 美元、2,688 个 Stream Processor 的 GTX Titan 近两倍,连 Radeon HD 7790 这种表订功耗只有 85W、连外接电源可能都不需要的低阶便宜卡,挖比特币都还比 GeForce GTX 680 快一大截。

时日至今,AMD 仰仗 GCN,依旧在密码学应用优于 nVidia,不知是无心插柳柳橙汁,还是 AMD 研发团队内部“不能说的秘密”(开发可以暗助自己赚外快的产品,想想也满屌的)。在这里出卖台湾水电工协会的不名誉会长,抢先爆破区块链技术概观连载将会深入探讨 GPU 挖矿这个越来越火热的话题。

问题来了,那笔者干嘛不留下这张从天上掉下来差点砸死自己 Radeon HD 7970 来挖矿呢?这就是年轻时不懂事犯下的低级错误了,小朋友千万不要模仿。

  • 2014 年 3 月 22 日:GeForce GTX 750 Ti(GM107-400),止步于 28nm 制程 Maxwell 微架构,从 149 美元的中低阶市场踏出第一步,既然制程没有重大改进,nVidia“精炼”多执行绪 SIMD 处理器,胆敢号称每个 Stream Processor 的效能是 Kepler 1.35 倍、能量效率更达 2 倍,是非常值得一看的重点。
    1. 改名为 SMM,nVidia 没事改来改去,真的很烦。
    2. SMM 内的 Stream Processor 从 192 减少到 128 个,并切成四个各自拥有独立 Warp 排程器和指令分派单元的32 SP小区块,以改善利用效率。
    3. 以事后的效能表现来看,128 SP 的 Maxwell(SMM)和 192 SP 的 Kepler(SMX),其 SM 的效能是相去不远的,别说 1.35 倍,应该是 1.5 倍,能在相同世代制程、且晶体管密度与时脉相近的条件,微调出这样的成果,很不简单,但换个角度,也许是 Kepler 太过挥霍了。
    4. 可是……瑞凡……64 位元双倍精确度浮点的效率只剩下卅二分之一。更糟的是,连专用运算卡产品线也难逃一劫,Maxwell 家族成为 Tesla 中效能最低者。除了 nVidia 将 Maxwell 定位成专攻消费市场的过度时期微架构外,没有其他的可能了。
    5. 在相同的“预算”框架中,势必有所取舍,Maxwell 就牺牲了 GPGPU 应用中高效能运算的环节。
    6. nVidia 推出砍功能的 Maxwell 产品时,也曾造成严重的风波:nVidia 砍掉 GM204 三个 SMM 的 GTX 970“3.5GB 显存门”(因内部沟通出状况,nVidia 行销部门标错 ROP 和 L2 快取的规格)事件,这里不赘述,读者有兴趣可以自己去 Google 一下。

那 AMD 真的如此不堪?

从 2012 年初到 2016 年中旬,在 AMD 的 CGN 演进到第三代的过程中(基本上跟 nVidia 一样,“黏”在 28nm 制程长达四年),对 nVidia 也并非毫无还手之力,在中小型规模 GPU 芯片都有不错的表现,相信对显卡市场熟悉的读者都还依稀记得 Radeon HD 7790(Bonarie XT,GCN 第二代)那极度优异的效能功耗,以及 Radeon R9(Fiji XT)抢先采用第一代 HBM 堆叠内存,造就可以塞入 Mini-ITX 小机壳的旗舰显卡,而 GPU 硬件协助补祯的 Fluid Motion 更是播放动画影片的神器,笔者很纳闷为何 AMD 这几年来迟迟没有好好的行销、并坚定发展这么实用的神兵利器。

平心而论,就 GPGPU 的应用角度,同时拥有 CPU 与 GPU 产品的 AMD,其精心打造的 GCN 是比较有远见的设计,但整体而言,已主宰所有游戏机绘图芯片市场且长期在笔电市场较 nVidia 为优的 AMD,在高效能运算、专用绘图领域与高阶游戏绘图这些高获利应用,不敌 nVidia 是不争的残酷事实,况且 AMD“擅长”在中低价位产品反复进行换汤不换药的更名,导致一个产品系列动辄“三代团圆,四代同堂”,也对产品行销推广(以及耗费大量时间考证产品系谱的倒楣笔者)与消费者造成莫大的困扰。

AMD 在绘图芯片的占有率在 2015 年曾崩盘到 18 趴的最低点,失去的领土,当然就自动投怀送抱成 nVidia 的囊中物,直到 2016 年 14nm 制程的 GCN 第四代“北极星”(Polaris)才渐有起色(但功耗控制看来还有不少小毛病,Vega 也是),回到 35% 的水准,而近半年来因挖矿热潮,搞到众多游戏玩家有钱还买不到 AMD 显卡的闹剧,就不须浪费时间描述了。

因立志保护北极熊播被迫放弃多年 Folding@Home 转而重视影片播放品质、夜奔敌营叛逃 AMD 的笔者,唯一的愿望是:请 AMD 好好跟显卡厂商调控市场价格,不要再出现“台币美元 40 比 1”的神奇汇率(反观 nVidia 价格一直控制得很好,令人纳闷 AMD 为何做不到)。

低精度浮点整数都要两者兼备,才够资格染指人工智能与深度学习

GPU 在以浮点运算为主的高效能运算市场站稳脚步是一回事,但要抢救工人智慧于水深火热之中的人工智能与深度学习又是另一回事,模拟类神经网络不仅不需要高精度资料,16 位元半精确度(FP16)、16 位元整数(INT16)与 8 位元整数(INT8)足敷需求,更渴求高效能的整数运算能量,并兼顾节约内存消耗量。

近期 Intel Xeon Phi x200 的新版本“Knights Mill”相较于现有 Knights Landing 的规格修订,是很好的参考范例。但芯片厂商能否在驱动程式层,随即提供砍半精度给 DirectX、OpenCL 与 Vulcan 等 API 使用,那又是另外需要寻宝的目标了。

以 Pascal 微架构为起点,nVidia 让 GPU“劈腿”的程度,拓展到另一个更加神奇的全-域。

  • 2016 年 3 月 5 日:GeForce GTX 1080(GP104-400)带头的 Pascal 吹响了众多重大革新的号角,nVidia“摆脱”了纠缠 4 年的 28nm 制程,采用 16nm(2017 年的低阶产品则跃进到 14nm)制造,还附带不少崭新的功能。
    1. 连爷爷您回来啦……不对,高效能 64 位元双倍精确度复活了,Pascal 开始为其配置与 32 位元单倍精度各自独立的专属浮点运算器(但在实际实作层面,两边是否共用部分资源就不得而知了),高阶芯片(GP100)重回 Fermi 时的 1/2 比例。
    2. Pascal 的一般运算 CUDA Core 被拆成两种:
      • 32 位元/16 位元,浮点整数兼用。后期的 GP102 / GP104 / GP106 追加 8 位元整数与相呼应的内积向量指令(Vector Dot Product),开 nVidia GPU 之先河。
      • 64 位元浮点。
    3. 针对工人智慧……人工智能,支援 FP16 半精确度浮点,可以想成现有 32 位元浮点运算器和暂存器一次处理两个 16 位元。
    4. 导入 HBM2,让 GP100 的内存理论带宽一举达到 720GB/s 的历史新高。
    5. Pascal 开始支援统合 CPU GPU 内存定址空间并提供需求分页的 Unified Virtual Memory,64 位元浮点加法指令可操作全域内存中的资料,事隔多年,在统一内存定址空间的机能,nVidia 终究拥有足以对抗 AMD 的武器,但笔者印象中这是本来就该在 Maxwell 粉墨登场的主角。
    6. 连接 IBM Power8 与 GP100 的“数据高速公路”NVLink 1.0,号称有 PCI Express 3.0 的 5 到 12 倍传输效能。
    7. Streaming Multiprocessor 重新正名最早的 SM 简写,让人颇有早知如此何必当初之感,SM 内部的 Stream Processor 组织结构再大风吹,从 Maxwell 的 4 块变成 2 块。
    8. nVidia DGX-1 深度学习系统,台大资工被赠与一台。

在 nVidia 最早公布的产品时程表中,Maxwell 后面紧跟着 Volta,并没有 Pascal 的存在,不过当仔细检视真正为人工智能和深度学习量身订做的 Volta 后,就不难理解 nVidia“乱入”Pascal 的理由,这确实是如假包换的崭新 GPU 微架构,企图一次到位的风险实在太大了。

  • 2017 年 6 月 21 日:直接以 Tesla 产品线首发的 Tesla V100(GV100)是以台积电 12nm 制程打造、晶体管多达 210 亿、包含 5,120 个 Stream Processor 的巨兽,HBM2 让理论内存带宽值逼 1TB/s 大关,NVLink 2.0 则提供接近前代两倍的传输率。
  • 最重要的是,前面提到 GPU 在通用运算上的诸多缺陷,在 Volta 微架构几乎消失无踪。
    1. 独立的整数运算单元:Volta 将原本 Stream Processor 内与浮点并存的整数单元独立出来,额外配置和 32 位元单精确度浮点运算器数量相当的 64 个独立整数运算单元,让整数与浮点计算可同时进行。
    2. 换言之,Volta 用来作一般运算的 CUDA Core 有三种:
      • 32 位元 / 16 位元浮点。
      • 32 位元 / 16 位元 / 8 位元整数。
      • 64 位元浮点。
    3. 专用的深度学习浮点矩阵单元:nVidia 将适用于卷积(Convolutional )深度学习、如图片特征学习等应用的 4×4 浮点矩阵乘积和单元,命名为 Tensor Core(张量核心),每个 SM 配置 8 个。
    4. 更精细的执行绪资源分配:以往 nVidia GPU 将执行绪区块切成由 32 执行绪所组成、共用程式计数器(PC,Program Counter)的 Warp,Volta 让 32 执行绪都有自己的程式计数器,可实现更精细的 GPU 执行资源管理,不仅利于多工应用,更为未来更完善的 GPU 虚拟化造桥铺路。
    5. 首创古老 CPU 才看得到的“L0”指令快取:大概是为保证前所未见超巨大 GPU 内部执行单元更加地车水马龙,补上 L1 的 L0 指令快取,让指令流更不容易断线,让笔者不得不怀念那 L0 指令快取加上指令资料共用 L1 快取的 Cyrix 6×86(M1),对上 Intel Pentium 与 AMD 5k86 资料指令分离式 L1 的设计优劣,还让 BBS 连线硬件版爆发了几场没啥营养的笔战。
    6. Unified Virtual Memory 共享内存位址补回 NVLink 的相关功能、SM 的 L1 资料快取/区域共享内存改回共用设计、SM 内部又像 Maxwell 一样被大卸四块等,相较之下,就没那么重要了。

不局限于巨兽般的“人工智能芯片”,nVidia 的自动驾驶产品线 Drive PX,最高阶芯片 Xavier,内建了 512 个 Volta 微架构的 CUDA Core,宣称可达成 1Tflops 仅需 1W 电力的能量效率。

那 AMD 呢?本文的 AMD 成分实在够低了,再不聊聊最新的 Vega 微架构,恐怕届时读者留言又要再度“佳评如潮”,让我们把望远镜对准织女星,一窥 AMD GPU 进军人工智能应用的棋局。

AMD 并没有像 nVidia 大费周章特别为 GPGPU 和人工智能,开发 GP100 和 GV100 之类的高规特别版,现阶段只有和消费级产品共用相同芯片、取代 FirePro S 品牌的 Radeon Instinct 运算卡,但这并非表示 AMD 面向人工智能世代的 GPU 就毫无看头,实装第五世代 GCN 的“Vega”(织女星)微架构,仍有值得重视的亮点,即使这些对一般消费者不必要的功能技术,AMD 会让身为显卡的“正职”承受额外的风险与代价。

  • 2017 年 8 月 14 日:“简报王”早在 2016 年底发布 Radeon Instinct 运算卡,早已将技术细节全数自爆完毕的 Vega,终于不再只是简报上技术行销名词的集合体。排除一般个人电脑玩家无缘一亲芳泽的 nVidia GP100 与 GV100,由 Global Foundry 14nm 制程制造、125 亿晶体管、4096 ALU(相当于 nVidia 的 SP)的织女星,是当下规模最巨大、通用运算与消费娱乐兼具的 GPU。
    1. Vega 的单一 CU(Compute Unit,相等于 nVidia 的 SM)由 64 个 ALU 组成,一个时脉周期处理 128 个 32 位元运算(64 个 32 位元浮点乘积和)。
      • 深度学习需较低精度的浮点与整数运算,Vega 可进行包裹式(Packed)计算,不仅FP16,亦含 INT16 与 INT8,因此每个时脉周期单一 CU 可作到:
        1. 128 个 32 位元(整数/单精度浮点)。
        2. 256 个16 位元(整数/半精度浮点)。
        3. 512 个 8 位元(整数)。
        4. 64 位元双倍精度浮点,仍维持单精度 1/16 比例,可想成 8 个 64 位元。
        5. nVidia 并未在消费性产品下放高性能 16 位元运算,AMD 在此独领风骚,但愿不要哪天挖矿会用到,要不然游戏玩家又要有钱买不到显卡了。
      • 锁定 FP16 与 INT8 的应用,GCN5 新增约 40 个新指令,也为影像匹配此类深度学习应用,提供 SAD(Sum of Absolute Differences,绝对误差和算法)指令,充分发挥单一 CU 每个时脉可进行 512 个 8 位元整数的特性。
      • 请努力回想一下多执行绪掩护延迟这个 GPU 极度重要的特色,思考 AMD 是怎么做的。CU 内的 64 个 ALU,拆成 4 组 16 个,因运算延迟最短 4 个时脉周期,一次处理 64 执行绪的 Wavefront,等同 nVidia 的 Warp,也是屏幕上的一块小方格。
    2. 重新设计后的内存控制器(HBCC,High Bandwidth Cache Controller)不仅支援容量更大速度更快的 HBM2 主内存,更提供高达 512TB 的定址能力,很明显的,这绝对不是仅用来应付区区十来 GB 的 HBM2。
      • 为何会将主内存控制器命名为跟快取内存有关?因为 HBCC 可存取 SSD、网络储存等外部内存元件,将 HBM2 视为超高带宽的快取内存,对于开发人员,这些也是等同于显示内存、可直接使用的空间。
      • AMD 去年在专业绘图盛事 Siggraph 发表内建 1TB NAND 闪存的 Radeon Pro SSG,就是基于 Vega 的专业绘图显卡,也展示了不受显示内存容量限制(16GB HBM2)、资料规模 TB 层级的专业绘图渲染场景。
      • 还记得前面有提及 GPGPU 会面临内存容量不足的限制吗?AMD 让显卡摇身一变成一台拥有多层次储存空间的小电脑,的确是比与 CPU 共用虚拟定址空间更简洁明了的作法,让 Vega 更蕴含处理海量资料的本钱,与更弹性的 GPGPU 部署架构,更让人好奇未来结合 Zen 微架构 CPU 的 APU 那引发无限遐想的可能性。
    3. 以上就是以单一芯片同时满足消费与专业市场的前提,AMD 对人工智能和深度学习打出来的牌局,但这也是两面刃:如同笔者一再不厌其烦的暗示,Vega 目前差强人意的功耗表现,“受惠”于诸多凡人无感的“外挂”,这也是 AMD 需一关接着一关克服的瓶颈。

看在 AMD 手上拥有竞争力重返高峰 CPU 的份上,也许全新世代的 Fusion APU 才是专属于满手好牌的 AMD,唯一的最佳解答。

回首 20 年消费级 3D 显示芯片来时路

这篇文章的初衷,最早是数年前,笔者准备动笔于某本已收摊的硬派电脑月刊的达人之路专栏,历经一周煎熬,现在可以不遗留一丝一毫的遗憾。

消费性 3D 绘图应用在个人电脑市场的发展,也只不过是近 20 年内发生的过往,从昔日的百家争鸣,目睹众多曾经独霸一方的绘图芯片厂商,像 2D 时代象征 ET4000 的曾氏实验室,视窗加速先驱的 868 、那美丽如蓝宝石 IBM RAMDAC 的 968 、笔者人生第一张显卡的心脏 Trio64V+ 的 S3,游戏 3D 曙光期王者 Voodoo 传奇的 3dfx,低价 3D 专业绘图标竿 Permedia 的 3D Labs,以及旧时代贵族 Number Nine 等更多族繁不及备载的名厂,一间一间消逝于计算机工业的历史洪流,令人感慨万千。

20 世纪末期,看到 Intel 端出系出研发 F-22 和 F35 的 Lockheed Martin 的 i740(Auburn),不少电脑玩家还杞人忧天整个游戏 3D 绘图市场,最终会被 Intel 整碗捧去,所幸恶梦最后没有成真。

反倒是 Parhelia 突围失败的 Matrox 现在还活得好好,笔者曾拥有过第一代 Millennium 和用来搭配 Voodoo 2 的 Mystique,在屏幕只有类比讯号输入的年代,那眼见为凭高下立判的清晰讯号输出,依旧让人回味无穷。再回忆著当年周末没事只能闲逛光华商圈的过去,ATI Rage 128 播放 VCD 时,那震撼人心的超高品质和艳丽色彩,记忆犹新,历历在目,“ATI 适合看影片”的招牌,至今仍被 AMD 的后代 GPU 们,有点完美又不完美的继承著。

当年还是外文系文组白烂大学生的笔者,形单影只伫立于现在八德路顺发所在地 B1 现代生活广场,某代理 Diamond 产品的店家前,隔着厚厚的玻璃墙,傻傻的凝视着搭载 nVidia 初代芯片 NV1、接上 SEGA Saturn 主机手把 Diamond Edge 3D,反复跑着盘古开天世界遗产上古神兽的飞龙骑士,根本没有料想十余年后,这些古老 3D 显示芯片的后代,高举 GPU 旗帜,拓荒于通用运算疆域的未来。

让我们期待下一个 20 年,多执行绪 SIMD 灵魂的 GPU,会让我们翻阅多少页赏心悦目的全新篇章,或著还是计算机工业又像银河的历史,再被撕掉一页。这样总结,对我的人生妥当吗?

(首图来源:shutterstock)

2019-03-23 07:30:00

标签:   资讯头条 kotoo科技资讯 kotoo科技 kotoo科技资讯头条 科技资讯头条 KOTOO商业产经 新闻网 科技新闻网 科技新闻 Kotoo科技新闻网 Kotoo Kotoo科技新闻网 科技新闻 科技新闻网 新闻网 KOTOO商业产经 科技资讯头条 kotoo科技资讯头条 kotoo科技 kotoo科技资讯 Kotoo Kotoo科技新闻网 科技新闻 科技新闻网 KOTOO商业产经 科技资讯头条 kotoo科技资讯头条 kotoo科技 kotoo科技资讯 资讯头条
0