OneAPI 是英特尔在生态布局中最重要的一环,这已经不是什么秘密了。早在 2018 年底举行的英特尔架构日上,英特尔的芯片首席架构师 Raja Koduri 就对外公布了公司正在着力研发的一件“大事”:一个名为 OneAPI 的软件编程框架。
(图片来自 anandTech)
OneAPI:梦想照进现实?
顾名思义,OneAPI 旨在提供一个适用于各类计算架构的统一编程模型和应用程序接口。也就是说,应用程序的开发者只需要开发一次代码,就可以让代码在跨平台的异构系统上执行,底层的硬件架构可以是 CPU、GPU、FPGA、神经网络处理器,或者其他针对不同应用的硬件加速器等等。
OneAPI 的口号是“No transistor left behind”,老石把它翻译成“晶体管一个也不能少”,这也很形象的总结了 OneAPI 的终极目标。
很多人在看到 OneAPI 之后的第一反应,都是三个字:不可能。有些略显极端的媒体甚至认为,OneAPI 已经超出科幻小说的范畴,实在难以置信。
这些怀疑的声音并非毫无依据,应用程序的跨平台优化一直是业界研究的热点和重点之一。而 OneAPI 希望一次性解决四个硬件架构的异构编程问题,无异于在游戏开始就选择了地狱难度。
梦想还是要有的,万一实现了呢?
对于大多数应用程序的开发者来说,使用高级语言编程已经成为了再平常不过的事情。试想一下,你上一次写 C++或 Python、并需要知道特定处理器指令的操作码是什么时候?
事实上,现有的高级语言编译器已经很好的将程序开发与底层的计算机体系结构分离开来。这使得应用程序开发者可以专注于算法和应用的开发,而无需关心太多底层的 CPU 究竟如何实现程序。
然而,随着应用的复杂性不断增加,对算力的要求也逐渐加大。此时,单纯依靠堆积 CPU 内核已经无法满足应用程序对于性能、实时性、功耗、成本等等的要求。人们开始使用越来越多的非 CPU 计算单元,比如 GPU、FPGA、以及各种针对不同应用而开发的专用芯片等。这些硬件加速器与 CPU 一起组成了复杂的异构平台。
为了发挥这个异构平台的最大性能,开发者需要深入了解底层硬件的体系结构,以及一系列的特定开发手段和技巧,以便针对性的利用各个异构单元的优势。
拿 FPGA 来说,如果按开发软件的思路去开发 FPGA 硬件,比如使用了各种循环嵌套、多层条件分支等等,恐怕只会得到一个连时序都无法收敛的 FPGA 设计。同样的,如果想用 GPU 做一些加速运算,那么最好在团队中有人对 CUDA 或 OpenCL 等有丰富的经验,否则就有可能白白消耗了 GPU 的高功耗而收效甚微。
这里只有一个问题:对于普通的软件工程师或算法工程师而言,了解和掌握这些硬件相关的开发知识几乎是不可能的。
而这正是 OneAPI 希望解决的痛点(引自英特尔):
“OneAPI 提供一个通用、开放的编程体验,让开发者可以自由选择架构,无需在性能上作出妥协,也大大降低了使用不同的代码库、编程语言、编程工具和工作流程所带来的复杂性”。
OneAPI:HLS 的进化形态?
具体来说,英特尔将旗下的芯片架构分成了 SVMS 四类,即:
标量(Scalar):CPU
矢量(Vector):GPU
矩阵(Matrix):AI 芯片
空间(Special):FPGA
这四类架构分别有各自的优势和适用范围,同时也有着各自的编程模型和方法。
以 FPGA 为例,FPGA 的硬件可编程性一直是它最主要的特点,也是与其他硬件加速器相区分的重要特性。然而,对 FPGA 进行编程远远没有听起来那么简单,这在老石之前的文章中也详细介绍过多次。其中最大的难点,就是要使用硬件描述语言(HDL)对电路行为进行建模,而且这种建模往往有着比较低的抽象程度。
也就是说,FPGA 开发者需要将待实现的算法进行分解、并行化、设计流水线,使其成为一个个数据通路或控制电路,同时还要设计数据的存储和读取方式、各种时钟域的同步、进行时序收敛等诸多优化,以符合系统的功耗、吞吐量、精度、面积等需求。这还不包括电路仿真、调试,以及在软件层面需要做的一系列工作。
这样,为了做出一个真正优化过的 FPGA 设计,往往需要一个有着丰富设计经验的团队协同合作。而就算有这样的团队,在处理一个再常见不过的 for 循环嵌套时,都可能花费长达数月的时间进行 FPGA 的硬件实现与性能调优。只需要看一下过去几年里,各类国际顶会和期刊上有多少关于 FPGA 循环展开与优化的论文就可见一斑了。
为了应对 FPGA 的设计复杂度过大的问题,业界通常有两种方法:第一,尽量将优化过的硬件设计封装成 IP,让使用者直接调用。第二,使用诸如高层次综合(HLS)的方法,直接将高层语言描述的模型转化为 FPGA 硬件。
HLS 一直是 FPGA 业界发展的重要方向,几乎没有之一。老石在之前的文章《高层次综合 – 解锁 FPGA 广阔应用的最后一块拼图》中曾经详细分析过,这里不再赘述,有兴趣的读者可以参考那篇文章。
HLS 的主要问题是,它设计的初衷是为了硬件工程师服务,而非软件和算法开发者。因此,起码到目前为止,在业界取得成功的 HLS 工具都需要使用者有着丰富的硬件知识。在数字电路工程师手中,HLS 工具已经被证明可以极大的缩短设计周期,有时甚至可以得到近似或优于人工优化过的 RTL 代码。然而对于软件工程师,HLS 就好比让 C 罗去湖人队打篮球,固然噱头十足,但很难得到令人满意的成绩。
OneAPI 在很大程度上可以看做是 HLS 的扩展,但它的主要目标受众则是软件和算法工程师,这也将成为 OneAPI 与其他 HLS 工具的最主要区别。OneAPI 提供了一个统一的软件编程接口,使得开发者可以随意在底层硬件之间进行切换和优化,而无需太多关心具体的电路结构和细节。
DPC++语言与硬件加速库
具体来说,OneAPI 的核心是一个名为 Data Parallel C++(DPC++)的编程语言。DPC++本质上是 C++的扩展,增加了对 SYCL 的支持。
SYCL 由 Khronos 组织开发,它是一个在 OpenCL 上的 C++抽象层,使得用户可以直接用简洁的 C++对 GPU 等进行开发,而无需被 OpenCL 限制。
不过,有关 DPC++本身的资料目前还比较有限,尚不清楚其具体的开发方法、以及如何对异构系统进行编程。待具体实例出现后,老石再进行详细解读。
除了编程接口外,OneAPI 还会包含一个完整的开发环境、软件库、驱动程序、调试工具等要素,并且这些加速库都已经针对底层硬件进行了优化设计。
这种基于优化过的加速库的设计,和赛灵思的 Vitis 系统有着异曲同工之妙,而这也恰恰代表了业界发展的方向。现如今,生态为王,为了掌握生态和开发者,就必须尽可能多的提供各类开发库和 IP,以便开发者专注于应用开发,而无需重复造轮子。
(图片来自英特尔)
为了支持 SVMS 四大类硬件架构,OneAPI 实际上给自己设置了非常高的目标。英特尔已经在 2019 年四季度发布了 OneAPI 的开发者测试版。除了基本工开发工具包之外,英特尔还发布了针对高性能计算(HPC)、深度学习、IoT、以及视觉和视频等四种领域专用的开发工具包,以期为这些特定的应用进行针对性的优化。在当前的版本中,开发者仍然需要在 SVMS 四大类中手动指定目标器件类别。但除此之外,OneAPI 就会自动对目标器件的子类别进行优化。
结语
兵法云,兵马未动,粮草先行。在技术进步日新月异的当代,各类 AI 芯片、硬件加速器不断涌现,异构计算已经成为整个行业最重要的趋势。针对这些层出不穷的新硬件,则更应该“架构未动,软件先行”。作为芯片厂商,单纯提供芯片产品已经无法满足市场和使用者的需要,只有同时提供硬件和软件生态,才能在激烈的竞争中杀出一席之地。
老石认为,OneAPI 是英特尔当前最具有战略意义的生态布局。相信有了诸如 OneAPI 之类的高层设计工具,软件工程师和算法专家们就能进一步释放包括 FPGA 在内的异构系统的底层算力。至于 OneAPI 未来的表现如何,让我们拭目以待。
OneAPI 相关的技术资料和编程指南,已上传至知识星球“老石谈芯 - 进阶版”,请在文末扫码进入星球查看。
(注:本文仅代表作者个人观点,与任职单位无关。)