65.9K
CodeProject 正在变化。 阅读更多。
Home

SYCL与CUDA

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2022 年 2 月 8 日

CPOL

7分钟阅读

viewsIcon

2622

在本文中,我们将比较和对比 SYCL 和 CUDA,介绍 oneAPI,并讨论 oneAPI 编译器如何与 SYCL 协同工作。

随着摩尔定律的逐渐终结,并行编程应运而生。二十一世纪的进步带来了需要更多计算能力的复杂问题,但物理和实际限制阻碍了计算机硬件的进一步重大改进。

因此,重点已从硬件转向软件。并行编程模型是通过更有效地利用硬件来提高性能的一种方式。这种方法利用了现有异构架构,并显著增强了计算密集型应用程序的性能。让我们比较两种并行编程选项:CUDA 和 SYCL。

CUDA

计算统一设备架构 (CUDA) 平台是一个用于通用计算的并行计算平台和编程模型。CUDA 使开发人员能够利用图形处理单元 (GPU) 的强大功能来加速应用程序。

此方法将计算负载分配到中央处理单元 (CPU) 和 GPU 之间。NVIDIA 为其 GPU 开发了 CUDA,并使用 CUDA C 进行编程。

SYCL

另一个并行编程平台是 SYCL,它比 CUDA 具有多项优势。SYCL 是一个单源、标准 C++ 编程模型。它不同于 CUDA,CUDA 需要单独的源代码文件并使用派生的 C++ 进行编程。

SYCL 允许开发人员使用用标准 C++ 编写的单一代码支持各种设备,包括 CPU、GPU 和现场可编程门阵列 (FPGA)。它是一个独立于平台的编程模型,没有供应商锁定。

由于可用处理器异构性不断增长,SYCL 因其灵活性和独立性而变得越来越重要。相比之下,CUDA 仅适用于 NVIDIA 系统。

SYCL 提供了一个抽象层,允许异构处理器的代码位于单个源文件中,而不是单独的主机和内核文件中。

市场上提供多种 SYCL 实现。一种由英特尔主导的 SYCL 实现是 oneAPI。oneAPI 规范是一个开放的、基于标准的统一编程模型,可在多种架构上提供相同的开发人员体验。

DPC++ 是 oneAPI 的主要语言。它基于 SYCL,为 CPU 和加速器提供数据并行和异构编程以实现高性能。DPC++ 基于传统的 C 和 C++ 构造。OneAPI 旨在简化编程并允许在硬件平台之间重用源代码,同时支持独特的加速器调整。

SYCL 与 CUDA 比较

SYCL 和 CUDA 的目的相同:通过在各种架构中并行化处理来提高性能。然而,SYCL 提供了比 CUDA 更好的功能,同时简化了编码过程。

SYCL 使开发人员能够使用 ISO C++ 进行编程,而不是使用复杂的语法。CUDA 使用专门开发的语法,称为 CUDA C,并且不提供代码重用。与 CUDA 不同,SYCL 是一种纯 C++ 领域特定嵌入式语言,不需要 C++ 扩展,从而允许简单的 CPU 实现,该实现依赖于纯运行时而不是特定的编译器。

使用 SYCL 比使用 CUDA 更容易。例如,考虑 CUDA 和 SYCL 语言之间的差异。SYCL 包含标准 ISO C++ 构造。CUDA 使用专门设计的 CUDA C。SYCL 编程不需要任何其他语言扩展,从开发人员的角度来看,这是一个很大的便利。

SYCL 在可编程性方面是 CUDA 的有力替代品,创建内核所需的代码行更少,对关键 API 函数的调用频率也更低。此外,开发应用程序不需要复杂的工具链,并且工具生态系统随时可用,确保了无忧的开发体验。SYCL 代码也比 CUDA 更高级,并提供代码清晰度和可读性。

SYCL 比 CUDA 具有广泛的优势。SYCL 不需要单独的源文件。相反,您可以在同一个源文件中找到主机和设备的代码。SYCL 实现的责任是将 C++ 源文件拆分并将解析代码的每个部分转发到适当的编译后端。

