myAltera帐号登录

忘记您的用户名或者密码?

还没有帐号?

Hot Chips 宣告异构时代到来

每年一度在硅谷举办的 Hot Chips 大会就像一个窗口,CPU 巨头们和新兴企业通过它向世人展示企业对芯片架构的最新想法。今年也不例外,架构师们都卯足了劲冲破体积和工作负荷需求的极限,也都不约而同将重点放在今年的流行趋势——深度学习上。总结起来,这场大会的主题几乎可以解读为如何通过硬件加速器(图 1)提高异构计算能力。

1.加速往往来源于多种设备的协同工作

当然,大会的重点仍然放在重头戏——服务器级 CPU 上。AMD、IBM 和英特尔今年都推出了自己的新产品。有意思的是,AMD 的 Epyc 和英特尔® 至强® 可扩展处理器正是基于去年在大会上推出的 Zen 和 Skylake 架构。

从表面上看,这两款核心非常相似。二者都提供四条整数和两条浮点管线,以及地址计算和存储单元。二者都可从指令缓存加载足够宽的字,因此每个循环可容纳多条较短的 X86 指令。芯片核心将这些长度不等的复杂指令进行微运算,对其进行标记以记录数据相关性然后存入大型缓冲区。乱序指令分派单元,然后选择已准备好执行命令的微运算,并将其送入可用于执行的管线中。

以上全部过程和硬件的重点在于,从单线代码中提取最后一点指令级并行。如今我们跨入了新的处理器时代,晶体管速度更快,但互联技术限制了它带来的效果,导致块级最大时钟频率趋于平稳上限。不过,每个新节点的出现确实带来了晶体管密度的巨大飞跃。因此,处理器核心设计师们能够通过电路板上的大量晶体管来提升每个时钟区域内的有效指令数。以 AMD 为例,其声称相比于上一代产品,新的 Zen 核心在某些代码上提供的 IPC 比以前增加 50%。

但这并不仅仅是增加管线数量以及扩大分配单元的宽度。架构师们还必须尽量避免延迟,否则一切毫无意义。如果想要更详细的分支预测,就需要更多的晶体管、旁通管线、预测性预取以及其他精巧的设备来防止管线资源耗尽。这就意味着需要更多更复杂的缓存层级来尽可能缩短时钟周期的丢失数量,否则 CPU 核心就必须等待内存的反应。

以上所述从去年的 Zen 和 Skylake 描述文件中皆可找到。今年的说明文件重拾这一畅想。架构师们已成功将核心集成于 dice 上,而 dice 又集成于基片上,这么做的目的在于为系统提供充足的总线、缓存和内存带宽,以保证大批量核心同时运行。

关于服务器接口

AMD 的 Epyc 拥有四个 dice,每个 dice 在有机基片上配备两个四核 CPU 集群。每个核心拥有一个独立 L2,每个集群共享一个 L3。每个芯片配备一对 8×72 位 DRAM 通道,基片中的 dice 通过点对点交换结构互相连通。

相比之下,英特尔® 至强® 可扩展处理器则是一个芯片,采用开关箱互连 mesh(图 2),具备 28 个 Skylake 核心和六个 DRAM 通道。每个核心拥有一个 L2 及一个共享 L3。二者的设计都将大量芯片用于提高缓存和 DRAM 之间的缓存命中率及带宽。并且,随着高速连接的兴起,包括 AMD 的 SERDES 连接技术和英特尔超级通道互联技术,晶体管的作用更倾向于提供接口之间的带宽。

2.英特尔至强可扩展 CPU 服务器基于一群 Skylake 核心构建

那么,为什么将晶体管放在更多核心而不是更大的核心上呢?主要原因是后者的收益越来越少。据估计,在实际情况中,大多数代码中的指令级并行数稍微大于三个,即便是在强大的编译器优化条件下,六核或八核也完全可以应付。一旦时钟转的足够快,每个时钟周期发出的指令足够多,就必须从其他地方获取并行线程。

而云端数据中心的并行线程随手可得。当任务多而复杂,尤其多数还是多线程任务,而本地内存宽裕,即可以让多数核心执行相互独立的线程。

接下来要考虑的问题就是关于拥有多个独立线程的单个应用。比如说,是否可以将数据拆分为块,并为每个数据块启动一条线程以进行“map-reduce”搜索或计算?没错,提供更多核心当然可以加速这类多线程应用,但这样可能导致内存带宽不足。多数情况下,将这些线程映射到独立处理器核心上并不是最佳选择。

多核处理器仍占有一席之地

