淺談GPU並行計算學習經驗

從開始瞭解高性能GPU並行計算到現在也就三個月時間,因爲我所有的代碼都是C++語言編寫,所以在並行計算異構編程框架上選擇的是C++ AMP平臺。只有真正的實現超線程計算縮短了for循環之後,才感嘆這技術太牛逼了!一定要掌握!

開始瞭解GPU並行計算還是在實驗室一個剛回國師兄的講座上,他用的是CUDA,當然師兄的編程能力超硬,所以對於這種技術都是處於羨慕狀態。最開始我查了好多資料準備學習CUDA方法實現GPU並行計算,下載了cuda_9.1.85_windowshttps://developer.nvidia.com/cuda-toolkit-archive,但是後來發現CUDA作爲計算性能最快的平臺,它也有缺陷,就是隻適用於英偉達的顯卡,並且學起來比較難。這兩點也是阻擋我學習CUDA的最大的原因。

沉寂了兩個多月,後來開始學習基於C++AMP平臺的GPU並行計算,推薦一本書Kate Gegory和Ade Miller著的《C++AMP用Visual C++加速大規模運算》非常棒,網上有電子版。先是開始搭載並行計算平臺,我用的是VS2017,遇到一些問題已解決https://blog.csdn.net/weixin_41788456/article/details/104702188,對於C++AMP的學習比較容易入手,只要理解lambda表達式和parallel_for_each表達式,就可以實現並行計算的數組加減運算,對於簡單的計算,性能提升不明顯,只有真正進入實用階段才能體會到GPU並行計算的巨大魅力之處!隨便測試了一下之前我寫的正常代碼也就是CPU計算需要691s,使用並行計算之後只需要45s,這個效率還是很棒的。

淺談CUDA、OpenCL與C++ AMP
       C++ AMP出現之前已經有了兩個異構編程框架:CUDA與OpenCL。CUDA是顯卡廠商Nvidia於2007年推出的業界第一款異構並行編程框架。在Nvidia的大力支持下,CUDA擁有良好的開發環境,豐富的函數庫,優秀的性能。但是CUDA只能被用於在Nvidia的顯卡上進行異構編程,有先天的侷限性。OpenCL是業界第一個跨平臺的異構編程框架。它是Apple領銜並聯合Nvidia,AMD,IBM,Intel等衆多廠商於2008年共同推出的一個開放標準,由單獨成立的非營利性組織Khronos Group管理。與C++ AMP類似,OpenCL作爲一個開放的標準,並不侷限於某個特定的GPU廠商,從這點上來看,Nvidia自己獨家的CUDA顯得很封閉了。
       因爲CUDA與OpenCL比C++AMP更接近硬件底層,所以前兩者的性能更好,然而與C++ AMP的易編程性卻要優於CUDA和OpenCL。與C++ AMP基於C++語言特性直接進行擴展不同,OpenCL是基於C99編程語言進行的相關修改和擴展,因此C++ AMP比OpenCL擁有更高層次的抽象,編程更加簡單。在CUDA和OpenCL中,kernels(運行在GPU上的代碼)必須被封裝成特定函數,而在C++ AMP中,代碼看起來整潔的多:我們只需要使用for循環中內嵌的lambda函數就能完成異構並行計算,而且它的內存模型也在一定程度上被大大簡化了。所以C++AMP對於大部分人來說是更好的選擇!

從編程語言的選擇來看,普遍認爲易編程性往往比性能更加重要,編程效率無疑是最重要的指標。更不用說開發者可以通過更換下一代GPU硬件來獲得更好的性能。從這點來看,C++ AMP通過降低異構編程的編程難度,實際上也是推進了異構編程的普及。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章