SYCL 也是供应商无关的。SYCL 实现的代码几乎可以在任何平台上执行,从 CPU 到加速服务器。通过泛化和引入额外的 API,SYCL 已发展成为一种可以针对各种硬件的高级编程模型。它支持泛型编程和后端特定优化。

与 CUDA 不同,SYCL 通过为标准构建块提供一组接口来尝试解决架构互操作性的挑战。您可以针对多个制造商和目标平台优化这些块。oneAPI 计划使用 SYCL 提供了一个具有统一接口的应用程序平台,您可以在各种平台上实现该平台。只需将跨越各种构建块的众多库与标准编程风格结合起来即可。

广泛的研究和实验表明,基于 SYCL 的应用程序的性能与 CUDA 相当。如果存在性能差距,主要是由于特定的供应商相关增强和校准,那么这种差距正在迅速缩小。与可移植性和可重用性的便利性相比,这种性能差距似乎并不重要。SYCL 的快速采用最终将导致最佳性能,因为独立的并行运行算法和针对各种硬件的代码路径将变得可用。

与 CUDA 不同,CUDA 架构必须完全相同,我们只需要指定我们读写的意图,SYCL 运行时就会弄清楚它必须传输到和传输自哪些主机容器。SYCL 命令队列必须是异步的,虽然实际执行顺序未知,但运行时会满足内核之间的数据依赖性。

性能可移植性是 SYCL 的一个优先事项。然而,由于大多数性能可移植性都用于为此目的而构建的低级构建块,因此需要考虑各种架构。使内核适应新的硬件平台必须尽可能简单、方便和无痛。

使用 DPC++ 从 CUDA 迁移到 SYCL

CUDA 在并行编程和图形处理单元通用计算 (GPGPU) 领域建立了垄断地位。由于行业已习惯使用 CUDA,即使存在固有的供应商锁定和更高的运营成本,您可能认为由于代码不兼容而无法从 CUDA 迁移到 SYCL。但是,SYCL 提供了一种解决方案,当您希望转移到 SYCL 但由于已经完成的 CUDA 遗留代码而无法转移时。

基于 SYCL 的 OneAPI 提供了一个兼容性工具,可帮助将基于 CUDA 的代码传输到基于 SYCL 的数据并行 C++ (DPC++) 编程语言。DPC++ 编程语言通常被称为 C++ with C++ SYCL,是 oneAPI 环境的核心。

由于 OneAPI 基于 SYCL 编程模型,因此使用 DPC++ 将 CUDA 代码转换为 SYCL 涉及将代码转换为 SYCL。DPC++ 工具生成人类可读的代码,并保留原始代码中的原始标识符。转换工具还检测并将标准 CUDA 索引计算转换为 SYCL。

兼容性工具修改与 CUDA 相关的代码,并保持其余代码不变。因此,您只需要进行少量手动更改即可创建可运行的应用程序。此外,修改后的元素仍然是人类可读的,因此易于检查。

结论

SYCL 是一个免版税、跨平台的抽象层,使开发人员能够使用 ISO C++ 为异构处理器编写代码。应用程序的主机和内核代码位于同一个源文件中。

SYCL 已发展成为一种可以针对各种硬件的高级编程模型。SYCL 在功能方面优于 CUDA,并加快了编码过程。在可编程性方面,SYCL 是 CUDA 的可行替代方案,生成内核所需的代码行更少,对关键 API 函数的调用频率也更低。

用 SYCL 编写的代码几乎可以在任何平台上运行,从 CPU 到加速服务器。基于 SYCL 的 OneAPI 是一个用于将基于 CUDA 的代码传输到基于 SYCL 的 DPC++ 编程语言的兼容性工具。

尽管 SYCL 相对于 CUDA 的优势会自动促使您尝试 SYCL,但我们强烈建议您熟悉基于 SYCL 的 oneAPI,以更好地实现 SYCL 模型。OneAPI 倡议旨在开发一种可移植且与供应商无关的行业标准。高性能计算 (HPC) 领域的行业领导者、AI 发明者、硬件供应商和原始设备制造商 (OEM) 以及大学都对 SYCL 表现出浓厚的兴趣并纷纷加入。亲自尝试 oneAPI,体验其中的不同。

© . All rights reserved.