cl_mem, program, kernel 都是在context下創建, 可用於這個context下的所有device上;
一個OpenCL kernel, 大概可以分爲兩類, 一類是對workgroup屬性沒有要求的,這種kernel就相當於不劃分workgroup也一樣,每個workitem計算的執行完全一樣;
另一類是對workgroup的大小和個數有要求的, 或這對其中之一有要求,比如是某整數倍等;
後面這種情況下的劃分, 同時也就決定了輸入 cl_mem 和 輸出cl_mem 對實際要計算數據的佈局 (因爲選定了workgroup個數後, 所有workitem覆蓋的計算範圍一定大於等於輸入和輸出cl_mem), 佈局比如說是 實際計算的數據在cl_mem的中間,或靠左靠右靠上靠下,或靠一個角,都有可能;
單不管是哪一種, 數據大小和cl_mem的留白大小也是各種可能;
因此 一般情況下, 一個kernel的參數大概可以分爲三類, 一類似是輸入輸出cl_mem 和 local cl_mem; 二是描述比如留白決定的比如跨距等一類的信息,具體決定item怎麼取操作cl_mem; 三就是計算類的參數, 比如循環次數,固定的傳參等等;