当2020年10月份,NVIDIA在其GTC 2020大会上大张旗鼓的宣传DPU之后,整个行业热了起来,大家都在问:什么是DPU?DPU到底能干什么?DPU和GPU有什么区别?号称数据中心三大处理器之一的DPU,“何德何能”与CPU、GPU并驾齐驱?
本文站在体系结构的视角,从技术演进的角度,讲一讲从CPU、GPU到DPU的演进,以及三者之间的协作关系。期望能够解答大家的疑惑。
冯·诺依曼架构模型是计算机系统的经典模型,简单说,就是一个计算机系统包括输入、处理和输出三个部分。处理部分有控制单元、计算单元和数据暂存,处理部分的控制单元和计算单元组成大家通常理解的中央处理单元CPU。这样,内存作为CPU的输入和输出,CPU内部的寄存器则作为暂存。
如图所示,不仅仅是CPU,其他各种处理引擎本质上都是基于冯·诺依曼架构的。我们把经典的冯·诺依曼架构进一步抽象化,即变换成一个通用的系统处理模型。整个模型包括:
而CPU和其他处理引擎最大不同在于:CPU是Self-Control,也就是说CPU是图灵完备的;而其他处理引擎需要有外部的系统来控制处理引擎的运行,也即是说这些处理引擎通常是不图灵完备的。
虽然现在大家讲非冯架构,但本质上,各种创新的计算架构都是基于同样的(冯·诺依曼架构的)思想,可以看做:
这里只强调一些基本的概念:
CPU之前,传统计算机我们通常称为“固定程序计算机”(Fixed-Program Computer),由于它们的线路必须被重设才能执行不同的程序。而CPU解决了这一问题,CPU通过支持跳转、调用等控制类指令,可以很方便的把很多程序块动态的组织到一起,形成非常复杂并且功能强大的程序,或者称为软件。
很多人会认为,CPU可以自动的执行非常复杂的计算机程序,这是CPU最大的价值所在。其实不然,CPU最大的价值在于提供并规范了标准化的指令集,使得软件和硬件从此解耦:
CPU是最灵活的,原因在于运行于CPU指令都是最基本的加减乘除外加一些访存及控制类指令,就像积木块一样,我们可以随意组合出我们想要的各种形态的功能。
不管是RISC还是CISC,说的是指令的复杂度。如今,即使是RISC,也需要在最简单的高频使用的指令集合的基础上,再增加一些复杂的指令集扩展。当前的CPU,除了常规的各种微架构设计层次的性能手段,从指令集的层次,都在不断的扩展更多复杂的指令集。站在软硬件定义的角度,现代的CPU,基本都包括了很多协处理器加速的成分。
通过标准化指令集,达到软硬件解耦,并且互相向前兼容(软件向前兼容之前的硬件,硬件向前兼容之前的软件)。这样,CPU的硬件设计者,可以不用考虑上层的业务到底是什么,也即不关心通过指令组合出的程序到底是干什么用的。只需要关心,我设计的CPU性能如何的好,可以实现更高的IPC(Instructions per Cycle)和更高的频率。
提升CPU的性能手段,主要体现为如下方面:
从图中,可以看到,在差不多40年的时间里,CPU的整体性能提升接近50000倍。一方面,这有赖于处理器架构的翻天覆地变化,也有赖于半导体工艺的进步。另一方面,更有赖于通过标准化的指令集,使得CPU平台的硬件实现和软件编程完全解耦,没有了对方的掣肘,软件和硬件均可以完全的放飞自我。
一方面是CPU性能狂飙,另一方面,则是软件逐渐发展成了一个超级的生态帝国。从各种数以百万级使用者的高级编程语言,到广泛使用在云计算数据中心、PC机、手机等终端的智能操作系统,再到各种专业的数据库、中间件,以及云计算基础的虚拟化、容器等。上述这些软件都是基础的支撑软件,是软件的“冰山一角”,而更多的则是各种用户级的应用软件,系统级和应用的软件,共同组成了基于CPU的软件超级生态。
上图和上一节的图是一致的,上图主要是明确展示了五个发展阶段:
GPU,Graphics Processing Units,图形处理单元。顾名思义,GPU是主要用于做图形图形处理的专用加速器。GPU内部处理是由很多并行的计算单元支持,如果只是用来做图形图像处理,有点“暴殄天物”,其应用范围太过狭窄。
因此把GPU内部的计算单元进行通用化重新设计,GPU变成了GPGPU。到2012年,GPU已经发展成为高度并行的众核系统,GPGPU有强大的并行处理能力和可编程流水线,既可以处理图形数据,也可以处理非图形数据。特别是在面对SIMD类指令,数据处理的运算量远大于数据调度和传输的运算量时,GPGPU在性能上大大超越了传统的CPU应用程序。现在大家所称呼的GPU通常都指的是GPGPU。
2018年,NVIDIA发布了最新一代的GPU架构——图灵架构。基于图灵架构的GPU提供PCIe 3.0来连接CPU主机接口,提供千兆的线程引擎来管理所有的工作。另外,图灵架构支持通过两路x8的NVLink接口实现多GPU之间的数据一致性访问。
如上图,图灵架构GPU的核心处理引擎由如下部分组成:6个图形处理簇(GPC);每个GPC有6个纹理处理簇(TPC),共计36个TPC;每个TPC有2个流式多核处理器(SM),总共72个SM。每个SM由64个CUDA核、8个Tensor核、1个RT核、4个纹理单元,总计有4608个CUDA核、576个Tensor核、72个RT核、288个纹理单元。
2006年NVIDIA推出了CUDA,这是一个通用的并行计算平台和编程模型,利用NVIDIA GPU中的并行计算引擎,以一种比CPU更高效的方式解决许多复杂的计算问题。CUDA提供了开发者使用C++作为高级编程语言的软件环境。也支持其他语言、应用程序编程接口或基于指令的方法,如FORTRAN、DirectCompute、OpenACC。
CUDA是NVIDIA成功的关键,它极大的降低了用户基于GPU并行编程的门槛,在此基础上,还针对不同场景构建了功能强大的开发库和中间件,逐步建立了GPU+CUDA的强大生态。
TensorFlow以及其他深度学习类的AI算法,非常依赖计算性能。通过密集的计算,训练所需的深度学习模型。计算越多,模型精度越高。当通用的多核CPU平台不足以支持深度学习所需要的计算量时,基于GPU加速的深度学习平台得到了广泛的应用。甚至Google开发了专用的TensorFlow处理器TPU来进一步加速AI算法的处理。
AI类算法通常有三类可能的计算平台:
异构加速的实现架构通常是CPU+GPU/FPGA/DSA,主要由CPU完成不可加速部分的计算以及整个系统的控制调度,由GPU/FPGA完成特定任务的加速。这种架构面临一些挑战:
专用芯片指实现为某种DSA/ASIC架构的设计,DSA/ASIC相对的具有最高的性能同时最低的灵活性。这样的实现具有如下两类挑战:
芯片的一次性研发成本很高,只有大规模使用才能摊薄这些研发开销。而DSA/ASIC所面临的上述挑战,使得芯片的大规模落地成为难题。需要找到一个合适的设计方案,既能保证性能、又能保证灵活性,覆盖更多多久的场景,这样才能真正解决大规模复制的问题。
站在工程设计的角度,定制设计是一种紧耦合的设计,系统复杂度高,并且Case by Case,后续需要无止境的持续开发,代价很大。相对的,需要深入的分析业务场景,达到某种层次上的软硬件解耦(解耦降低系统复杂度),之后形成某种偏平台化的设计。软件和硬件各司其职,完成各自的工作;解耦之后再协同,达到最大限度的功能、性能、灵活性等多方面的均衡甚至兼顾。
CPU(数据计算处理)和IO(数据输入输出)两者的此消彼长,决定了整个计算的架构:
为什么我们说以数据为中心是新一代异构计算架构,跟传统的CPU+xPU架构有什么区别?具体见下表。
6.3 DPU的定位和主要的功能
把服务器看做是一个系统,那么这个复杂的系统必然呈现出某种分层的架构;未来几年的云计算数据中心都具有更加庞大的规模。我们可以主要说,由于(1)复杂的分层的系统、(2)CPU的性能瓶颈、(3)宏观的超大规模以及(4)基于特定场景服务,使得整个系统要想持续不断的提升性能,就需要不断的把Workload从软件持续不断的卸载到硬件加速。
DPU定位为完成性能敏感的并且通用的工作任务加速处理,更好的支撑CPU、GPU的上层业务。DPU完成基础工作任务,构建强大的基础设施层,服务云计算上层业务的快速创新。
DPU对外的接口主要是PCIe和Ethernet。中间包括网络、存储、虚拟化、安全等各种加速任务的处理。扩展的:
PS:DPU具有如此强大的功能,再叫DPU是不是已经不太准确了?嗯,是的,因此,我给起了个新的名字,IPU,Infrastructure Processing Unit,基础设施处理单元。
2021年8月14日,“2021中国智能网卡研讨会”将于北京举办,届时将联合行业大咖一起谈谈智能网卡的技术应用及行业趋势,欢迎大家扫描下方二维码免费报名参会: