一窝疯「人工智慧晶片」前,你需要知道的几件关于 GPGPU 的事

2020-06-14

一窝疯「人工智慧晶片」前,你需要知道的几件关于 GPGPU 的事

听说拜「人工智慧」与「深度学习」之所赐,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,到底是什幺?

根据不学无术的笔者脑内考证,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 多处理器环境」,硬体层级可简述如下:

一窝疯「人工智慧晶片」前,你需要知道的几件关于 GPGPU 的事

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 有三种:

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

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

一窝疯「人工智慧晶片」前,你需要知道的几件关于 GPGPU 的事

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

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

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

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

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

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

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

第一个指令取出阵列 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 指令集为例,演进如下,效能怎样,在此不做评论:

一路看下来,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 的硬体层级,由大到小:

一窝疯「人工智慧晶片」前,你需要知道的几件关于 GPGPU 的事

这里需要特别注意:从 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 微架构世代而演进,例如:

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

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

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

一窝疯「人工智慧晶片」前,你需要知道的几件关于 GPGPU 的事

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

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

一窝疯「人工智慧晶片」前,你需要知道的几件关于 GPGPU 的事

这就是 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 来进行运算工作,主要有几个潜在的优势:

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

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

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

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 那丰硕但速度差很多的系统记忆体容量。

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

万丈高楼仆街起

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

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

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

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

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

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

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

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 週刊的笔者自己都不小心上当,相信下巴差点掉下来的受害者绝不只笔者一人。

一窝疯「人工智慧晶片」前,你需要知道的几件关于 GPGPU 的事

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

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

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

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

一窝疯「人工智慧晶片」前,你需要知道的几件关于 GPGPU 的事

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

一窝疯「人工智慧晶片」前,你需要知道的几件关于 GPGPU 的事

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,内部运算执行单元配置,简单整理如下,特殊功能单元等细节就不谈了。

一窝疯「人工智慧晶片」前,你需要知道的几件关于 GPGPU 的事

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 来挖矿呢?这就是年轻时不懂事犯下的低级错误了,小朋友千万不要模仿。

那 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「劈腿」的程度,拓展到另一个更加神奇的全新疆域。

针对工人智慧……人工智慧,支援 FP16 半精确度浮点,可以想成现有 32 位元浮点运算器和暂存器一次处理两个 16 位元。导入 HBM2,让 GP100 的记忆体理论频宽一举达到 720GB/s 的历史新高。Pascal 开始支援统合 CPU GPU 记忆体定址空间并提供需求分页的 Unified Virtual Memory,64 位元浮点加法指令可操作全域记忆体中的资料,事隔多年,在统一记忆体定址空间的机能,nVidia 终究拥有足以对抗 AMD 的武器,但笔者印象中这是本来就该在 Maxwell 粉墨登场的主角。连接 IBM Power8 与 GP100 的「数据高速公路」NVLink 1.0,号称有 PCI Express 3.0 的 5 到 12 倍传输效能。Streaming Multiprocessor 重新正名最早的 SM 简写,让人颇有早知如此何必当初之感,SM 内部的 Stream Processor 组织结构再大风吹,从 Maxwell 的 4 块变成 2 块。nVidia DGX-1 深度学习系统,台大资工被赠与一台。

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

专用的深度学习浮点矩阵单元:nVidia 将适用于卷积(Convolutional )深度学习、如图片特徵学习等应用的 4×4 浮点矩阵乘积和单元,命名为 Tensor Core(张量核心),每个 SM 配置 8 个。更精细的执行绪资源分配:以往 nVidia GPU 将执行绪区块切成由 32 执行绪所组成、共用程式计数器(PC,Program Counter)的 Warp,Volta 让 32 执行绪都有自己的程式计数器,可实现更精细的 GPU 执行资源管理,不仅利于多工应用,更为未来更完善的 GPU 虚拟化造桥铺路。首创古老 CPU 才看得到的「L0」指令快取:大概是为保证前所未见超巨大 GPU 内部执行单元更加地车水马龙,补上 L1 的 L0 指令快取,让指令流更不容易断线,让笔者不得不怀念那 L0 指令快取加上指令资料共用 L1 快取的 Cyrix 6×86(M1),对上 Intel Pentium 与 AMD 5k86 资料指令分离式 L1 的设计优劣,还让 BBS 连线硬体版爆发了几场没啥营养的笔战。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 会让身为显示卡的「正职」承受额外的风险与代价。

重新设计后的记忆体控制器(HBCC,High Bandwidth Cache Controller)不仅支援容量更大速度更快的 HBM2 主记忆体,更提供高达 512TB 的定址能力,很明显的,这绝对不是仅用来应付区区十来 GB 的 HBM2。以上就是以单一晶片同时满足消费与专业市场的前提,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,会让我们翻阅多少页赏心悦目的全新篇章,或着还是计算机工业又像银河的历史,再被撕掉一页。这样总结,对我的人生妥当吗?

上一篇:
下一篇: