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 之間沒有根本衝突,魚和熊掌可以兼得。