专访:英特尔 oneAPI 和 Direct Parallel C++ 的承诺

已发表: 2022-03-11

当您想到软件开发时,英特尔并不是您想到的第一个名字,尽管它是地球上最具影响力和创新性的技术公司之一。 四十年前,英特尔的 8088 处理器帮助启动了 PC 革命,如果您在台式机或笔记本电脑上阅读本文,您很可能拥有 Intel Inside。 服务器和我们每天依赖的一系列其他硬件也是如此。 这并不是说 AMD 和其他供应商没有竞争产品,因为它们有,但英特尔仍然主导着 x86 CPU 市场。

软件工程师几十年来一直在使用英特尔硬件平台,通常甚至没有考虑其背后的软件和固件。 如果他们需要更高的虚拟化性能,他们会选择多核、超线程 Core i7 或 Xeon 产品。 对于本地数据库修补,他们可以获得英特尔 SSD。 但现在,英特尔也希望开发人员开始使用更多的软件。

什么是英特尔 oneAPI?

进入 oneAPI,它被英特尔吹捧为单一、统一的编程模型,旨在简化跨不同硬件架构的开发:CPU、GPU、FPGA、AI 加速器等。 它们都具有非常不同的特性,并且擅长不同类型的操作。

什么是英特尔 OneAPI?

英特尔现在致力于“软件优先”战略,并希望开发人员能够注意到这一点。 oneAPI 背后的宏伟理念是让一个平台能够用于一系列不同的硬件,因此开发人员在为 CPU 和 GPU 编写代码时不必使用不同的语言、工具和库。 使用 oneAPI,两者的工具箱和代码库将是相同的。

为实现这一点,英特尔开发了 Data Parallel C++ (DPC++),作为通常用于为特定硬件(例如 GPU 或 FFPGA)编程的专有语言的开源替代方案。 这种新的编程语言应该提供 C++ 的生产力和熟悉度,同时包括一个用于跨不同硬件目标部署的编译器。

数据并行 C++ 还结合了 Khronos Group 的 SYCL 以支持数据并行和异构编程。 英特尔目前提供对其 DevCloud 的免费访问,允许软件工程师在云中试用他们的工具并修改 oneAPI 和 DPC++,而不会有太多麻烦。

oneAPI 用于跨架构开发

但是等等,它会在其他供应商制造的硬件上工作吗? 许可呢,它是免费的吗? 是的,是的:oneAPI 设计为与硬件无关且开源,这不会改变。

为了了解有关 oneAPI 的更多信息,我们与英特尔架构、图形和软件事业部副总裁兼英特尔技术、企业和云计算总经理 Sanjiv M. Shah 讨论了它的起源和未来。

Sanjiv:就 oneAPI 中的内容而言,我认为它分为四个部分。 一个是语言和标准库,第二个是一套深度学习工具,第三个是真正的硬件抽象层和软件驱动层,可以抽象出不同的加速器,第四个是一套专注于领域的库,如Matlab等。 以上是 oneAPI 中的四类东西,但我们可以更深入地谈谈 oneAPI 的九个元素。 这九个元素基本上就是我们要介绍的称为 Data Parallel C++ 的新语言及其标准库。

有两个学习库,一个用于神经网络,一个用于通信。 有我们称之为零级的用于硬件抽象的库,并且有四个以领域为中心的库。 我们正在以一种非常、非常开放的方式来做这件事。 所有这些的规格都已经开放并可用。 我们称它们为 0.5 版。 我们打算在 2020 年底之前推出 1.0,并且我们也有所有这些的开源实现。 同样,我们的目标是让人们能够利用已有的东西。 如果硬件供应商想要实现这种语言,他们可以采用开源的并使用它运行。

问:关于算法和实现,它是如何工作的?

我们提供的是算法将使用的原语:底层数学原语和通信原语。 通常,算法创新发生在比这更高的水平上,他们并没有真正重做基础数学、矩阵数学、卷积数学等。 它是关于找出使用数学的新方法和使用通信模式的新方法。 我们的目标确实是让我们提供原始的零级,以便其他人可以在它之上进行创新。

问:它在硬件层面是如何工作的?

如果您是硬件供应商,让我们以 AI 矩阵为例,例如构建 AI ASIC 的人——该硬件供应商有两种方法可以“插入”并利用 AI 生态系统。 一种是提供我们称之为零级的低级硬件接口,如果他们使用标准 API 提供他们的零级版本,他们可以根据需要利用开源,然后是上面的所有软件层可以自动利用它。

对于专注于细分市场的 ASIC 而言,这可能很难提供零级的全部通用性。 因此,作为替代方案,他们也可以只提供我们领域和深度学习库中的数学内核和通信内核,然后我们将把这些库“连接”到更高级别的框架中,所以他们会自动得到。

