CUDA vs OpenCL: GPU 编程该用什么?

Blog
Author:
Dori ExtermanDori Exterman
Published On:
6月 7, 2021
Estimated reading time:
1 minutes

近年来,图形处理器(Graphic Processing Units)或 GPU 已成为高性能计算程序必可不少的一部分,帮助推动进程处理。GPGPU Programming 使用图形处理器(GPU)进行通用计算。原本仅由 CPU 处理的计算问题,由 GPU   CPU(中央处理器)共同分担,加速应用程序开发。从加速视频、数字图像、音频信号处理、游戏制造、神经网络和深度学习,GPU 编程发展迅猛,目前几乎已覆盖全行业。

GPGPU 编程的原理,是在不同的处理器之间划分多个进程或单个进程,以加快完成速度。GPGPU 利用 OpenCL CUDA 等软件框架中的加速软件中,让工作更快、更轻松。GPU 借助数百个片上处理器核,实现并行计算。这些多核处理器互相通信和协作,解决复杂的计算问题。

CUDA vs OpenCL——两种不同的 GPU 计算工具,尽管部分功能相似,但是本质上其编程接口不同。

CUDA 是什么?

CUDA 是统一计算设备架构(Compute Unified Device Architecture)的代表,这个架构是 NVIDIA 2007 年发布的并行编程范例。CUDA 使用类 C 语言,用于开发图形处理器软件和大量 GPU 通用应用程序,这些应用程序本质上是可以高度并行开发。

CUDA 是一种专有 API,因此仅支持基于 Tesla 体系结构的 NVIDIA GPUCUDA 适用于 GeForce 8 系列、Tesla Quadro 等显卡。CUDA 编程范例是串行和并行执行的组合,包含一个 kernel 的特殊 C 函数。这个函数可在显卡上并发执行固定数量的线程(更多 CUDA 的相关内容)。

什么是 OpenCL?

OpenCL 是开放计算语言的缩略词,由苹果公司和 Khronos 集团推出,旨在为异构计算提供一个基准,突破 NVIDIA GPU 的限制。OpenCLGPU编程提供了一种可移植语言,使用了 CPUGPU、数字信号处理器等。这种可移植语言用于设计程序或应用程序,让程序具有足够的通用性,可以在迥异的体系结构上运行,同时保持足够的适应性,提升每个硬件平台的性能。

OpenCL 提供可移植程序,同时这些程序不会因生产设计厂商或设备不同而发生障碍,因此这些程序能够在各种不同的硬件平台上进行加速。OpenCL C 语言是 C99 语言的限制版本,可进行扩展,并在不同设备上执行数据并行代码。

CUDA OpenCL 对比

性能

OpenCL GPU 编程提供了一种可移植语言,可在不同的并行设备中顺畅转换。但由于大多数设备功能集差别很大,因此代码不一定能在所有设备上运行。为了使代码在多个设备上运行,同时避免受限于供应商的扩展,必须采取一些其他补救措施。与 CUDA kernel 不同,OpenCL kernel 可以在运行时编译,这将增加 OpenCL 的运行时间。然而,另一方面,这种即时编译可以充分利用 GPU 的能力,让编译器生成更好的代码。

CUDA 的开发公司,也是开发其执行功能的硬件设备的公司,这也是大家对其 GPU 计算性能匹配性期待更高的原因,相应地,也希望它能在功能和性能更加优越。

然而,就性能而言,编译器(最终是程序员)是加速接口运行的主要原因,因为两者都可以充分利用硬件。性能取决于一些变量,如代码质量、算法类型和硬件类型。

可实行的供应商

截至本文撰写之时,执行 CUDA 的供应商只有一家,即其所有者 NVIDIA

然而,OpenCL 可由众多供应商实现,包括(但不限于):

  • AMD:  可支持 IntelAMD 芯片和 GPU.
  • 支持 Radeon 5xxx6xxx7xxx 系列、R9xxx 系列
  • 所有 CPU 仅支持 OpenCL 1.2
  • NVIDIA:  支持 NVIDIA GeForce 8600M GT, GeForce 8800 GT, GeForce 8800 GTS, GeForce 9400M, GeForce 9600M GT, GeForce GT 120, GeForce GT 130, ATI Radeon 4850, Radeon 4870 等等。
  • Apple :仅支持 MacOS X
  • 支持 Host CPU 计算设备
  • CPUGPU“MIC” (Xeon Phi)

可移植性

这可能是两者公认的最大区别,因为 CUDA 仅在 NVIDIA GPU 上运行,而OpenCL是一个开放的行业标准,可在 NVIDIAAMDIntel 等硬件设备上运行。OpenCL 还提供了 CPU fallback  功能,因此代码维护更容易。对比之下, CUDA 无法进行 fallback ,因此开发人员需要在代码中加入 if 语句,帮助区分 GPU 设备是否处于运行时。

开源 vs 商业

