1.OpenCL概念
OpenCL是一個為異構平台編寫程式的架構,此異構平台可由CPUI、GPU或其他類型的處理器組成。 OpenCL由一門用於編寫kernels (在OpenCL裝置上啟動並執行函數)的語言(基於C99)和一組用於定義並 控制平台的API組成。
OpenCL提供了兩種層面的並行機制:任務並行與資料並行。
2.OpenCL與CUDA的區別
不同點:OpenCL是通用的異構平台程式設計語言,為了兼顧不同裝置,使用繁瑣。
CUDA是nvidia公司發明的專門在其GPGPU上的編程的架構,使用簡單,好入門。
相同點:都是基於任務並行與資料並行。
3.OpenCL的編程步驟
(1)Discover and initialize the platforms
調用兩次clGetPlatformIDs函數,第一次擷取可用的平台數量,第二次擷取一個可用的平台。
(2)Discover and initialize the devices
調用兩次clGetDeviceIDs函數,第一次擷取可用的裝置數量,第二次擷取一個可用的裝置。
(3)Create a context(調用clCreateContext函數)
上下文context可能會管理多個裝置device。
(4)Create a command queue(調用clCreateCommandQueue函數)
一個裝置device對應一個command queue。
上下文conetxt將命令發送到裝置對應的command queue,裝置就可以執行命令隊列裡的命令。
(5)Create device buffers(調用clCreateBuffer函數)
Buffer中儲存的是資料對象,就是裝置執行程式需要的資料儲存在其中。
Buffer由上下文conetxt建立,這樣上下文管理的多個裝置就會共用Buffer中的資料。
(6)Write host data to device buffers(調用clEnqueueWriteBuffer函數)
(7)Create and compile the program
建立程式對象,程式對象就代表你的程式源檔案或者二進位代碼資料。
(8)Create the kernel(調用clCreateKernel函數)
根據你的程式對象,產生kernel對象,表示裝置程式的入口。
(9)Set the kernel arguments(調用clSetKernelArg函數)
(10)Configure the work-item structure(設定worksize)
配置work-item的組織形式(維數,group組成等)
(11)Enqueue the kernel for execution(調用clEnqueueNDRangeKernel函數)
將kernel對象,以及 work-item參數放入命令隊列中進行執行。
(12)Read the output buffer back to the host(調用clEnqueueReadBuffer函數)
(13)Release OpenCL resources(至此結束整個運行過程)