SYCL 实现快速指南
对不同 SYCL 实现的高层次概览
将应用程序工作负载的一部分卸载到专用加速器已成为一种常见的优化实践。例如,开发人员为了提高效率,会在 GPU 上渲染照片级真实感的图形。这一趋势推动了传统计算向异构系统的发展。
然而,在异构系统中优化工作负载通常需要开发人员学习无数特定于硬件的库和编程语言。因此,他们可以从一个抽象层中受益匪浅,该抽象层可以在不重写代码的情况下将应用程序部署到异构系统上。这正是 SYCL*(发音为“sickle”)规范所要实现的。
什么是 SYCL?
它是一个跨平台抽象层,允许算法在 CPU、GPU 和 FPGA 等硬件加速器之间切换,而无需更改一行代码。SYCL 是由 Khronos Group 开发的免版税开放标准,它允许开发人员使用标准 C++ 编写异构体系结构。此外,其编程模型采用单一源,允许主机和内核代码都写在同一个源文件中。
SYCL 的流行催生了各种不同的实现,例如:
- ComputeCpp*
- Open SYCL (前身为 hipSYCL)
- neoSYCL
- triSYCL
- Intel® oneAPI 工具
本文将对这些实现进行高层次的概述,展示具体的用例来演示关键功能和独特特性,以帮助开发人员为应用程序选择理想的 SYCL 实现。
热门 SYCL 实现概览
由于各种 SYCL 实现倾向于遵循相似的规范,因此代码无论选择哪个实现都应该能够成功编译和运行。但是,由于它们的发展速度不同、关注的体系结构不同,或者与最新的 SYCL 规范有所偏离,因此它们并非都提供相同的功能。需要注意的是,所有实现都支持在最流行的现有体系结构上通过 CPU 执行。
让我们探讨每种实现的优势、它们支持的体系结构以及从开发人员的角度来看它们的主要优点。
Codeplay ComputeCpp*
ComputeCpp* 是 Codeplay 开发和维护的符合 SYCL 1.2.1 标准的实现。它提供社区版以促进 SYCL 生态系统的扩展,而对于更高级的用户,则有专业版提供额外功能,例如:
- 离线内核编译
- 程序执行跟踪
- 多二进制支持
- 其他开发工具
- 帮助台开发人员支持
ComputeCpp 支持许多兼容 OpenCL™ 的硬件,例如 Intel® CPU、GPU 和 FPGA;AMD GPU(有一定限制);Arm Mali*;IMG(前身为 PowerVR);以及通过并行线程执行 (PTX) 支持的 Renesas R-Car*。Codeplay 还在努力采用最新的 SYCL 2020 规范功能。此 列表 显示了 ComputeCpp v2.11.0 中当前可用的功能。
总而言之,ComputeCpp 是一个成熟的 SYCL 实现,面向广泛的加速器。官方仓库提供了构建和运行软件开发工具包 (SDK) 示例的分步指南,并提供了将 ComputeCpp 与现有应用程序集成的指南。
要了解更多关于 ComputeCpp 的信息,请查阅该公司的 代码示例。
Open SYCL
Open SYCL 实现是 SYCL 2020 的现代版本,并支持较旧的 SYCL 1.2.1 功能,但存在一些限制。Open SYCL(前身为 hipSYCL)源自海德堡大学的学术研究。它不使用 OpenCL,而是依赖现有的编译器工具链,例如 CUDA 支持 NVIDIA 设备,以及 AMD 的异构接口(HIP)。它尚未成为完全符合 SYCL 的实现,但其对 NVIDIA 和 AMD 硬件的成熟支持使其成为高性能计算的可靠选择。此外,它支持使用 OpenMP* 的任何 CPU,以及使用 oneAPI Level Zero 和 SPIR-V 的 Intel GPU,但这仍处于高度实验阶段。
Open SYCL 的价值在于它将多个工具链聚合到一个 SYCL 接口下。这使得开发人员可以在同一个源文件中与混合的 CUDA 和 HIP 代码一起编译 SYCL 代码。Open SYCL 实现最初是一个业余项目,现在已成熟,并作为一个研究平台来实施新功能和改进现有功能。
有关更多详细信息,请查看 Open SYCL 的官方仓库。
neoSYCL
neoSYCL 实现是唯一支持 NEC SX-Aurora TSUBASA* (SX-AT) 体系结构的实现。SX-Aurora 具有一个矢量引擎,neoSYCL 利用该引擎自动加速应用程序管道的某些部分。此实现基于 LLVM 和 Clang 基础设施,并允许用户编写现代 C++ 代码。neoSYCL 的当前实现支持 SYCL 1.2.1 规范的大部分核心功能。但是,它不支持 OpenCL 特有的功能,例如图像支持。Takizawa 实验室的开发人员计划将 neoSYCL 扩展到 NVIDIA 和 AMD GPU 以及 FPGA 等不同体系结构。
简而言之,neoSYCL 仅专注于 SX-Aurora TSUBASA 体系结构。虽然目前这可能会限制其范围,但 neoSYCL 是一个年轻的开发项目,可以为 SYCL 生态系统带来很多东西。
如果您想了解更多细节,请查看这篇 研究论文。
triSYCL
triSYCL 实现最初是 AMD 的一个开源研究项目,现在主要由 Xilinx 提供资金。目前,此 SYCL 1.2.1 规范的实现尚不完整且处于实验阶段。但是,它已被用于为 SYCL 1.2、1.2.1、2.2 和 2020 提供反馈,并且它基于现代 C++20,这使其对开发人员具有吸引力。triSYCL 实现的目标是 Xilinx FPGA 体系结构和 Versal 高级计算加速平台 (ACAP*) 粗粒度可重构阵列。因此,对于专注于 Xilinx 器件编译器,triSYCL 是理想选择。此外,triSYCL 使用 OpenMP 支持 CPU,并使用 OpenCL、SPIR 或 LLVM 支持更多加速器。目前还有将 oneAPI 的 SYCL 实现与 triSYCL 合并的工作。
相反,单一源编译模型可能对 FPGA 有益,可以缩短编译时间。triSYCL 社区还为 SYCL 社区提供了关于新规范的建设性反馈。此外,此实现专注于其他实现不支持的特定硬件。但是,值得注意的是,它完全是一个研究和开发项目——测试可能有助于 SYCL 生态系统的新功能和想法——而不是为了最终的“生产”发布。
查看这个 代码示例 以了解更多信息。
Intel® oneAPI 工具
oneAPI 是一个用于异构编程的跨行业规范,它在 Intel® oneAPI DPC++ 库 (oneDPL) 中实现了 Khronos SYCL 2020 标准。它是 oneAPI DPC++/C++ 编译器的伴侣。其 API 可以理解为现代 C++ 和 SYCL 的结合,用于有效编程异构体系结构。除了 SYCL,oneAPI 还包括额外的工具和特定库,使新开发人员更容易充分利用 SYCL 的潜力。
Intel® oneAPI Base Toolkit 包括优化的库和高级工具,例如 Intel® DPC++ Compatibility Tool 和 SYCLomatic,后者可以将 CUDA 代码转换为 SYCL。它还提供用于分析和调试代码的工具,同时提高生产力。查看将功能性 CUDA 实现转换为 SYCL 的实践演示。
oneAPI DPC++ 编译器 基于 LLVM 编译器,这加快了编译时间。它使用 Clang,它为 C、C++、Objective-C 和 Objective-C++ 编程语言提供了一个前端,与最新标准兼容。借助 SYCL 和硬件抽象层翻译插件,生成的代码可以用于不同供应商的 CPU、GPU 和 FPGA。
Intel 积极为 LLVM 和 Clang 贡献特定优化,以充分利用 Intel 的最新体系结构。因此,Intel 的编译器在专有体系结构上的性能应优于基础 LLVM 加 Clang 编译器。(例如,与大多数其他 SYCL 实现相比的一个有趣区别是,Codeplay 的 Nvidia GPU 版 oneAPI 实现直接针对该公司硬件,而不通过 OpenCL。但是,ComputeCpp 使用 OpenCL 和 PTX 为 NVIDIA GPU 提供实验性支持。)
Intel 的实现不断完善 oneAPI 规范,以满足新的行业标准。因此,SYCL 2020 规范中的一些关键功能源自 oneAPI 和 oneDPL。这种差异使得 oneDPL 中表达的 oneAPI SYCL 成为最终用户在加速计算新时代中关注性能的最可行 SYCL 实现。
结论
目前有各种 SYCL 实现可供选择,使开发人员能够充分利用异构系统。一些实现,例如 triSYCL 和 neoSYCL,仍然缺乏满足某些行业标准的基本功能。但是,开发人员可能希望考虑它们,因为它们针对特定硬件。
更成熟的实现,例如 Codeplay ComputeCpp 和 DPC++(oneAPI 的 SYCL 实现),提供了更多功能。DPC++ 处于创新前沿,并不断整合最终成为最新 SYCL 规范一部分的新功能。它还提供了 SYCLomatic 和 Intel DPC++ Compatibility Tool 等高级工具,可简化从 CUDA 到 SYCL 的迁移以及 GPU 供应商的灵活性。
尝试 Intel® oneAPI Base Toolkit,看看它在性能上能带来怎样的不同!
获取软件
获取独立版本的 Intel DPC++ Compatibility Tool,或作为 Intel® oneAPI Base Toolkit 的一部分——该工具包是一套核心工具和库,用于在各种体系结构上开发高性能、以数据为中心的应用程序。