CUDA和OpenCL都是實(shí)現(xiàn)計(jì)算機(jī)異構(gòu)并行計(jì)算架構(gòu),然而CUDA是針對(duì)NVIDIA公司的GPU,而OpenCL是一種通用的計(jì)算框架。兩者基本的差別為:
1.硬件架構(gòu)
1.1 芯片結(jié)構(gòu)
CUDA和OpenCL的芯片結(jié)構(gòu)類(lèi)似,都是按等級(jí)劃分的,并逐漸提高等級(jí)。然而OpenCL更具通用性并使用更加一般的技術(shù),如OpenCL通過(guò)使用Processing Element代替CUDA的Processor,同時(shí)CUDA的模型只能在NVIDIA架構(gòu)的GPU上運(yùn)行。
1.2 存儲(chǔ)結(jié)構(gòu)
CUDA和OpenCL的存儲(chǔ)模型如圖所示,兩者的模型類(lèi)型,都是將設(shè)備和主機(jī)的存儲(chǔ)單元獨(dú)立分開(kāi),它們的都是按等級(jí)劃分并需要程序員進(jìn)行精確的控制,并都能通過(guò)API來(lái)查詢?cè)O(shè)備的狀態(tài)、容量等信息。而OpenCL模型更加抽象,并為不同的平臺(tái)提供更加靈活的實(shí)現(xiàn),在CUDA模型的Local Memory在OpenCL沒(méi)有相關(guān)的概念。對(duì)于CUDA和OpenCL模型的類(lèi)似概念,通過(guò)表列出兩者對(duì)存儲(chǔ)單元命名的差異。
2.軟件架構(gòu)
2.1 應(yīng)用框架
一個(gè)典型的應(yīng)用框架都包含有l(wèi)ibraries、API、drivers/compilies和runtime system等來(lái)支持軟件開(kāi)發(fā)。CUDA和OpenCL也擁有相似的特性,都擁有runtime API和library API,但具體環(huán)境下的創(chuàng)建和復(fù)制API是不同的,并且OpenCL可以通過(guò)平臺(tái)層查詢?cè)O(shè)備的信息;CUDA的kernel可以直接通過(guò)NVIDIA 驅(qū)動(dòng)執(zhí)行,而OpenCL的kernel必須通過(guò)OpenCL驅(qū)動(dòng),但這樣可能影響到性能。因?yàn)镺penCL畢竟是一個(gè)開(kāi)源的標(biāo)準(zhǔn),為了適應(yīng)不同的CPU、GPU和設(shè)備都能夠得到正常執(zhí)行;而CUDA只針對(duì)NVIDIA的GPU產(chǎn)品。
2.2 編程模型
1)開(kāi)發(fā)模型
CUDA和OpenCL應(yīng)用的開(kāi)發(fā)模型基本一致,都是由Host和Device程序組成。程序首先開(kāi)始執(zhí)行Host程序,然后由Host程序激活Device程序kernel執(zhí)行。其中兩者也存在一些差別,如表所示。
2)kernel編程
kernel程序是指Device設(shè)備上執(zhí)行的代碼,它是直接在設(shè)備上執(zhí)行,受具體設(shè)備的限制,具體兩者的差別,如表所示。
3)Host編程
Host端基本是串行的,CUDA和OpenCL的差別主要表現(xiàn)在調(diào)用Device的API的差異,所以表描述了兩者之間API的差異。
3.性能
本節(jié)根據(jù)學(xué)術(shù)上對(duì)CUDA和OpenCL的研究,比較兩者的性能,其中本文簡(jiǎn)單以[1-3]研究成功比較CUDA和OpenCL之間的性能差異,若需詳細(xì)了解CUDA和OpenCL之間的性能差異可以參考[4-15]。
3.1 AES實(shí)現(xiàn)
Wang[1]提出一種在XTS模式的AES實(shí)現(xiàn),并對(duì)OpenCL和CUDA性能進(jìn)行比較。總體性能CUDA要比OpenCL好10%~20%之間。
3.2 三維可視化加速模型
上海理工大學(xué)[3]提出合理設(shè)計(jì)內(nèi)核函數(shù)實(shí)現(xiàn)改進(jìn)的光線投射算法在GPU上并行和并發(fā)運(yùn)行的三維可視化加速模型,該模型實(shí)現(xiàn)代碼可不用修改在兩大主流顯卡平臺(tái)NVIDIA和AMD上任意移植,通過(guò)實(shí)驗(yàn)證明比較OpenCL與CUDA之間的性能。
3.3 MAGMA和DGEMM算法
作者[2]已經(jīng)在先前的版本中使用CUDA實(shí)現(xiàn)了MAGMA(Matrix Algebra on GPU and multicore architectures)和DGEMM算法,現(xiàn)在將其實(shí)現(xiàn)移植到OpenCL API,并對(duì)兩者的性能進(jìn)行比較。在NVIDIA處理器上進(jìn)行測(cè)試,其結(jié)果是CUDA的性能要高于OpenCL。
4.總結(jié)
CUDA與OpenCL的功能和架構(gòu)相似,只是CUDA只針對(duì)NVIDIA的產(chǎn)品,而OpenCL是一種通用性框架,可以使用多種品牌的產(chǎn)品,所以CUDA的性能一般情況下要比OpenCL的性能要高10%~20%之間。
4.1 CUDA與OpenCL的相似點(diǎn)
- 關(guān)注數(shù)據(jù)并行計(jì)算模型;
- 將主機(jī)和設(shè)備的程序和存儲(chǔ)分離;
- 提供定制和標(biāo)準(zhǔn)C語(yǔ)言對(duì)設(shè)備進(jìn)行編程;
- 設(shè)備、執(zhí)行和存儲(chǔ)模型是現(xiàn)類(lèi)似的;
- OpenCL已經(jīng)可以在CUDA之上進(jìn)行實(shí)現(xiàn)了。
4.2 CUDA和OpenCL主要的差異點(diǎn)
- CUDA是屬于NVIDIA公司的技術(shù)框架,只有NVIDIA的設(shè)備才能執(zhí)行;
- OpenCL是一個(gè)開(kāi)源的框架,其目標(biāo)是定位不同的設(shè)備;
- CUDA擁有更多的API和幫助文檔;
- CUDA投入市場(chǎng)的時(shí)間更早,所以得到更多的支持,并且在研究、產(chǎn)品和應(yīng)用都比OpenCL豐富;
- CUDA有非常多的文檔,但也更加模糊。
References
1.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 的三維可視化加速模型. 小型微型計(jì)算機(jī)系統(tǒng), 2015. 36(002): 第327-331頁(yè).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.
林樂(lè)森, 基于 OpenCL 的 AES 算法并行性分析及加速方案, 2012, 吉林大學(xué).
易卓霖, 基于 GPU 的并行支持向量機(jī)的設(shè)計(jì)與實(shí)現(xiàn), 2011, 西南交通大學(xué).
蔣麗媛等, 基于 OpenCL 的連續(xù)數(shù)據(jù)無(wú)關(guān)訪存密集型函數(shù)并行與優(yōu)化研究. 計(jì)算機(jī)科學(xué), 2013. 40(3): 第111-115頁(yè).
詹云, 趙新?tīng)N與譚同德, 基于 OpenCL 的異構(gòu)系統(tǒng)并行編程. 計(jì)算機(jī)工程與設(shè)計(jì), 2012. 33(11): 第4191-4195頁(yè).
王晗, 基于多核環(huán)境下的多線程并行程序設(shè)計(jì)方法研究, 2014, 中原工學(xué)院.
黃文慧, 圖像處理并行編程方法的研究與應(yīng)用, 2012, 華南理工大學(xué).
劉壽生, 虛擬現(xiàn)實(shí)仿真平臺(tái)異構(gòu)并行計(jì)算關(guān)鍵技術(shù)研究, 2014, 中國(guó)海洋大學(xué).