OpenCL/DirectX 与 CUDA ,鱼和熊掌可以兼得?
什么是 OpenCL ?
OpenCL ( Open Computing Language )是一个为异构平台( CPU 、 GPU 或其他类型的处理器组成)编写程序的框架。 OpenCL 提供了基于任务 / 数据分割的并行计算机制,程序员通过使用它的 API 来定义和控制。
什么是 DirectX ?
DirectX 是微软定义的多媒体编程 API 。它遵循 COM 标准,包含 DirectGraphic ( Direct3D 、 DirectDraw 等)、 DirectPlay 、 DirectSound 、 DirectInput 、 DirectSetup 和 DirectMusic 等部分。
什么是 CUDA ?
CUDA ( Compute Unified Device Architecture )是 NIVIDA 推出的并行计算架构。它主要包含一个 ISA (指令集架构)和一个并行计算的硬件引擎,适用于 NVIDIA GeForce8 及以后系列的显卡。
OpenCL/DirectX 与 CUDA 之关系
图 1 展示了 OpenCL/DirectX 与 CUDA 之间的关系。理解这种关系,对于程序员是非常有意义的。它能够根据程序员自身情况,合理选择开发语言及其相关的 API 。
图 1 OpenCL/DirectX 与 CUDA 关系图
比较
- 软硬件架构不同。 CUDA 是 NVIDIA 的 GPU 的硬件架构。它主要包含 ISA 指令集架构和并行计算硬件引擎,而 OpenCL 、 DirectX 和 CUDA C 等都是软件架构,这是根本不同。
- OpenCL 是并行计算 API 。它通过 GPU 驱动与其通信,使用 PTX 等实现复杂的高效并行计算。
- DirectX Compute Shader API 的实现原理与 OpenCL 一致,其他部分可以类比 OpenGL 和 OpenAL 。
- CUDA C 是高级语言( C 语言的 CUDA 扩充),而 OpenCL/DirectX 是针对硬件的应用层序开发接口,两者完全不同。 CUDA C 不仅能够使用 OpenCL/DirectX 实现高效并行计算,而且也能够直接使用 GPU 驱动来完成相应功能。
- OpenCL/DirectX 和 CUDA C 的定位不同。 CUDA C 能够使对硬件不了解的非专业人士轻松上手,而 OpenCL/DirectX 则要求程序员有更多的 GPU 相关知识。此外,相比于 CUDA C , OpenCL/DirectX 对硬件有更多的控制权。
小结
CUDA 仅仅使用于 NVIDIA Geforce8 及其以后的显卡。对于并行计算而言,如果需要跨越硬件和操作系统的限制, OpenCL 是无二选择;如果程序只运行在 Windows 操作系统之上,并考虑支持其他显卡(比如 ATI ),那么 DirectX 可能是首选(类似于 OpenGL 与 DirectX 之间的关系);如果 Windows 操作系统上仅仅使用 NVIDIA 显卡,那么无疑 CUDA C 等语言是快速、高效开发的首选,使程序员能够集中精力处理业务相关事项而不必考虑繁琐的诸如显存释放等细节。总之, OpenCL/DirectX 和 CUDA 之间没有根本冲突,鱼和熊掌可以兼得。