CUDA和OpenCL異同點比較

2021-06-27 16:29:10 字數 1543 閱讀 3416

對cuda和opencl有一定的程式設計經驗,但是細心的人可以發現,opencl就是仿照cuda來做的。既然兩個gpu的程式設計框架如此相像,那麼他們究竟有什麼不同呢?下面就一一道來。

opencl採用的資料並行模型就是採用cuda的資料並行模型。下面的**反應了cuda和opencl並行模型之間的對映關係。

opencl

cuda

kernel函式

kernel函式

主機程式

主機程式

n-drange

網格工作項

執行緒工作組

執行緒塊說道n-drange、工作項和工作組,這裡cuda和opencl十分相似,甚至可以說是一樣的,在裝置端的程式中,cuda主要是通過預定義的變數進行訪問,而opencl是通過預定義的api訪問。具體的比較如下表:

opencl

含義cuda

get_global_id(0)

工作項在x維度上的全域性索引

blockidx.x*blockdim.x+threadidx.x

get_local_id(0)

工作項在工作組中x維度上的區域性索引

threadidx.x

get_global_size(0)

n-drange中x維度的大小,即執行緒數量

griddim.x*blockdim.x

get_local_size(0)

每個工作組x維度上的大小

blockdim.x

cuda和opencl類似,都是異構平行計算系統。系統中有一台主機和乙個或多個計算裝置。關於計算裝置,cuda中叫做多喝流處理器(sm),而opencl中叫做計算單元(cu)。另外,在opencl中乙個cu在cpu中相當於cpu的乙個核心。

另外,cuda和opencl之間在記憶體模型上有一些相似的地方,也有一些不同的地方,具體見下表:

opencl儲存器型別

主機訪問

裝置訪問

cuda儲存器型別

全域性儲存器

動態分配;讀寫

不能分配;可以被所有的工作項訪問,空間大;速度慢

全域性儲存器

常數儲存器

動態分配;讀寫

靜態分配,工作項唯讀

常數儲存器

區域性儲存器

動態分配;不能訪問

靜態分配;同乙個工作組的工作項訪問

區域性儲存器

私有儲存器

不能分配;不能訪問

靜態分配;每乙個工作項可讀寫自己的部分

暫存器和區域性儲存器

有幾點不同的地方,opencl可以再主機端動態的分配常數儲存器;opencl中的私有儲存器對應於cuda中的自動變數。

opencl中核函式以__kernel開頭,對應於cuda中的__global__。另外,在程式編譯方面,cuda是先編譯裝置上的**,然後執行;而opencl是在執行時編譯。opencl啟動核函式是通過執行時api呼叫的,而cuda是直接通過函式名<<>>啟動的。最後,n-drange(網格)配置有所不同,cuda是在函式呼叫時夾在《和》之間的引數配置的;opencl是用呼叫clenqueuendrangekernel函式時配置的。

CUDA和OpenCL的區別

從很多方面來看,cuda和opencl的關係都和directx與opengl的關係很相像。如同directx和opengl一樣,cuda和opencl中,前者是配備完整工具包 針對單一 商 nvidia 的成熟的開發平台,後者是乙個開放的標準。雖然兩者抱著相同的目標 通用平行計算。但是cuda僅僅能...

HashMap和Hashtable異同點

相同點 1.都是由陣列實現 2.key都是通過hash演算法 3.put方法,當key存在是返回的是原來的value,不存在時返回的是null 不同點 1.風格不一樣,設計不一樣 估計不是同乙個人寫的,個人猜測 2.陣列預設大小不一樣 hashmap 16 hashtable 11 3.構造方法傳i...

Array和ArrayList的異同點

最近研究了一下c 中的array及arraylist類之間的異同,總結了以下幾點 array和arraylist的區別 1.array型別的變數在宣告的同時必須進行例項化 至少得初始化陣列的大小 而arraylist可以只是先宣告。如 int array new array 3 或 int arra...