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