OpenCL學習筆記(7)--內核函數

1.內核函數的整體結構就像是一個正常的C函數,他也是由函數名,括號所包含的參數列表以及花括號所包含的可執行的語句所構成,但兩者之間還是有以下三個主要不同點:
(1)每個內核函數的聲明都是以_kernel開頭;
(2)每個內核函數的返回類型都必須是void類型;
(3)有些平臺將會拒絕編譯那些不帶參數的內核函數;

2.內核函數並不需要單獨保存在另外的文件中,關鍵詞_kernel實際上是提醒編譯器,這個函數將會在設備,並非主機上運行。函數clSetKernelArg能夠爲內核設置參數,但卻沒有哪個函數能夠訪問內核函數的返回值。因爲內核函數根本沒有返回值–內核函數的返回值類型是void型。一個內核函數只能是通過其參數來訪問數據、返回數據,如果編譯的函數沒有參數,有些編譯器會運行報錯。

3.和一般的C函數一樣,內核函數也可以通過值傳遞和引用傳遞這兩種方式來傳遞參數:
(1)如果是值傳遞,需要提供實際的數據,char型,int型,還是float型數據。內核參數不支持複合結構體。
(2)如果是引用傳遞,需要提供一個指針,指向數據所在的設備內存空間(一般是一個內存對象)

4.所有傳遞給內核的指針都必須經過地址空間限定符的處理。這將告訴設備,保存參數的地址空間的情況。四個
地址空間限定符:__global,__constant,__local,以及__private.

5.在設備執行完所入列的內核函數之後,主機程序將調用clEnqueueReadBuffer函數來訪問緩存數據。

6.Opencl標量數據類型:
int–補碼錶示的32位有符號整數
unsigned int/uint–補碼錶示的32位無符號整數
size_t–操作符大小得到的無符號整數
void–無類型數據

7.如果設備支持cl_khr_fp64擴展,內核函數便儘可能使用double數據類型,如果不支持,內核函數將改用float類型。

8.主機程序還將檢查目標設備的數據總線寬度,這點對於在比特水平上處理size_t,ptrdiff_t類型的數據而言十分重要,size_t/ptrdiff_t類型的數據在64位系統和32位系統上分別爲64位寬和32位寬。

9.如果數據操作涉及字節順序,例如用指針訪問數據,便需要確定目標設備的字節順序,這個參數將說明內存地址高位低位存儲的相對關係。X86設備都是小端模式(04,03,02,01)的數據存儲結構,大端模式爲(01,02,03,04).

10.確定設備是大端順序還是小端模式一般有兩種方法:在主機端,調用clGetDeviceInfo函數,設置CL_DEVICE_ENDIAN_LITTLE參數即可,如果返回值爲CL_TRUE,說明設備爲小端順序,CL_FALSE則爲大端模式。

11.內核端可以用#ifdef的辦法來確定__ENDIAN_LITTLE__宏是否被定義。如果設備定義了__ENDIAN_LITTLE__宏,則爲小端設備,反之,則爲大端設備。**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章