比较编程模型:SYCL和CUDA





5.00/5 (1投票)
在本文中,我们将比较和对比 SYCL 和 CUDA,并讨论 oneAPI 编译器如何与 SYCL 协同工作。
为了从现代异构系统中获得最佳性能,开发人员需要使用 CPU 和加速器进行并行编程。二十一世纪工作负载的进步带来了需要更强计算能力的复杂问题,但硬件并不总能跟上这些加速增长的需求。
即使硬件能够带来性能提升,软件也可能催生新的需求,或者工作负载可能更适合其他硬件。开发人员希望利用市场上硬件的多样性,但某些软件是为特定硬件编写的,这限制了其跨平台扩展的能力。因此,焦点已从硬件转移到软件。
并行编程模型是通过更有效地使用硬件来提高性能的一种方法,并且需要扩展它们以支持 CPU 和加速器的组合。这种方法利用了现有的异构架构,并显著增强了计算密集型应用程序的性能。
让我们比较两种并行编程方案:CUDA 和 SYCL。
NVIDIA CUDA
计算统一设备架构(CUDA)平台是 NVIDIA 专有的用于通用计算的并行计算平台和编程模型。CUDA 使开发人员能够利用图形处理单元(GPU)的强大功能来加速应用程序。
SYCL
SYCL 是一种单一源、标准的 C++ 编程模型。SYCL 并行编程平台是 CUDA 的替代方案,具有多项优势。
与 CUDA 这种仅用于 NVIDIA 硬件的专有语言不同,SYCL 允许开发人员支持各种设备,包括 CPU、GPU 和现场可编程门阵列(FPGA)。SYCL 通过使用以标准 C++ 编写的单一代码库来实现这一点。
为了支持异构系统编程,SYCL 强调在没有任何供应商偏好的情况下良好地支持多种架构。根据 Evans Data 的一项调查,40% 的开发人员的目标是使用一种以上处理器、处理器核心或协处理器的异构系统1。
SYCL 提供了一个抽象层,允许异构处理器的代码存在于单个源文件中,而不是分离的主机和内核文件。
市场上有多种 SYCL 编译器
- Data Parallel C++ (DPC++)
- ComputeCpp
- HipSYCL
- triSYCL
- neoSYCL
流行的 C++ 和 SYCL DPC++ 编译器受到 Intel® oneAPI 的青睐。oneAPI 是一个开放、基于标准的统一编程模型,可在多种架构上提供简单且相同的开发体验。SYCL 为 CPU、GPU、FPGA 和其他上市的加速器提供数据并行和异构编程以实现高性能。
SYCL 基于标准的 C++ 结构。oneAPI 旨在简化编程,并允许源代码在不同硬件平台间重用,同时支持独特的加速器调整。
比较 SYCL 和 CUDA
SYCL 和 CUDA 的目的一样:通过在不同架构中进行处理并行化来提高性能。然而,SYCL 提供了比 CUDA 更强的可扩展性和代码灵活性,同时简化了编码过程。
SYCL 不使用复杂的语法,而是让开发人员能够使用 ISO C++ 进行编程。与 CUDA 不同,SYCL 是一种纯 C++ 领域特定嵌入式语言,不需要 C++ 扩展,从而允许简单的 CPU 实现,依赖于纯运行时而不是特定的编译器。
在可编程性方面,SYCL 是 CUDA 的一个有竞争力的替代方案。使用 SYCL,开发应用程序不需要复杂的工具链,并且工具生态系统随时可用,确保了无忧的开发体验。
SYCL 不需要为主机和设备分别设置源文件。相反,您可以在同一个 C++ 源文件中找到主机和设备的代码。SYCL 的实现能够分割此源文件,解析代码,并将其发送到适当的编译后端。
如前所述,SYCL 是供应商无关的。它为开放性和供应商独立性而构建。SYCL 代码几乎可以在任何平台上执行,从 CPU 到加速服务器。通过泛化和引入额外的 API,SYCL 已演变为一种可以面向多种硬件的高级编程模型。它支持泛型编程和后端特定的优化。
与 CUDA 不同,SYCL 试图通过为标准构建块提供一组接口来解决架构互操作性的挑战。您可以为多个制造商和目标平台优化这些块。作为 SYCL 的一种实现,oneAPI 计划提供了一个具有统一接口的应用程序平台,您可以在各种平台上实现。只需将跨越各种构建块的众多库与标准编程风格相结合即可。
根据 2021 年的一项性能研究,该研究分析了在 Tesla V100 GPU 上使用 SYCL 和 CUDA 的 GPU 应用程序2,很明显,SYCL 在大多数方面的性能与 CUDA 相当。然而,SYCL 应用程序因其可移植性而为开发带来了优势:一个编写好的 SYCL 应用程序可以在多种设备上运行,而这在使用 CUDA 时是不可能的。由于其可移植和一次编写的特性,SYCL 应用程序在开发上具有成本效益。
在使用 SYCL 时,我们只需指明读写意图,运行时就能确定必须在主机容器之间传输哪些缓冲区。SYCL 命令队列必须是异步的,虽然实际执行顺序未知,但运行时会满足内核之间的数据依赖关系。
性能可移植性是 SYCL 的一个优先事项。然而,由于大多数性能可移植性是为为此目的构建的较低级构建块而设计的,因此需要考虑各种架构。将内核适配到新的硬件平台必须尽可能简单、方便且轻松。
从 CUDA 迁移到 SYCL
CUDA 在并行编程和图形处理单元通用计算(GPGPU)领域已经建立了垄断地位。由于业界已习惯于使用 CUDA,即使存在固有的供应商锁定和较高的运营成本,您可能会认为由于代码不兼容,从 CUDA 迁移到 SYCL 是不可能的。然而,当您希望迁移到 SYCL 但因为已经完成的 CUDA 遗留代码而无法迁移时,SYCL 提供了一种解决方法。
oneAPI 兼容性工具有助于将基于 CUDA 的代码迁移到 SYCL。该兼容性工具生成人类可读的代码,并保留原始代码中的标识符。该工具还检测标准 CUDA 索引计算并将其转换为 SYCL 形式。
兼容性工具修改与 CUDA 相关的代码,并保留其余部分不变。因此,您只需进行少量手动更改即可创建一个可运行的应用程序。此外,修改后的元素仍然是人类可读的,因此易于检查。
结论
SYCL 是一个免版税、跨平台的抽象层,使开发人员能够使用 ISO C++ 为异构处理器进行编码。应用程序的主机和内核代码位于同一个源文件中。
SYCL 已演变为一种可以面向多种硬件的高级编程模型。SYCL 在功能上优于 CUDA,并加快了编码过程。在可编程性方面,SYCL 是 CUDA 的一个可行替代方案,生成内核所需的代码行数更少,调用关键 API 函数的频率也更低。
用 SYCL 编写的代码几乎可以在任何平台上运行,从 CPU 到加速服务器。oneAPI 兼容性工具有助于将基于 CUDA 的代码迁移到 SYCL,从而扩展了开发人员的选择。
如果 SYCL 相对于 CUDA 的优势激励您尝试一下 SYCL,我们敦促您熟悉 oneAPI,以便更好地实施 SYCL 模型。oneAPI 计划旨在开发一种可移植且与供应商无关的行业标准。高性能计算(HPC)领域的行业领导者、人工智能发明家、硬件供应商和原始设备制造商(OEM)以及大学都对 SYCL 产生了浓厚兴趣并纷纷加入。您可以亲身试用 oneAPI 来体验其中的差异。
资源
- SYCL 学院
- IWOCL
- 线上活动:IWOCL and SYCLon 2022
- oneAPI.io
- SYCL 书籍 (作者:James Reinders 等人)
- Intel oneAPI 工具包
脚注
1Evans Data 全球开发调查 2020 年第 2 卷
2G. K. Reddy Kuncham, R. Vaidya and M. Barve, "Performance Study of GPU applications using SYCL and CUDA on Tesla V100 GPU," 2021 IEEE High Performance Extreme Computing Conference (HPEC), 2021, pp. 1-7, doi: 10.1109/HPEC49654.2021.9622813.