我正嘗試在opencl上使用2D網格和塊。在cuda上很容易,但在OpenCl上它很混亂。我試圖用2x2的網格,每塊有4×4線程:opencl上的2D網格塊
size_t **global_item_size2 = malloc (2 * sizeof(size_t *) + (2 * (2 * sizeof(size_t))));
size_t **local_item_size2 = malloc (4 * sizeof(size_t *) + (4 * (4 * sizeof(size_t))));
clEnqueueNDRangeKernel(commandQueue, myKernel, 2, NULL, (size_t*)&*global_item_size2, (size_t*)&*local_item_size2, 0, NULL, &event);
它編譯,但是當我試圖運行我得到
錯誤@ clEnqueueNDRangeKernel:CL_INVALID_WORK_GROUP_SIZE
如何使用OpenCl上的2D塊和2D網格?
global_item_size2應該是必須只有兩個值,你的問題的數組。第一個值是X維的大小,第二個是Y維大小。所以你malloc只有2個元素,並分配「4」和「4」有一個4x4工作區域排隊命令。同樣適用於本地。(如2元素aray中的2和2)實際的數據陣列信息由另一個命令使用/讀取/寫入。 sizeof(size_t *)在這裏也是錯誤的。你使用它來進行讀/寫緩衝操作,這將是sizeof(cl_float)或類似的。 –
因此,它期望在數組的前兩個元素中有兩個數字(x,y維度大小),但會發現垃圾。只需在裏面放一個「new size_t [] {4,4}」來檢查它是否有效,然後你就可以清理代碼來清理2元素泄漏。 –
您將全局設置爲2x2,將本地設置爲4x4,即不可以。 Global是線程總數,所以它應該是8x8。 – DarkZeros