我们之前已经看到,服务器芯片架构师已经取得了长足进步,每个接口都拥有足够的 DRAM 带宽并有能力支持全部核心的运行。但是,假设我们将目光集中到线程丰富、计算量大,需要利用 28 颗甚至 32 颗核心,带宽却只有一个接口大小的工作负荷上时,就会意外的得到一个折中方案。如果我们先简化再缩减这些单个核心,那么每个核心的单线程性能会被削弱,然而每个接口能容纳的核心数却可大大增加。在计算密集型核心上,如果内循环能够适应缩小的 L1 指令缓存,即可取得巨大的净收益。这就是英特尔 Knights Mill 众核芯片及其他类似产品的原理。

Knights Mill 采用英特尔至强可兼容处理器核心,被简化成 2-issue 引擎但仍保留乱序执行能力。为了利于机器学习,它添加了一些特别功能,删除了芯片上的 L3 缓存,以多芯片模块上的 16 GB 高速 DRAM 代之。有了这些改变,架构师就能够在主芯片上将 72 颗核心及 L1 和 L2 缓存及矢量处理单元集成在一起。

Knights Mill 介于服务器 CPU 和硬件加速器之间。它能够执行标准英特尔至强处理器运行的软件和负荷。经过优化后,它还能够加速运行尤其适用众核处理器的数字密集型负荷。因此,它的发展方向是需要重新写入某些代码,而且必须和 CPU 协同运行的纯粹加速器。

来自百度的一份文件显示,他们已经将这一步朝专业性更推进了一步。百度并没有精简 X86 架构核心,而是另创了一种微小的核心。这种核心小到可以在 FPGA 上放置上千颗核心。尺寸小到如此地步必然不是为了执行普通任务,因此百度给这些核心设置了小型的特定领域指令集。这在 FPGA 中非常具有吸引力,但在 ASIC 中则不适合。百度在文件中承认,这一设计仍有很大提升空间,但它同样表示,在 FPGA 中采用这种 256 核架构后,一些任务的处理效率相比单个八核至强芯片提升了 64 倍之多。

关于这一主题的另一个故事来自一个芯片设计师团队,这些设计师来自:康奈尔大学、加州大学洛杉矶分校、加州大学圣地亚哥分校和密歇根大学。该团队通过开源 RISC-V 核心的两种变体设计了一种处理器层级:一种由 5 个高端 RISC-V Rocket  核心组成的层级,一种 496 颗小型 RISC-V Vanilla-5 核心组成的加速器,再加上一层专门的神经网络加速硬件。

探索数据并行

如果通过在同一指令序列的多个副本中将数据拆分而获得了多个线程,那么可以设法消除冗余电路并释放更多芯片和性能,从而执行更多任务。举例来说,如果知道所有的核心要执行相同的指令序列,但没这个必要,那么,可以让一个单独的指令缓存、解码单元和重排序缓冲区,以及每个执行单元保留自己的分配缓冲区和指令计数器,这种方法也被称为单线程多数据结构。它在高级图形处理单元 (GPU) 中有所应用,Hot Chips 大会的文件中曾介绍过其中两种。

但是,如果能确定每个执行单元只会执行完全相同的指令序列,则可以更进一步,让所有的执行单元共用一个提取单元、解码单元和分配管线,即单指令多数据结构,也称 SIMD。最熟悉的 SIMD 结构是传统图形处理器着色引擎数组,即便在如今的高级图形处理器内部运算中也能看到它的身影。拥有大量小型浮点处理器的 GPU 和专业化图形处理硬件通常组成 SIMD 集群组。这些小型处理器最初用于在 3D 图形渲染中为多边形运行着色算法,但由于其通用性,后来也广泛用于计算密集型代码的处理。相应的,得益于小型浮点引擎的数量之巨和充裕的内存带宽,GPU 在高性能计算机和支持计算密集型负载的数据中心成为应用最广泛的加速器。后者随着人们对机器学习的兴趣快速普及,而机器学习具有鲜明的计算密集和数据并行特征。

来自 AMD Vega 10 和英伟达 Tesla V100 的两份 Hot Chips 大会文件显示,GPU 对机器学习独特性的适应速度令人惊讶。其中一个主要变化来自于数据路径宽度。最近的研究表明,深度学习并不需要达到 GPU 执行单元全部的 32 位浮点精度。因此,AMD 和英伟达都在小型引擎中添加了 16 位数据类型,也都采用了封装内高带宽内存 (HBM) 来快速获取数据。因为这不仅是日常 3D 渲染任务的需要,也是深度学习网络计算的必备条件。