问:你提到你现在的版本是 0.5,完整的规范应该在 2020 年底之前准备好。

因此,我们的 oneAPI 计划分为两个部分。 一个是行业部分,一个是英特尔产品。 行业规格为 0.5,而在年中左右,我们希望达到 1.0。 与此同时,英特尔正在构建一系列产品,而英特尔正在构建的产品目前处于测试阶段,它们实现了 0.5 规范。 到今年年底,我们希望推出 1.0 产品。

英特尔的产品超越了 oneAPI 的九个元素,因为除了我们提供的基本编程元素之外,我们还希望提供程序员真正需要的东西,例如调试器、分析器和兼容性工具,以便他们从现有语言迁移到数据并行 C++ 语言。

Q:开发商转型有多难? 更广泛的环境是否与他们多年来一直使用的环境相似?

是的,它非常相似。 让我稍微描述一下 Data Parallel C++,因为这是我们所做工作的重要组成部分。 DPC++ 是三件事。 它建立在 ISO 国际标准 C++ 语言之上。 有一个名为 Khronos 的组织定义了名为 SYCL 的标准,SYCL 位于 C++ 之上。 我们采用 SYCL,然后在 SYCL 之上添加扩展。 我们构建数据并行 C++ 的方式,它实际上只是带有扩展的 C++,这就是 SYCL。

oneAPI DPC++ 编译器和运行时

任何 C++ 编译器都可以编译它。 DPC++ 的美妙之处在于任何编译器都可以编译它,只有知识渊博的编译器可以利用该语言中的内容并生成加速器代码。 我们使用这种语言的方式是非常非常公开的,所以我们所有关于 Data Parallel C++ 的讨论都在 SYCL 委员会进行。 这些实现是开源的,所有的扩展都已经发布了,我们正在非常非常仔细地工作,以确保我们能够顺利进入未来的 SYCL 标准。 展望未来 5 到 10 年,ISO C++ 也是一条捷径。

问:关于编译器和迁移到 DPC++,学习曲线应该不是什么大问题?

是的,当然,这取决于您从哪里开始。 对于 C++ 程序员来说,学习曲线会非常小。 对于 C 程序员,您必须克服学习 C++ 的障碍,但仅此而已。 这是非常熟悉的 C++。 对于习惯使用 OpenCL 等语言的程序员来说,应该非常相似。

我必须强调的另一部分是我们正在使用 LLVM 基础设施在开源中开展工作。 我们所有的源代码都已经开放,有一个英特尔 GitHub 存储库,您可以在其中查看语言实现,甚至下载开源编译器。 所有英特尔工具、我们的测试版产品也可供任何人免费使用和下载。 我们还有一个可用的开发者云,人们不需要下载或安装任何东西,他们只需编写代码并开始使用我们讨论过的所有工具。

问:C++ 是高性能且相对简单的,但我们都知道它已经过时,开发缓慢,利益相关者太多,所以他们拖慢了一切。 这显然不是 DPC++ 的情况。 你会有更快的迭代和更新吗?

我认为你已经达到了对我们来说非常非常重要的一点,那就是快速发展,不会因标准而减慢。 因此,我们希望公开讨论标准,因此有一种进入标准的方法,但我们也希望快速进行。

随着架构的发展,语言在由用户和实现者共同设计时效果最佳。 我们的目标是真正快速的迭代代码设计,我们正在实践事物,找到做事的最佳方法,并使它们成为标准。 所以,绝对地,快速迭代是一个大目标。

问:我的一些同事提出的一个问题(你可能理解他们对来自大公司的任何东西的开放性有些担心):DPC++ 是否会一直对所有用户和供应商开放?

绝对地! 该规范是通过知识共享许可完成的。 任何人都可以使用规范,如果他们愿意,可以使用它并分叉它,然后发展它。 我想强调的是,并非 oneAPI 的所有元素都是开源的,但我们正在努力使几乎所有元素都开源。 所有这一切,任何人都可以抓住和利用——它可用于实施。

英国以外的公司 Codeplay 宣布了 DPC++ 的 Nvidia 实施,我们真的鼓励所有硬件供应商和软件供应商进行他们的移植。 我们处于行业中的一个独特点,加速器在多个供应商中变得普遍。 当历史上发生这种情况时,当只有一个提供者时,他们的语言占主导地位。 软件行业需要一个标准的解决方案和多个供应商。

我们在这里尝试做的是我们在大约两年半前使用 OpenMP 所做的事情,其中​​有多种并行语言,但没有一种真正占主导地位的语言。 我们采用了所有这些并将其统一为一个标准,25 年后的今天,它已成为 HPC 编程方式。

问:说 DPC++ 将在未来几年内发生大量演变是否正确? 那么张量呢,新硬件的出现呢?

