打破跨架构障碍,使用 oneAPI:用于轻松异构计算的库





5.00/5 (5投票s)
在本文中,我们将探讨如何使用 oneAPI 改变软件开发范例,以及如何更容易地实现针对给定工作负载的多个执行环境的定位和维护
众所周知:新的硬件加速器层出不穷。这意味着开发人员希望(坦率地说,也需要)利用跨越全新硬件环境的光谱的创新。
软件执行流采用更多样化的架构;任务在这些架构之间分叉、生成和合并。
在最简单、最常见的情况下,以矩阵乘法为中心的工作负载会被并行化并卸载到专用的 GPU。然而,已经有相当多的工作负载利用了多个不同的并发计算节点。2021 年,Evans Data Corporation 的一份报告¹ 发现,40% 的开发人员已经将目标定位于使用一种以上类型的处理器、处理器内核或协处理器来执行给定功能的异构系统。
直到最近,大多数开发人员都被锁定在特定的架构中,导致需要为他们定位的每个架构重新编码应用程序并使用不同的库。通常,由于为了在不同架构上获得相同的功能而需要大量的代码重构,性能会受到影响。
打破这些壁垒的是 oneAPI 这个开放、基于标准、支持多架构、多供应商的编程模型以及配套的 Intel® oneAPI 工具包,它们专门用于使用 C++/SYCL* 抽象层和保持跨架构一致性的性能库 API。
使用 oneAPI,软件开发范式发生了变化,为给定工作负载定位和维护多个执行环境变得更加容易实现;开发人员可以跨不同架构重用他们的代码,同时仍能利用 CPU、GPU 和 FPGA 的硬件加速。
为了加速跨平台应用程序的开发时间和性能,英特尔正在通过集成 SYCL 和 oneAPI 跨平台、基于标准的技术来增强和扩展其性能库。
以 LLVM 项目为基础,并带有 Intel® oneAPI DPC++/C++ 编译器——一个实现 C++、SYCL 和 OpenMP* 的跨平台编译器——及其丰富的性能库家族,Intel® oneAPI 产品和底层 oneAPI 开放行业规范,为开发社区带来了三个主要好处:
- 消除专有锁定
- 实现每个平台的全部硬件价值
- 能够快速正确地开发高性能代码
所有这些都与 Microsoft Visual Studio*、Microsoft VS Code* 和 Eclipse* 等常见集成开发环境完全集成。
库的跨架构必然性
让我们将注意力转向 HPC、IoT 和 AI。
在异构环境中,这些用例越来越受欢迎,越来越多的加速器针对它们及其挑战。开发人员需要能够利用这种日益多样化的硬件。不清楚的是支持跨环境的代码的成本。没有可移植性,即使是最好的代码也可能被抛弃。锁定在单一架构上的代码将无法利用未来的硬件进步,因此,与更具可移植性的替代方案相比,它将失去相关性。
跨平台开发的主要障碍一直是缺乏一套统一的库来抽象架构差异,使开发人员能够跨这些多样化的架构重用他们的代码。有了合适的库,他们就可以根据性能、价格、可用性以及/或其他任何因素来选择平台,而不是屈服于“嗯,我现在的代码运行在这个平台上”的想法。
oneAPI 的性能库系列提供了实现这种选择自由的答案。它们提供基于 API 的跨架构编程,以实现快速上市,同时保持或超越仅使用 C++ 或 SYCL 就能达到的性能。
Intel® oneAPI DPC++ 库 (oneDPL)
oneDPL 是这种新的、通用的、基于 API 的软件开发方法的基石。它通过提供基于熟悉标准的高生产力 API 来补充 Intel oneAPI DPC++ 编译器,包括以下内容,以最大化 CPU、GPU 和 FPGA 的生产力和性能:
- C++ 标准模板库 (STL),已通过 SYCL 内核验证
- 并行 STL (PSTL) 算法,具有在 SYCL 设备架构上运行的实现策略
- Boost.Compute
- SYCL
要选择特定的目标架构,只需将设备选择器传递给一个用于并行卸载到 SYCL 队列 sycl::queue 的任务。
有一系列预定义的设备选择器可以直接使用:
default_selector | 根据实现定义的启发式或主机设备选择设备,如果没有找到设备 |
gpu_selector | 选择一个 GPU |
accelerator_selector | 选择一个加速器 |
cpu_selector | 选择一个 CPU 设备 |
host_selector | 选择主机设备 |
(可以使用设备选择器运算符从这些派生出新设备。请查看 oneAPI 和 SYCL 规范以了解详情。)
使用设备选择器就像下面的示例一样简单:
// Standard SYCL header
#include <CL/sycl.hpp>
int main() {
sycl::device d;
// Exception checking for GPU availability
try {
d = sycl::device(sycl::gpu_selector());
} catch (sycl::exception const &e) {
std::cout << "Cannot select a GPU\n" << e.what() << "\n";
std::cout << "Using a CPU device\n";
d = sycl::device(sycl::cpu_selector());
}
std::cout << "Using " << d.get_info<sycl::info::device::name>();
}
要在不进行代码重新设计的情况下利用此方法,并为即将到来的软件架构变更实现工程投资的未来验证,最佳方法是构建您的工作负载软件栈,基于成熟的高性能库,这些库在采用最新技术进步方面拥有可靠的往绩。
需要注意的是,英特尔已经开放了其庞大的 API 库,并将其中许多贡献给了跨平台的 oneAPI 规范。这还使得为其他非英特尔处理器架构开发 oneAPI 库成为可能。特别是,oneAPI Level Zero 将底层编程模型开放,以涵盖第三方设备供应商和开放的开发人员社区参与。
Intel® oneAPI 线程构建块 (oneTBB)
oneTBB 与 oneDPL 一样,基于成熟的符合 C++ 标准的类,整合了最新的 并行 STL,它实现了 C++ 标准库算法,并支持并行执行策略。
因此,它是 oneAPI 生态系统的一部分,与 oneDPL 并存,并通过灵活的性能库来增强其功能,从而简化为复杂应用程序添加并行性的工作。凭借其简化跨内核和架构的并行代码执行流程优化的能力,oneTBB 被广泛应用于工业和研究的许多计算密集型领域——数值天气预报、海洋学、天体物理学、基因工程、地震勘探、自动化能源资源勘探和社会经济学。
oneTBB 强调数据并行编程,使多个线程能够处理集合的不同部分,而不是将程序分解为功能块并为每个块分配一个单独的线程。通过将集合划分为更小的部分,它可以很好地扩展到更多的处理器——随着处理器的添加,程序性能会提高。
这种设计原则允许库与其他线程包无缝兼容,从而能够轻松集成到 oneAPI 以及现有代码中。
Intel® oneAPI 数学内核库 (oneMKL)
oneMKL 也是 oneAPI 的一部分,它是 Intel® 数学内核库的延续,该库自 2015 年以来一直是行业中最广泛使用的数学库¹。它涵盖了数学、科学和数据分析中使用的广泛功能,包括线性代数、快速傅里叶变换、向量随机数生成、统计、向量数学和复杂几何(图 2)。
oneMKL 针对跨架构性能进行了优化,以实现可以在多个架构(CPU、GPU 等)上运行的复杂数学处理例程,它极大地简化了将数学函数卸载到 GPU 的过程。
为关键计算领域添加了针对 CPU 和 GPU 架构优化的新 SYCL 接口,包括:
- BLAS 和 LAPACK 密集线性代数例程
- 稀疏 BLAS 稀疏线性代数例程
- 随机数生成器 (RNG)
- 用于优化向量数学运算的向量数学 (VM) 例程
- 快速傅里叶变换 (FFT)
此外,结合 SYCL 接口,OpenMP 卸载可用于在 Intel® GPU 上运行标准的 oneMKL 计算。
要利用 oneMKL 和 oneAPI SYCL 接口,只需开始包含这两个头文件:
// Standard SYCL header
#include <CL/sycl.hpp>
// Declarations for Intel oneAPI Math Kernel Library SYCL/DPC++ APIs
#include "oneapi/mkl.hpp"
. . .
// Create a queue on the default device.
sycl::queue device_queue{sycl::default_selector{}};
std::cout << "Device: "
<< device_queue.get_device().get_info<sycl::info::device::name>()
<< std::endl;
// Allocate shared memory for matrices.
auto A = sycl::malloc_shared<double>(m * k, device_queue);
auto B = sycl::malloc_shared<double>(k * n, device_queue);
auto C = sycl::malloc_shared<double>(m * n, device_queue);
auto C_reference = (double *) calloc(m * n, sizeof(double));
. . .
// Call GEMM to do matrix multiplication, asynchronously
std::cerr << "Launching oneMKL GEMM calculation..." << std::endl;
oneapi::mkl::blas::row_major::gemm(device_queue, transA, transB, m, n, k,
alpha, A, lda, B, ldb, beta, C, ldc);
. . .
然后,在您定义的特定 SYCL 队列的上下文中,像以前一样使用 oneMKL 库函数调用。无需更改其他任何内容,即可为即将到来的 GPU 和加速器确保您的库使用具有未来适应性。
有关使用 oneMKL 进行基于 API 的编程的详细代码示例,请参阅 Intel® oneAPI 编程指南 和 GitHub。
Intel® 集成性能原语 IPP
在介绍英特尔全面的性能库家族时,绝不能忽略 Intel IPP,这是一个包含现成、高度优化的图像、信号和数据处理功能的庞大库。
Intel IPP 用于云和服务器应用程序、医学成像、数字监控、生物识别、无线通信等。
与英特尔其他性能库系列一样,IPP 保持稳定的 API,同时不断优化和适应最新的架构进步以及并行数据和并行执行流程的改进。
Intel® oneAPI 视频处理库 (oneVPL)
Intel oneAPI 不仅关乎开放标准和跨架构软件开发的自由选择。它还关乎在媒体和视频处理方面充分发挥您系统中 Intel GPU 的性能。
oneVPL 是 Intel® 媒体 SDK (MSDK) 的继任者,它将您从集成显卡抽象带到了更广泛的加速器上的媒体功能解锁。
以下是其功能简要列表:
- 提供与熟悉的 MSDK 核心 API 的向后兼容性
- 包含与旧版工具包相同的视频编解码器和滤波器
- 通过硬件加速编解码器和可编程图形在 Intel® 处理器上提高媒体和视频应用程序的性能
- 加速向更高帧率和分辨率的过渡
- 提高视频质量并创新云图形和媒体分析
- 对于 Intel® Core™ Gen12、Intel® Iris® Xe 和 Intel® Arc 系列 GPU,oneVPL 实现了低延迟同步以及 oneVPL 与系统内存、Linux VA 曲面和缓冲区、DX9 曲面、DX11 纹理和 DX12 资源之间的有效零拷贝内存互操作。
此外,oneVPL 使用 Intel® Deep Link 技术 可显著加快编码速度,同时利用基于 API 的编程优势,从而降低基础设施和开发成本。
AI 异构计算库
除了高性能的跨架构计算库系列之外,oneAPI 编程模型规范还包括以下内容:
- Intel® oneAPI 深度神经网络库 (oneDNN) 专为深度学习 (DL) 应用和框架开发者而设计,他们希望提高应用程序在 Intel CPU 和 GPU 上的性能。它继续支持之前提供的功能,包括 C 和 C++ 接口、OpenMP 和 oneTBB 运行时。
- Intel® oneAPI 集合通信库 (oneCCL) 有助于优化通信模式,将深度学习模型训练分布到多个节点。
- Intel® 数据分析库 (oneDAL) 是一个强大的库,提供高度优化的功能和求解器,以加速机器学习和深度学习应用程序的基础大型数据集分析算法。
这些规范元素及其对应的库实现为将跨架构软件开发应用于 AI 和 DL 奠定了基础。
Intel® AI 分析工具包中的这些附加功能将 Intel® oneAPI Base Toolkit 从一个全面的跨架构软件开发解决方案转变为一个强大的 AI 训练和推理工具包。
开放且跨平台的分析和调试工具
oneAPI 库是第一个全面的跨平台解决方案的一部分,该解决方案包括库、编译器、工具、性能分析器和调试器。
对于设计用于在各种异构平台上运行且易于维护的高性能工作负载,它们提供了一个基于 API 的编程模型的粘合剂,从而实现了易于维护的代码库。
利用 oneAPI 编程模型的应用程序可以在多个目标硬件平台(如 GPU 和 FPGA)上执行。
正如同构系统的并行编程已变得无处不在一样,我们也看到异构系统的并行编程正走上类似普及的道路。与多核并行不同,异构编程将涵盖多个供应商的计算能力。如果没有在库、编译器和框架中采取通用的、开放的、多供应商的方法,这可能会威胁到编程的碎片化。
James Reinders,英特尔首席工程师,软件策略师和作家
Reinders 解释道:“我们将这一代流行的工具命名为,以强调 oneAPI 应对异构并行性的开放方法。它们仍然[基于]行业数十年来一直依赖的相同质量的产品工具,[同时]通过拥抱 oneAPI 规范和 SYCL 标准来扩展以支持异构编程。”
正如英特尔凭借 Intel® Parallel Studio 开辟道路一样,oneAPI 进一步推动了并行性,提供了针对数学、神经网络、深度学习、渲染等的高度优化的多供应商库。每个库的标准原语不仅可以提升 CPU 代码,还可以扩展到几乎所有工作负载和框架的多种架构领域。
有哪个开发者真的想要三套不同的库、编译器和调试器?
很可能不是。
oneAPI 提高了效率,因为开发人员不再需要仅仅因为拥有异构环境而浪费时间学习新工具。
所有这些新的 oneAPI 工具中最好的部分是什么?它们可以免费使用,并且由一个多供应商组织支持,以帮助确保跨架构的开放性。
获取软件
通过下载您需要的软件(可能全部都需要)来利用本文中的所有软件。
- Intel® oneAPI Base Toolkit,一套基础工具(15 个且仍在增加),包括编译器、库、语言、框架、分析和调试器——用于创建跨架构应用程序。
- Intel® AI 分析工具包,帮助开发人员实现数据科学(AI/ML/DL)工作负载的端到端性能。
在云中获取新 Intel® 技术 Beta 版访问权限
如果您想在云中探索这些工具,请注册一个 Intel® Developer Cloud 账户——一个免费的开发沙箱,可以访问最新的 Intel® 硬件和 oneAPI 软件。
从现在开始,经过批准的开发人员和客户可以提前几个月到一年不等的时间访问英特尔技术(通常在产品可用性之前),并在英特尔增强的、基于云的服务平台上进行试用、测试和评估。
Beta 试用包括新的和即将推出的英特尔计算和加速器平台,例如:
- 第 4 代 Intel® Xeon® 可扩展处理器(Sapphire Rapids)
- 具有高带宽内存 (HBM) 的 Intel® Xeon 第 4 代处理器
- 代号为 Ponte Vecchio 的 Intel® 数据中心 GPU
- Intel® 数据中心 GPU Flex 系列
- Intel® Xeon® D 处理器(Ice Lake D),
- Habana® Gaudi®2 深度学习加速器
需要注册和预审。
访问 cloud.intel.com 开始。
结论
支持构建异构环境应用程序的工具和库的需求正在增加。Intel oneAPI 工具和规范为开发人员提供了一个编程模型,支持跨不同架构的代码重用,以及针对常见并行工作负载的高度优化的库。
这最终提高了应用程序和开发人员工作流程的效率。开发人员可以编写一次代码,并知道它可以根据价格、可用性和性能要求在不同的架构上运行。
并行编程现在在同构系统中已无处不在,而逻辑上的下一步是将其扩展到异构系统。这只能通过像 oneAPI 这样的工具来实现,这些工具提供了远离不同架构复杂性的抽象层。
相关内容
点播网络研讨会
- 一步启动加速的跨平台 AI 工作负载
监视 - 在异构工作负载上比较 CPU、GPU 和 FPGA 的优势
监视 - 迁移到新的 Intel® oneAPI DPC++/C++ 编译器
监视 - DPC++ 编程入门
监视
文章
- oneAPI 中不断扩展的语言和加速器支持
读取 - 使用 oneDPL 进行更具生产力和性能的 C++ 编程
读取 - 开放 DPC++ 扩展补充 SYCL* 和 C++
读取 - 异构处理需要数据并行化
读取
获取软件
Intel® oneAPI Base Toolkit
使用这套核心工具和库开始构建跨不同架构的高性能、以数据为中心的应用程序。