OpenCL與Cuda技術
CUDA只針對NVIDIA的GPGPU,OpenCL是並行運算的通用接口。想用CUDA就必須有NVIDIA的顯卡或者計算卡。OpenCL對應的設備更廣泛,CPU、顯卡、FPGA、DSP等等都可能可以用OpenCL開發。
但是在顯卡領域OpenCL表現並不好。顯卡廠商並沒在OpenCL上進行很大的投入,導致在基於顯卡的高性能運算領域OpenCL並不好用。
CUDA和OpenCL的芯片結構類似,都是按等級划分的,並逐漸提高等級。然而OpenCL更具通用性並使用更加一般的技術,如OpenCL通過使用Processing Element代替CUDA的Processor,同時CUDA的模型只能在NVIDIA架構的GPU上運行。
OpenCL與CUDA芯片結構
從很多方面來看,CUDA和OpenCL的關系都和DirectX與OpenGL的關系很相像。如同DirectX和OpenGL一樣,CUDA和OpenCL中,前者是配備完整工具包、針對單一供應商(NVIDIA)的成熟的開發平台,后者是一個開放的標准。
雖然兩者抱着相同的目標:通用並行計算。但是CUDA僅僅能夠在NVIDIA的GPU硬件上運行,而OpenCL的目標是面向任何一種Massively Parallel Processor,期望能夠對不同種類的硬件給出一個相同的編程模型。由於這一根本區別,二者在很多方面都存在不同:
1)開發者友好程度。CUDA在這方面顯然受更多開發者青睞。原因在於其統一的開發套件(CUDA Toolkit, NVIDIA GPU Computing SDK以及NSight等等)、非常豐富的庫(cuFFT, cuBLAS, cuSPARSE, cuRAND, NPP, Thrust)以及NVCC(NVIDIA的CUDA編譯器)所具備的PTX(一種SSA中間表示,為不同的NVIDIA GPU設備提供一套統一的靜態ISA)代碼生成、離線編譯等更成熟的編譯器特性。相比之下,使用OpenCL進行開發,只有AMD對OpenCL的驅動相對成熟。
2)跨平台性和通用性。這一點上OpenCL占有很大優勢(這也是很多National Laboratory使用OpenCL進行科學計算的最主要原因)。OpenCL支持包括ATI,NVIDIA,Intel,ARM在內的多類處理器,並能支持運行在CPU的並行代碼,同時還獨有Task-Parallel Execution Mode,能夠更好的支持Heterogeneous Computing。這一點是僅僅支持數據級並行並僅能在NVIDIA眾核處理器上運行的CUDA無法做到的。
3)市場占有率。作為一個開放標准,缺少背后公司的推動,OpenCL顯然沒有占據通用並行計算的主流市場。NVIDIA則憑借CUDA在科學計算、生物、金融等領域的推廣牢牢把握着主流市場。再次想到OpenGL和DirectX的對比,不難發現公司推廣的高效和非盈利機構/標准委員會的低效(抑或謹慎,想想C++0x)。
由於目前獨立顯卡市場的萎縮、新一代處理器架構(AMD的Graphics Core Next (GCN)、Intel的Sandy Bridge以及Ivy Bridge)以及新的SIMD編程模型(Intel的ISPC等)的出現,未來的通用並行計算市場會有很多不確定因素,CUDA和OpenCL都不是終點,期待未來會有更好的並行編程模型的出現(包括CUDA和OpenCL,如果能夠持續發展下去)。
存儲結構
CUDA和OpenCL的存儲模型如圖20所示,兩者的模型類型,都是將設備和主機的存儲單元獨立分開,都是按等級划分並需要程序員進行精確的控制,並都能通過API來查詢設備的狀態、容量等信息。而OpenCL模型更加抽象,並為不同的平台提供更加靈活的實現,在CUDA模型的Local Memory在OpenCL沒有相關的概念。對於CUDA和OpenCL模型的類似概念,通過表5列出兩者對存儲單元命名的差異。
參考鏈接:
https://www.jianshu.com/p/4fad4f91edd4
https://zhidao.baidu.com/question/1244089920656558339.html
https://zhidao.baidu.com/question/2272464493622120108.html?qbl=relate_question_1&word=opencl%D3%EBcuda