GPU編程語言選擇(OpenCL、CUDA 與C++ AMP)


  轉載自:

    https://blog.csdn.net/m0_37170593/article/details/56290085

 

1、CUDA、OpenCL與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在業界的普及。
 
參考: http://www.2cto


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM