GPU诞生的原因是人们需要更好地处理3D游戏中的图形渲染,因此GPU拥有很多很小的内核增加并行处理能力,然后通过图形流水线的模式做图形处理。由于天生核心数量多,因此GPU计算能力增加迅速,业界普遍认为2004年前后GPU计算能力已经超过CPU,此后两者之间的算力差距越拉越大。
拥有强大算力之后,更多的应用开始找上GPU,比如气候检测,还有时下大热的深度学习等。快速增长的计算需求也开始改变GPU,早期用于通用计算的GPU实际上还是遵循图形处理的原则来设计,内部依然有Vertex级处理器以及Fragment级处理器,面向其他运算需求显得“不伦不类”,直到英伟达设计出了统一处理器。
此后,GPGPU在任务清晰且计算量要求大的领域,比如矩阵的计算上优势愈发凸显。受益于人工智能、大数据和万物互联等多层buff加持,越来越多的行业开始提出这样的计算需求,GPGPU前景光明且市场巨大。在这样的背景下,目前国内已经涌现出一批GPGPU企业,沐曦集成电路(上海)有限公司(以下简称:沐曦)便是其中之一,该公司致力于提供高性能GPU。
软件栈决定了用户群大小和用户体验
回顾GPGPU的发展,我们发现市场需求不仅是改变了GPGPU的核心布局,同时为了兼顾通用性,软件端也发展了巨大的改变,从OpenGL演化出统一计算架构CUDA。沐曦光启智能研究院科学家李兆石在接受电子发烧友采访时表示,“GPGPU作为一款通用芯片,在面对不同客户层出不穷的新需求时,需要保证它的可编程性。可编程性是由完善的软件栈来保证的。对于所有GPGPU来说,软件栈的规划直接决定了GPGPU用户受众群体大小和用户使用体验。因此所有的GPGPU,不论是否国产,都会拥有自己的运算平台,即软件栈。比如AMD面向它的MI系列GPGPU,对标CUDA,开发了RoCM,并在RoCM之上移植了PyTorch等AI软件框架。”
沐曦光启智能研究院科学家李兆石
他强调GPGPU上软件栈是至关重要的,对此他通过分析英伟达的CUDA来解释原因。“GPGPU芯片非常庞大,最新的Nvidia A100上有542亿个晶体管,它们构成了6912个并发执行的CUDA内核,以及为了保证CUDA内核的数据供给而设计的一套复杂的存储子系统。考虑到人的思维方式是串行的,用户很难处理这么多的并发执行单元,因此这么多并发的硬件资源不可能直接暴露给用户。所以我们需要有一套软件栈将底层硬件架构的特征抽象成易于理解的编程模型提供给用户,从而让用户充分开发GPGPU的潜力。” 李兆石讲到,“然而抽象是有代价的:抽象掩藏掉的硬件细节越多,编程模型对用户越友好,那么它会越难充分发挥硬件的全部潜力。因此GPGPU的抽象是分层次的:越靠近用户的层次越易用,同时该层次的性能或者灵活性会越差。这样特定应用领域的用户,如果重心在开发效率,可以选择高层次的编程模型;而需要榨取GPGPU性能潜力的用户可以选择低层次的编程模型。这也正是我们把GPGPU的编程模型称为‘软件栈’的原因。”
目前,国产GPGPU显然还是跟随者的状态,虽然厂商在积极地推进架构创新和软件创新,但和英伟达之间的差距还是巨大的,因此从英伟达身上国产GPU还有很多经验可以汲取。李兆石对英伟达在GPGPU上面的软件实力有着清晰的认识,他指出:“英伟达的AI软件栈自底向上至少可以分成5层:SASS是硬件实际执行的指令集,类似CPU的汇编;PTX是虚拟指令集,为不同代的Nvidia GPGPU提供了一个统一的编程接口;CUDA是用户在编写高性能GPGPU程序时最主要的编程模型;cuBLAS, cuDNN, cuFFT, CUTLASS等运算库则让用户可以通过调用Nvidia针对自家GPGPU高度定制的算子库,不需要花费太多精力进行性能调优就可以享受到Nvidia GPGPU最好的性能,但它们灵活性受限;TensorRT, Triton, Megastron则是Nvidia针对特定AI应用场景深度定制,让AI类用户开箱即用的软件平台。”
可以看出,CUDA处于中间层。CUDA提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口来实现GPU的访问。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。
李兆石认为:“对于新兴的国产GPGPU而言,构建自己的软件栈时,首要任务是先打好基础,对标CUDA及以下的抽象层次,充分发挥自己芯片的特色,开发出一套用户可用、易用的编程模型,正所谓‘不积硅步无以至千里’。然后再结合目标客户的需求,对标TensorRT等框架,定制开箱即用的高层次编程模型。”
在此,他谈到了沐曦的规划。当前,沐曦GPGPU的芯片架构和软件栈是同时开发的。芯片架构上与现有GPGPU拥有不同的新特性,在设计之初都充分考虑了如何在各个层次的编程模型中进行抽象。这样,沐曦可以保证用户即可以平滑地从现有GPGPU迁移到沐曦的GPGPU上,又能在使用沐曦的软件栈时充分享受到新特性带来的更好体验。
着眼于未来的发展,英伟达CUDA既是国产GPGPU在并行计算架构方面的老师,也是最大的劲敌。目前,CUDA已经能够支持DX12这样的API,也支持C语言、Fortran、OpenCL等计算语言,其生态属性非常强大。并且根据英伟达官方的说法,CUDA未来的发展是开放性的技术平台,支持更多的并行计算需求。这样的CUDA会给国产GPGPU在软件栈方面的发展造成巨大的困扰,因此李兆石呼吁:“国内各家GPGPU创业公司都有自研IP和软件栈的规划。从公开的信息来看,各家公司的软件栈规划都存在一定的共性。希望未来大家可以多多相互交流,共同进步。”
传统GPU的软件栈很难迁移到GPGPU上
GPGPU在GPU的基础上进行了优化设计,使之更适合高性能并行计算,并能使用更高级别的编程语言,在性能、易用性和通用性上更加强大。相较而言,国产GPU的启动比国产GPGPU要提前一些,是否有经验可循呢?
李兆石认为:“传统GPU主要面向图形渲染类应用。对于Nvidia来说,图形渲染类应用的软件栈与GPGPU的软件栈,只有底层的SASS, PTX和少量CUDA是共享的。再往上走的图形渲染API层,如OpenGL, Vulkan等,目前GPGPU还不需要支持。国产传统的图形渲染GPU,大多基于自研的汇编层,对提供图形渲染API层提供支持。我们的底层设计(与Nvidia SASS和PTX同层次的汇编)与Nvidia及其它国产GPU是不同的,因此传统的图形渲染GPU软件栈难以直接迁移到GPGPU上。”
应用领域方面,GPGPU将应用扩展到了图形之外,在科学计算、区块链、大数据处理、工程计算、金融、基因等方面都有重要的应用,但更多是以服务器的形态提供高算力。在应用层面,目前传统GPU和CPU的融合趋势已经显现,比如AMD APU系列,苹果的M1芯片、以及大多数手机SoC芯片等,它们的CPU和GPU都是直接在物理上共享内存。这些芯片通过CPU和GPU的紧密耦合,避免了CPU和GPU之间数据跨芯片搬运的能量消耗。
李兆石表示:“对于GPGPU而言,目前市面上还没有成熟的产品,让CPU和GPGPU在同一个die上紧密耦合。造成这一现象的原因有两个。首先,CPU和GPGPU之间的通信延迟或带宽,在目前流行的GPGPU应用中不是系统的瓶颈。GPGPU的编程模型中,CPU与GPGPU间的通信用于处理应用中的控制逻辑。而GPGPU通常用来处理计算密集型应用或者访存密集型应用,其瓶颈在于GPGPU上的计算资源、或者GPGPU与显存(GDDR或者HBM)之间的通信带宽。控制密集型应用很少大规模部署在GPGPU上。其次,GPGPU通常以加速卡的形式部署在服务器上,服务器厂商出于成本、可靠性和可扩展性的考虑,会分别采购CPU和GPGPU。”
“不过,对于CPU和GPGPU的融合,我们还是要以发展的眼光看问题。从应用需求的角度,随着张量加速单元和HBM技术在GPGPU的普及,GPGPU的计算和访存能力快速提升。正所谓‘按下葫芦浮起瓢’,此时CPU和GPGPU的通信代价正在变得越来越显著。尤其当我们考虑到新兴的Pytorch等AI框架的动态图特性会引入非常频繁的CPU-GPGPU之间的交互时,低延迟的CPU-GPGPU紧耦合架构就变得更有价值了。从系统设计的角度,新兴的Chiplet技术可以有效降低封装内CPU和GPGPU紧耦合的设计成本。所以我们也很期待新的应用需求和封装技术可以使能未来的融合CPU-GPGPU芯片。” 李兆石在采访中讲到。