近年来,图形处理器(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 GPU。CUDA 适用于 GeForce 8 系列、Tesla 和 Quadro 等显卡。CUDA 编程范例是串行和并行执行的组合,包含一个 kernel 的特殊 C 函数。这个 C 函数可在显卡上并发执行固定数量的线程(更多 CUDA 的相关内容)。
什么是 OpenCL?
OpenCL 是开放计算语言的缩略词,由苹果公司和 Khronos 集团推出,旨在为异构计算提供一个基准,突破 NVIDIA GPU 的限制。OpenCL为GPU编程提供了一种可移植语言,使用了 CPU、GPU、数字信号处理器等。这种可移植语言用于设计程序或应用程序,让程序具有足够的通用性,可以在迥异的体系结构上运行,同时保持足够的适应性,提升每个硬件平台的性能。
OpenCL 提供可移植程序,同时这些程序不会因生产设计厂商或设备不同而发生障碍,因此这些程序能够在各种不同的硬件平台上进行加速。OpenCL C 语言是 C99 语言的限制版本,可进行扩展,并在不同设备上执行数据并行代码。
CUDA 与 OpenCL 对比
性能
OpenCL 为 GPU 编程提供了一种可移植语言,可在不同的并行设备中顺畅转换。但由于大多数设备功能集差别很大,因此代码不一定能在所有设备上运行。为了使代码在多个设备上运行,同时避免受限于供应商的扩展,必须采取一些其他补救措施。与 CUDA kernel 不同,OpenCL kernel 可以在运行时编译,这将增加 OpenCL 的运行时间。然而,另一方面,这种即时编译可以充分利用 GPU 的能力,让编译器生成更好的代码。
CUDA 的开发公司,也是开发其执行功能的硬件设备的公司,这也是大家对其 GPU 计算性能匹配性期待更高的原因,相应地,也希望它能在功能和性能更加优越。
然而,就性能而言,编译器(最终是程序员)是加速接口运行的主要原因,因为两者都可以充分利用硬件。性能取决于一些变量,如代码质量、算法类型和硬件类型。
可实行的供应商
截至本文撰写之时,执行 CUDA 的供应商只有一家,即其所有者 NVIDIA。
然而,OpenCL 可由众多供应商实现,包括(但不限于):
- AMD: 可支持 Intel、AMD 芯片和 GPU.
- 支持 Radeon 5xxx、6xxx、7xxx 系列、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 计算设备
- CPU、GPU、“MIC” (Xeon Phi)
可移植性
这可能是两者公认的最大区别,因为 CUDA 仅在 NVIDIA GPU 上运行,而OpenCL是一个开放的行业标准,可在 NVIDIA、AMD、Intel 等硬件设备上运行。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 能够在 Windows、Linux 和 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 兼容的设备上运行。
社区
社区也是值得比较的内容,包括每个框架的兼容性、寿命、义务等。这些东西很难衡量,不过我们可以看看论坛,衡量一下社区的活跃度。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 对其支持产品的能力提升更强。
尽管支持 CUDA,NVIDIA GPU(较新版本)的 OpenCL 性能也相当强大。一般的经验是,实际操作中,如果绝大多数应用程序和硬件都支持 OpenCL,那么 OpenCL 将是首选。
无论你决定使用什么,Incredbuild 都可全马力加速编译和测试速度,覆盖内容创建、机器学习、信号处理等大量计算密集型工作进程。MediaPro 就是一个案例,事实证明,Incredbuild 有效将其编译和测试进程大幅提速(在本例中,速度提高了 6 倍以上)。