GPU编程语言选择(OpenCL、CUDA 与C++ AMP)
?????? 其實在C++ AMP之前已經(jīng)有了兩個異構(gòu)編程框架:CUDA與OpenCL。CUDA(Compute Unified Device Architecture)是顯卡廠商Nvidia于2007年推出的業(yè)界第一款異構(gòu)并行編程框架。在Nvidia的大力支持下,CUDA擁有良好的開發(fā)環(huán)境,豐富的函數(shù)庫,優(yōu)秀的性能。但是CUDA只能被用于在Nvidia的顯卡上進行異構(gòu)編程,有先天的局限性。OpenCL (Open Computing Language) 是業(yè)界第一個跨平臺的異構(gòu)編程框架。它是Apple領(lǐng)銜并聯(lián)合Nvidia,AMD,IBM,Intel等眾多廠商于2008年共同推出的一個開放標準,由單獨成立的非營利性組織Khronos Group管理。與C++ AMP類似,OpenCL作為一個開放的標準,并不局限于某個特定的GPU廠商,從這點上來看,Nvidia自己獨家的CUDA顯得很封閉。我們可以把OpenCL在異構(gòu)編程上的地位與OpenGL和OpenAL類比,這兩個標準分別用于三維圖形和計算機音頻。
?????? 因為CUDA與OpenCL比C++AMP更接近硬件底層,所以前兩者的性能更好,然而與C++ AMP的易編程性卻要優(yōu)于CUDA和OpenCL。與C++ AMP基于C++語言特性直接進行擴展不同,OpenCL是基于C99編程語言進行的相關(guān)修改和擴展,因此C++ AMP比OpenCL擁有更高層次的抽象,編程更加簡單。在CUDA和OpenCL中,kernels(運行在GPU上的代碼)必須被封裝成特定函數(shù),而在C++ AMP中,代碼看起來整潔的多:我們只需要使用for循環(huán)中內(nèi)嵌的lambda函數(shù)就能完成異構(gòu)并行計算,而且它的內(nèi)存模型也在一定程度上被大大簡化了。
?????? 那么在OpenCL、CUDA 與C++ AMP之間,開發(fā)者該如何選擇呢?
?????? 1)如果你只需要在Windows平臺上進行異構(gòu)編程,并且看重易編程性的話,C++ AMP無疑是最好的選擇。依托于Visual Studio這個強有力的開發(fā)工具,再加上基于C++這一更高層抽象帶來的先天優(yōu)勢,C++ AMP將為Windows開發(fā)者進行異構(gòu)編程提供良好的支持。
?????? 2)如果你只需要在Nvidia的GPU卡上進行異構(gòu)編程,并且非常看重性能的話,CUDA應(yīng)該是第一選擇:在Nvidia的強力支持下,CUDA在Nvidia硬件上的性能一直保持領(lǐng)先,許多學(xué)術(shù)研究表明OpenCL與CUDA的性能相差不大,在一部分應(yīng)用中CUDA的性能稍微好于OpenCL。同時CUDA的開發(fā)環(huán)境也非常成熟,擁有眾多擴展函數(shù)庫支持。
?????? 3)如果你更注重不同平臺間的可移植性,OpenCL可能是目前最好的選擇。作為第一個異構(gòu)計算的開放標準,OpenCL已經(jīng)得到了包括Intel,AMD,Nvidia,IBM,Oracle,ARM,Apple,Redhat等眾多軟硬件廠商的大力支持。當然,C++ AMP本身也是一個開放的標準,只是目前只有微軟自己做了實現(xiàn),將來C++ AMP的跨平臺支持能做到什么程度還是一個未知數(shù)。
?????? 其實從編程語言的發(fā)展來看,易編程性往往比性能更加重要。從Java和.Net的流行,到腳本語言的崛起,編程效率無疑是最重要的指標。更不用說開發(fā)者往往可以通過更換下一代GPU硬件來獲得更好的性能。從這點來看,C++ AMP通過降低異構(gòu)編程的編程難度,實際上也是推進了異構(gòu)編程的普及。下面我們需要看的就是C++ AMP是否能成為真正的業(yè)界標準,而不僅僅局限于微軟自己的平臺,微軟這次開放C++ AMP標準的行為也正是為了推廣C++ AMP在業(yè)界的普及。
總結(jié)
以上是生活随笔為你收集整理的GPU编程语言选择(OpenCL、CUDA 与C++ AMP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 校园送礼风为何难刹住 “送了没个完,不送
- 下一篇: 让C/C++程序员告诉你什么叫浪漫,表白