是的,绝对的,你是对的。 我们必须改进语言以支持即将推出的新硬件。 这就是更快迭代的目标。 我要强调的另一点是,我们正在设计 Data Parallel C++,以便您还可以根据需要插入特定于体系结构的扩展。

因此,虽然它是一种我们希望跨多种架构运行的标准语言,但我们也意识到有时,一个非常重要的受众需要尽可能高的性能。 他们可能想深入到不一定是架构可移植的非常低级的编程。 我们正在构建扩展和机制,以便您可以扩展张量等,这将是特定于架构的。

问:开发人员可以对为硬件生成的代码进行多少控制? 他们可以对系统和各种加速器之间的内存管理进行多少控制?

我们从 SYCL 中借用了缓冲区的概念,它为用户提供了非常明确的内存控制,但除此之外,我们还添加了统一内存的概念。 我们的目标是为程序员提供他们需要的控制级别,不仅仅是管理内存,还可以生成快速代码。 我们在 SYCL 上添加的一些扩展是子组、缩减、管道等。 这将让您为不同的架构生成更好的代码。

问:一个有趣的点是用于 Python 的 oneAPI 发行版——英特尔特别列出了 NumPy、SciPy、SciKit Learn。 我对可以通过 oneAPI 解锁的性能提升和生产力优势感到好奇。 您对此有任何衡量标准吗?

这是一个很好的问题。 我们正在支持该生态系统。 为什么 Python 要使用加速器? 这是为了从其数学库、分析库中获得性能。 我们正在做的是“管道”NumPy、SciPy、SciKit Learn 等,以便我们可以利用我们在其之上的库获得良好的性能。 NumPy、SciPy、SciKit Learn 等的默认实现,与使用优化的原生包正确探测的实现相比,可以看到非常非常大的收益。 我们已经看到了大约 200 倍、300 倍等的收益。

我们对 Python 的目标是,我们希望在一个合理的分数范围内,在 2 倍之内,也许在 80% 的本机代码性能范围内。 当今最先进的技术是您经常达到 10 倍或更多。 我们希望通过管道所有高性能任务来真正弥合这一差距,这样您就可以在 2 倍以内,而且实际上要高得多。

问:我们在谈论什么类型的硬件? 开发人员能否在普通工作站上释放这种潜力,还是需要更强大的东西?

不,它会无处不在。 如果您考虑收益来自哪里,那么您就会明白。 普通的 Python 库不使用 CPU 上的任何虚拟化功能。 他们没有使用 CPU 上的任何多核功能。 它们没有优化,内存系统和所有没有优化的东西。 因此,它归结为由天真的程序员编写并由编译器编译而没有任何优化的矩阵乘法,然后将其与专家用汇编代码编写的进行比较。 当您比较这两者时,您可以看到多 100 倍的收益,而在 Python 世界中,本质上就是这样。

Python 解释器和标准库是如此高级,以至于你最终得到的代码变成了非常非常幼稚的代码。 当您使用优化的库正确地探索它时,您将获得巨大的收益。 笔记本电脑已经有两到六个或八个 CPU 内核,它们是多线程的,并且具有相当不错的矢量化功能,也许是 256,也许是 512。因此,笔记本电脑和工作站中有很多性能。 当您将其扩展到 GPU 时,一旦您有可用的图形,您就可以想象收益来自哪里。

如果您查看我们的集成显卡,它们也变得非常强大。 我相信你已经看过 Ice Lake Gen 11,它的集成显卡明显优于上一代。 即使在笔记本电脑上,您也可以看到好处来自哪里。

问:DevCloud 可用性如何? 如果我没记错的话,它现在对所有人都是免费的,但是在你明年获得金牌之后它会保持这种状态吗?

这是个好问题。 在这一点上,老实说,我不知道答案。 在这一点上,我们的意图是让它永远免费。 这是为了开发,为了玩耍,那里有很多马力,所以人们实际上可以跑步。

问:那么,如果我们请几千名开发人员试一试,您不介意吗?

哦,绝对不是。 我们希望这种情况发生!

我可以总结一下我们正在尝试做的事情。 首先,我们对 oneAPI 感到非常非常兴奋。 是时候推出多供应商解决方案了,因为现在市场上有多家供应商。 如果您查看我们的处理器产品线,而不仅仅是即将推出的 GPU、越来越强大的集成 GPU 以及我们的 FPGA 路线图,现在是为所有这些建立标准的激动人心的时刻。 我们的目标是生产力、性能和行业基础架构,以便您可以在此基础上进行构建。

至于我谈到的三个受众,应用程序开发人员可以轻松地利用这些东西,因为它们已经可用。 硬件供应商可以利用软件堆栈并插入新硬件,而工具和语言供应商可以轻松使用它。 英特尔无法构建世界上所有的语言和所有工具,因此它是一个开源基础架构,其他人可以非常轻松地利用和构建它。