對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...