CUDA OpenCL 另一个很大的区别是 OpenCL 开源的,CUDA NVIDIA 的特有框架。这个差异各有利弊,与你选择的程序有关。

一般来说,如果你的应用程序既支持 CUDA 又支持 OpenCL,那么建议CUDA。因为在这种情况下,CUDA 性能更好,这是源于 NVIDIA 最高质量支持。如果某些应用程序基于 CUDA,而其他应用程序支持 OpenCL,则最新的 NVIDIA 显卡将帮助您充分利用支持 CUDA 的应用程序,同时在非 CUDA 应用程序中具有良好的兼容性。

但是,如果您选择的所有应用程序都支持 OpenCL,那么也就不用纠结了。

支持多种操作系统

CUDA 能够在 WindowsLinux MacOS 上运行,但只能使用 NVIDIA 硬件。然而,OpenCL 几乎可以在任何操作系统和大多数硬件品种上运行。比较操作系统的支持度时,主要的决定因素仍然是硬件,因为 CUDA 能够在个别领先的操作系统上运行,而 OpenCL 几乎可以在所有操作系统上运行。

硬件的区别才是真正值得比较的地方。CUDA 只要求使用 NVIDIA 硬件,而OpenCL 不要求使用硬件。这种区别各有利弊。

库资源

库是 GPU 计算的关键,因为可以访问一些函数,这些函数已经经过了微调,可进行数据并行化。CUDA 的库资源非常强大,包含高性能数学例程的模板和免费原始数学库:

  • cuBLAS – Complete BLAS Library
  • cuRAND – Random Number Generation (RNG) Library
  • cuSPARSE – Sparse Matrix Library
  • NPP – Performance Primitives for Image & Video Processing
  • cuFFT – Fast Fourier Transforms Library
  • Thrust – Templated Parallel Algorithms & Data Structures
  • h – C99 floating-point Library

OpenCL 有一些替代产品,很容易构建,且近几年已慢慢发展成熟,如  ViennaCL。但目前还没有可与 CUDA 库竞争的产品。AMD OpenCL 库还有另一个优势,它不仅可以在 AMD 设备上运行,还可以在所有 OpenCL 兼容的设备上运行。

社区

CUDA-vs-OpenCL-Community

社区也是值得比较的内容,包括每个框架的兼容性、寿命、义务等。这些东西很难衡量,不过我们可以看看论坛,衡量一下社区的活跃度。NVIDIA 的 CUDA 论坛上,主题数量远超过 AMD 的 OpenCL 论坛。然而,近年来 OpenCL 论坛的主题不断增加,而且 CUDA 本身发展就比较长。

技术性

使用 CUDA,开发者可使用 C C++ 编写软件,因为它只是一个平台和编程模型,而不是语言或 API。因此,用户可以使用 CUDA 关键字实现并行化。

与之相反,OpenCL 不支持 C++ 代码编写。不过,它提供了类 C 语言的工作环境,用户可以直接利用 GPU 资源。

CUDA vs. OpenCL 对比表

对比 CUDA OpenCL
性能 无明显优势,主要受代码质量、硬件类型和其他变量影响 无明显优势,主要受代码质量、硬件类型和其他变量影响
供应商实现 仅由 NVIDIA 实现 可由大量供应商实现,如AMD, NVIDIA, Intel, Apple, Radeon等等
可移植性 只能在 NVIDIA 硬件中运行 可以移植到各种其他硬件,除了供应商特定的扩展
开源 vs 商业 NVIDIA 的专有框架 开源标准
OS 支持 仅支持个别领先的操作系统,但必须使用 NVIDIA硬件 与各种开源系统兼容
库资源 具有丰富的高性能库 很多库可以在所 OpenCL 兼容的硬件上使用,但没有 CUDA 那么广泛
社区 社区资源庞大 社区资源正在增长,但比不上 CUDA 社区
技术性 不是一种语言,而是一种使用 CUDA 关键字实现并行化的平台和编程模型 不允许使用 C++ 编写代码,而是提供了类 C 语言编程工作环境

如何选择

使用 GPU,计算能力和程序都将受益匪浅。目前来说,CUDA OpenCL 都是领先的框架。CUDA 作为一个专有的 NVIDIA 框架,无法像 OpenCL 那样支持多种多样的多应用程序,但 CUDA 对于性能的提升也是不容小觑的。虽然 OpenCL 的兼容范围更广,但 CUDA 对其支持产品的能力提升更强。

尽管支持 CUDANVIDIA GPU(较新版本)的 OpenCL 性能也相当强大。一般的经验是,实际操作中,如果绝大多数应用程序和硬件都支持 OpenCL,那么 OpenCL 将是首选。

无论你决定使用什么,Incredbuild 都可全马力加速编译测试速度,覆盖内容创建、机器学习、信号处理等大量计算密集型工作进程。MediaPro 就是一个案例,事实证明,Incredbuild 有效将其编译和测试进程大幅提速(在本例中,速度提高了 6 倍以上)。

Pipeline