本文目的
本文將簡單介紹撰寫一般OpenCL程式的流程,并將每個步驟呼叫的API function列出來,
OpenCL程式撰寫流程
1、獲取當前存在的有效的平臺(platform),實際上可以理解為device的發行商,如因特爾、AMD等,(clGetPlatformIDs)
2、選擇獲取到的平臺中的其中一個,獲取該平臺當前存在的有效的設備(device),如CPU、GPU card,(clGetDeviceIDs)
3、創建OpenCL context,context可以理解為是在host上的一個抽象的容器,由它來協調host與device互動的機制,管理device可用的記憶體物件,并跟蹤為每個device創建的程式和內核,(clCreateContext)
4、創建command queue,command queue用來對device發出host想要device去執行的一系列指令,如果是有多個device,則需對每個device創建各自的command queue,(clCreateCommandQueue)
5、創建program,program可以理解為是kernels的集合,如果要執行的kernel有多個的話,則全部放置在一個program里面,創建完成后還需要編譯一下該program看看有沒有存在錯誤,(clCreateProgramWithSource、clBuildProgram)
6、創建kernel物件,kernel物件可以理解為將當前想要執行的某個特定kernel從program里面提取出來,提取的依據是該kernel的名字,想要執行的kernel被提取出來之后還不能立即把它放置到command queue要求device去執行,而是需要先把該kernel的引數設定好(這里并不能像C語言呼叫函式一樣去給引數,而是需要呼叫特定的API function去實作給引數),(clCreateKernel、clSetKernelArg)
7、給完kernel所需的引數后就可以將它放入(enqueue)到command queue里,然后device就會接收到要求,去執行該kernel,(clEnqueueNDRangeKernel)
8、當然,除了以上步驟之外,還需按照需求穿插著和記憶體(memory)相關的操作,如,當需要利用buffer來儲存資料時,首先要創建buffer物件,然后要將host里的資料寫進buffer,寫進資料的實作是將該操作放入(enqueue)command queue里;當kernel運行完成后要從kernel讀出資料到host,也可通過buffer來實作,首先也是創建buffer物件,然后讀出資料的實作也是通過放入(enqueue)command queue來實作,(clCreateBuffer、clEnqueueWriteBuffer、clEnqueueReadBuffer)
附
以上出現的一系列OpenCL API functions都可以在OpenCL的參考檔案(reference pages)中查閱得知具體的用法,在這里附上參考檔案的網址(OpenCL 1.2):
https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/97132.html
標籤:其他
