2013-12-12 44 views
1

我正嘗試在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網格?

+0

global_item_size2應該是必須只有兩個值,你的問題的數組。第一個值是X維的大小,第二個是Y維大小。所以你malloc只有2個元素,並分配「4」和「4」有一個4x4工作區域排隊命令。同樣適用於本地。(如2元素aray中的2和2)實際的數據陣列信息由另一個命令使用/讀取/寫入。 sizeof(size_t *)在這裏也是錯誤的。你使用它來進行讀/寫緩衝操作,這將是sizeof(cl_float)或類似的。 –

+0

因此,它期望在數組的前兩個元素中有兩個數字(x,y維度大小),但會發現垃圾。只需在裏面放一個「new size_t [] {4,4}」來檢查它是否有效,然後你就可以清理代碼來清理2元素泄漏。 –

+0

您將全局設置爲2x2,將本地設置爲4x4,即不可以。 Global是線程總數,所以它應該是8x8。 – DarkZeros

回答

1

你應該做的是這樣的:(純C修訂版)

//Create the size holders 
size_t * global = (size_t*) malloc(sizeof(size_t)*2); 
size_t * local = (size_t*) malloc(sizeof(size_t)*2); 

//Set the size 
global[0] = 8; global[1] = 8; 
local [0] = 4; local [1] = 4; 

//Run 
clEnqueueNDRangeKernel(commandQueue, myKernel, 2, NULL, global, local, 0, NULL, &event); 

//Clean the size holders 
free(global); 
free(local); 

此外,您的觀念是錯誤的:

  • 總工作的項目數是全球尺寸
  • 全球全球尺寸細分爲工作組進行處理,每個工作組由當地尺寸

所以它應該是8x8的全球性的,4x4的地方,給它的2x2工作組。

8×8(全球)= 4×4(本地)* 2×2(組)

+0

我不能使用'新'有一個編譯錯誤,我想我必須使用malloc。感謝您的幫助 –

+0

Ups,是的,如果你是PURE C,那麼你必須使用malloc。我用C更新了這個例子。 – DarkZeros