英伟达的探索更深入,可能是因为意识到自己的小型核心组织架构对于矩阵算法并不完全胜任,而后者又是深度学习计算的核心要素。V100 配备了 640 颗 Tensor 核心来加速矩阵乘法累加运算,其名称也许是为了向谷歌的 Tensor 处理单元 ASIC 致敬。每颗核心通过 16 位浮点操作数提供四乘四矩阵的硬线乘法累加数据路径,并产生 32 位浮点总数。Tensor 核心可以聚合成整体,形成 16×16 的乘法累加矩阵。据英伟达称,相比上一代 P100 GPU,这样做可以使 16 位浮点矩阵的运算提速 9 倍。

通过在 GPU 中加入特定应用逻辑,英伟达从另一种截然不同的加速器中得到灵感,即谷歌的 Tensor 处理器单元 (TPU),这也是今年的一大热门主题。TPU 本质上是一种带有 CPU 接口的矩阵倍增器/累加器硬件。通过 8 位倍增器的 256×256 脉动阵列执行重要计算任务。

矩阵算法之外的空间

既然明白了深度学习的核心是人工神经元,也就是矢量点积能够通过强大的矩阵倍增器进行加速,那么,认为神经网络加速器是一种线型代数的猜想就非常合理。但是来自 ARM* 哈佛研究所和普林斯顿的研究认为,这种看法是对推理网络真实情况的误解。如果认为应用软件是网络边缘、网络空间及受限系统中的深度学习推理,则是一种重大误解。

文件表示,在这种环境中,必须充分利用所有矩阵的稀疏性。一旦深度学习网络完成训练,许多权重——每个神经元的输入(活化)系数——都会变成零或趋于零。因此,当点积变成神经元的输出时,许多单个积由于太小将会被忽略不计。这份 ARM 文件提出了一种能够清理这些多余运算的方法。按照他们的设计,静态管理器会将重要权重存储在本地内存中并通过芯片的众多执行单元管线进行必要运算,从而将多余权重排除。

那么训练怎么办呢?在被修整的网络运行之前人们对它一无所知。其中一种能够清除众多指令并加载/存储运算的方法是将代码数据流图形直接映射在硬件上。这样的数据流图形常常用作编译器的中间格式,也是许多机器学习架构的基础,因此可以随时获取。此外还有开源程序可以对其进行优化和修整。

对于将数据流图形映射在硅片上,Hot Chips 给出了两种截然不同的方法。其中一种方法来自 Thinci,发音是“think-eye”,因其善于作解释说明而得名。他们的芯片本质上是一群由线程管理器控制的小型处理器,而其服务器 CPU 则是一群由指令管理器(图 3)控制的执行单元。芯片将数据流图形分解为线程集——每条线程代表图形中一个节点的计算——并将线程映射至处理器,以便数据直接在处理器之间传输,而不用通过中间 RAM 加载和存储。

3.Thinci 的图形处理器将线程(数据流图形节点)映射在一系列处理部件上

来自 Wave Computing 的方法似乎更显激进。根据文件描述,他们使用了多达 16k 的处理部件,互相之间通过可编程开关矩阵连接。编译器将数据流直接映射在阵列中,把图形节点分派给处理部件并通过开关连通这些节点。某种程度上,图形就是芯片的本机语言。Wave 表示,他们的自动化工具和 IC 所取得的加速效果和芯片面积与手动将图形映射在高级 FPGA 上所达到的效果几乎等同。

加速器的崛起

由于能够减少或消除计算密集型核心程序中的指令获取及中间数据存储,能够利用数据和线程并行以及将大量计算部件集成于芯片的优点,硬件加速器——多数是核心 CPU、GPU、算数数组、数据流引擎或 FPGA——逐渐成为计算领域的主流。实际上,在最近的 Linley 处理器大会上,分析师 Linley Gwennap 宣布“未来,加速器将承担起处理工作负荷的重担”。

但这并不意味着 CPU 会止步不前,处理器技术每隔几年都会带来井喷式的晶体管新发展。CPU 架构师们会通过新方法来找到指令和线程并行在基准测试程序和重要客户代码中留下的空白并填补它。但他们也不会忽略对加速器发展的承诺。

除了愈加复杂的矢量处理单元——服务器 CPU 芯片上的浮点 SIMD 引擎应用已有一段时间——一些服务器处理器正在催生加密引擎,更多低调的处理器则正在通过通用用途和深度学习功能来完善 GPU。部分专家认为,未来还将出现更多集成化的硬件加速器。可以肯定的一点是,无论它们的走向是移动设备或是云服务,应用开发者将会看到异构平台的更多应用。

 


CATEGORIES : 計算机运用/ AUTHOR : Ron Wilson

Write a Reply or Comment

Your email address will not be published.