CUDA和OpenCL都是實現(xiàn)計算機異構并行計算架構,然而CUDA是針對NVIDIA公司的GPU箫爷,而OpenCL是一種通用的計算框架。兩者基本的差別為:
表 4 CUDA與OpenCL基本差別
CUDA | OpenCL | |
---|---|---|
技術類型 | 控制 | 開源和VIP服務 |
出現(xiàn)時間 | 2006年 | 2008年 |
SDK企業(yè) | NVIDIA | 具體根據(jù)企業(yè) |
SDK是否免費 | Yes | 依賴企業(yè) |
實現(xiàn)企業(yè) | 僅NVIDIA | Apple、NVIDIA扼仲、AMD远寸、IBM |
支持系統(tǒng) | Windows, Linux, Mac OS X; 32 and 64‐bit | 依賴具體企業(yè) |
支持設備類型 | 僅NVIDIA GPU | 多種類型 |
支持嵌入式設備 | NO | Yes |
1. 硬件架構
1.1 芯片結構
CUDA和OpenCL的芯片結構類似,都是按等級劃分的屠凶,并逐漸提高等級驰后。然而OpenCL更具通用性并使用更加一般的技術,如OpenCL通過使用Processing Element代替CUDA的Processor矗愧,同時CUDA的模型只能在NVIDIA架構的GPU上運行灶芝。
1.2 存儲結構
CUDA和OpenCL的存儲模型如圖20所示,兩者的模型類型唉韭,都是將設備和主機的存儲單元獨立分開夜涕,它們的都是按等級劃分并需要程序員進行精確的控制,并都能通過API來查詢設備的狀態(tài)属愤、容量等信息女器。而OpenCL模型更加抽象,并為不同的平臺提供更加靈活的實現(xiàn)住诸,在CUDA模型的Local Memory在OpenCL沒有相關的概念驾胆。對于CUDA和OpenCL模型的類似概念,通過表5列出兩者對存儲單元命名的差異贱呐。
表 5 CUDA與OpenCL存儲器對比
OpenCL | CUDA |
---|---|
Host memory | Host memory |
Global memory | Global or Device memory |
Global memory | Local memory |
Constant memory | Constant memory |
Global memory | Texture memory |
Local memory | Shared memory |
Private memory | Registers |
2. 軟件架構
2.1 應用框架
一個典型的應用框架都包含有l(wèi)ibraries丧诺、API、drivers/compilies和runtime
system等來支持軟件開發(fā)吼句。CUDA和OpenCL也擁有相似的特性锅必,都擁有runtime API和library API,但具體環(huán)境下的創(chuàng)建和復制API是不同的惕艳,并且OpenCL可以通過平臺層查詢設備的信息搞隐;CUDA的kernel可以直接通過NVIDIA 驅動執(zhí)行,而OpenCL的kernel必須通過OpenCL驅動远搪,但這樣可能影響到性能劣纲。因為OpenCL畢竟是一個開源的標準,為了適應不同的CPU谁鳍、GPU和設備都能夠得到正常執(zhí)行癞季;而CUDA只針對NVIDIA的GPU產(chǎn)品。
2.2 編程模型
-
開發(fā)模型
CUDA和OpenCL應用的開發(fā)模型基本一致倘潜,都是由Host和Device程序組成绷柒。程序首先開始執(zhí)行Host程序,然后由Host程序激活Device程序kernel執(zhí)行涮因。其中兩者也存在一些差別废睦,如表6所示。
表 6 CUDA與OpenCL開發(fā)模型比較
CUDA | OpenCL | |
---|---|---|
精確的host和device代碼分離 | Yes | Yes |
定制的kernel編程語言 | Yes | Yes |
并行的kernel編程語言 | Yes | 僅有OpenCL C或具體的企業(yè)語言 |
支持數(shù)據(jù)并行kernels | Yes | Yes |
支持任務并行kernels | No | Yes |
多編程接口 | Yes养泡,包括OpenCL | 僅支持標準C的API |
host和device結合程度 | Yes嗜湃,效率非常高 | No奈应,分離的編譯并且kernel和API調用是不相干的 |
Graphics支持 | OpenGL and Direct3D | OpenGL |
- kernel編程
kernel程序是指Device設備上執(zhí)行的代碼,它是直接在設備上執(zhí)行购披,受具體設備的限制杖挣,具體兩者的差別,如表7所示刚陡。
表 7 kernel編程差異
CUDA | OpenCL | |
---|---|---|
基于開發(fā)語言版本 | 基本C和C++惩妇、C++14 | C99 |
訪問work-item方式 | 通過內置的變量 | 通過內置函數(shù) |
內置vector類型 | 基本vector類型,沒有操作和函數(shù) | vector橘荠、literals類型屿附,并內置操作和函數(shù) |
Voting函數(shù) | Yes (CC 1.2 or greater) | No |
Atomic函數(shù) | Yes (CC 1.1 or greater) | Only as extension |
異步內存空間復制和預取函數(shù) | No | Yes |
支持C++語言功能 | Yes,受限哥童,但大部分功能都支持 | No |
- Host 編程
Host端基本是串行的挺份,CUDA和OpenCL的差別主要表現(xiàn)在調用Device的API的差異,所以表8描述了兩者之間API的差異贮懈。
表 8 Host端可用的API比較
C Runtime for CUDA | CUDA Driver API | OpenCL API |
---|---|---|
Setup | ||
Initialize driver Get device(s) (Choose device) Create context | Initialize plauorm Get devices Choose device Create context Create command queue | |
Device and host memory buffer setup | ||
Allocate host memory Allocate device memory for input Copy host memory to device memory Allocate device memory for result | Allocate host memory Allocate device memory for input Copy host memory to device memory Allocate device memory for result | Allocate host memory Allocate device memory for input Copy host memory to device memory Allocate device memory for result |
Initialize kernel | ||
Load kernel module | Load kernel source | |
(Build program) | Create program object | |
Get module function | Build program | |
Create kernel object bound to kernel function | ||
Execute the kernel | ||
Setup execution configuration | Setup kernel arguments Setup execution configuration Invoke the kernel | Setup kernel arguments Setup execution configuration |
Invoke the kernel (directly with its parameters) | Invoke the kernel | |
Copy results to host | ||
Copy results from device memory | Copy results from device memory | Copy results from device memory |
Cleanup | ||
Cleanup all set up above | Cleanup all set up above | Cleanup all set up above |
3. 性能
本節(jié)根據(jù)學術上對CUDA和OpenCL的研究匀泊,比較兩者的性能,其中本文簡單以[1-3]研究成功比較CUDA和OpenCL之間的性能差異朵你,若需詳細了解CUDA和OpenCL之間的性能差異可以參考[4-15]各聘。
3.1 AES實現(xiàn)
Wang[1]提出一種在XTS模式的AES實現(xiàn),并對OpenCL和CUDA性能進行比較抡医。如圖 22和圖23所示躲因,總體性能CUDA要比OpenCL好10%~20%之間。
3.2 三維可視化加速模型
上海理工大學[3]提出合理設計內核函數(shù)實現(xiàn)改進的光線投射算法在GPU上并行和并發(fā)運行的三維可視化加速模型忌傻,該模型實現(xiàn)代碼可不用修改在兩大主流顯卡平臺NVIDIA和AMD上任意移植大脉,通過實驗證明比較OpenCL與CUDA之間的性能。
3.3 MAGMA和DGEMM算法
作者[2]已經(jīng)在先前的版本中使用CUDA實現(xiàn)了MAGMA(Matrix Algebra on GPU and multicore
architectures)和DGEMM算法水孩,現(xiàn)在將其實現(xiàn)移植到OpenCL
API镰矿,并對兩者的性能進行比較。在NVIDIA處理器上進行測試俘种,其結果是CUDA的性能要高于OpenCL秤标。
4. 總結
====
CUDA與OpenCL的功能和架構相似,只是CUDA只針對NVIDIA的產(chǎn)品宙刘,而OpenCL是一種通用性框架苍姜,可以使用多種品牌的產(chǎn)品,所以CUDA的性能一般情況下要比OpenCL的性能要高10%~20%之間悬包。
CUDA與OpenCL的相似點
- 關注數(shù)據(jù)并行計算模型衙猪;
- 將主機和設備的程序和存儲分離;
- 提供定制和標準C語言對設備進行編程;
- 設備屈嗤、執(zhí)行和存儲模型是現(xiàn)類似的;
- OpenCL已經(jīng)可以在CUDA之上進行實現(xiàn)了吊输。
CUDA和OpenCL主要的差異點 - CUDA是屬于NVIDIA公司的技術框架饶号,只有NVIDIA的設備才能執(zhí)行;
- OpenCL是一個開源的框架季蚂,其目標是定位不同的設備茫船;
- CUDA擁有更多的API和幫助文檔;
- CUDA投入市場的時間更早扭屁,所以得到更多的支持算谈,并且在研究、產(chǎn)品和應用都比OpenCL豐富料滥;
- CUDA有非常多的文檔然眼,但也更加模糊。
References
Wang, X., et al. AES finalists implementation for GPU and multi-core CPU
based on OpenCL. in Anti-Counterfeiting, Security and Identification (ASID),
2011 IEEE International Conference on. 2011: IEEE.Du, P., et al., From CUDA to OpenCL: Towards a performance-portable solution
for multi-platform GPU programming. Parallel Computing, 2012. 38(8): p.
391-407.袁健與高勃, 基于 OpenCL 的三維可視化加速模型. 小型微型計算機系統(tǒng), 2015.
36(002): 第327-331頁.Karimi, K., N.G. Dickson and F. Hamze, A performance comparison of CUDA and
OpenCL. arXiv preprint arXiv:1005.2581, 2010.McConnell, S., et al. Scalability of Self-organizing Maps on a GPU cluster
using OpenCL and CUDA. in Journal of Physics: Conference Series. 2012: IOP
Publishing.Fang, J., A.L. Varbanescu and H. Sips. A comprehensive performance
comparison of CUDA and OpenCL. in Parallel Processing (ICPP), 2011
International Conference on. 2011: IEEE.Oliveira, R.S., et al., Comparing CUDA, OpenCL and OpenGL implementations of
the cardiac monodomain equations, in Parallel Processing and Applied
Mathematics. 2012, Springer. p. 111-120.Harvey, M.J. and G. De Fabritiis, Swan: A tool for porting CUDA programs to
OpenCL. Computer Physics Communications, 2011. 182(4): p. 1093-1099.林樂森, 基于 OpenCL 的 AES 算法并行性分析及加速方案, 2012, 吉林大學.
易卓霖, 基于 GPU 的并行支持向量機的設計與實現(xiàn), 2011, 西南交通大學.
蔣麗媛等, 基于 OpenCL 的連續(xù)數(shù)據(jù)無關訪存密集型函數(shù)并行與優(yōu)化研究.
計算機科學, 2013. 40(3): 第111-115頁.-
詹云, 趙新燦與譚同德, 基于 OpenCL 的異構系統(tǒng)并行編程. 計算機工程與設計,
- 33(11): 第4191-4195頁.
王晗, 基于多核環(huán)境下的多線程并行程序設計方法研究, 2014, 中原工學院.
黃文慧, 圖像處理并行編程方法的研究與應用, 2012, 華南理工大學.
劉壽生, 虛擬現(xiàn)實仿真平臺異構并行計算關鍵技術研究, 2014, 中國海洋大學.