2016-01-06 35 views
0

我是OpenCL的新手,我試圖瞭解由Apple編寫的示例程序here計算適當數量的工作組及其大小OpenCL

該程序的目標是計算輸入數組的每個元素的平方,並將結果寫入新數組。

您可以看到輸入數組的維數爲1024.工作組的數量爲1024,每個組的大小爲最大值CL_KERNEL_WORK_GROUP_SIZE。

任何人都可以解釋我如果在內核中沒有get_local_id()調用,在每個工作組中使用如此多的工作項目有什麼意義?他們可以使用1作爲每個工作組的大小嗎?會有什麼區別?

謝謝。

一些代碼來證明這一點:

// Get the maximum work group size for executing the kernel on the device 
    // 
    err = clGetKernelWorkGroupInfo(kernel, device_id, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, NULL); 


    // Execute the kernel over the entire range of our 1d input data set 
    // using the maximum number of work group items for this device 
    // 
    global = count; 
    err = clEnqueueNDRangeKernel(commands, kernel, 1, NULL, &global, &local, 0, NULL, NULL); 
+0

這不是CUDA,尺寸不是本地*全球,只是全球。全局大小是重要的,內核代碼運行那麼多次。只有當您想分享運行項目的信息並且必須劃分全局大小時,本地大小纔有用。例如,在項目0-1023之間共享一些數據。如果您根本不共享數據,那麼大小並不重要,但由於開銷減少和設備佔用率增加,因此較大的大小是首選。 – DarkZeros

+0

@DarkZeros好吧,我知道了,在這種情況下全局大小很重要,所以clEnqueueNDRangeKernel調用中的local_work_size可以是1或NULL,實際上什麼都不會改變,對吧? – Matt

+1

是的,它。這就是OpenCL允許本地大小爲NULL的原因,因此驅動程序會選擇它認爲最適合性能的大小。 – DarkZeros

回答

1

你的全局工作大小在本地工作的小塊(理論上)執行的,如果你設置1爲當地的工作組大小,那麼它會執行每個本地工作組只有1個線程。在GPU上,工作組匹配計算單位 - 如果您的工作組大小爲1,則您的1個線程可能佔用整個計算單位。這是真的,真的非常慢

+0

因此,在每個工作組上使用1個工作項執行GPU上的代碼比在CPU上執行相同代碼的速度更快,但您仍然可以通過在工作組中完成更多工作來增加工作項的數量。它是否正確? – Matt

+0

重點是:如果我通過蘋果增加了示例中工作項的數量,我將無法獲得效率更好的結果,因爲我沒有使用本地內存。對? – Matt

+1

每個工作組的1個工作項可能比使用CPU慢。 GPU有32個計算核心,所以每個工作組1個工作項可能意味着只有32個「線程」一次運行,這非常緩慢。增加工作組大小將大大提高性能--gpus使用每個工作組線程來運行wave,這將填充GPU上的SIMD資源,並允許您通過合併訪問獲取內存。如果你只使用每個內核1個線程,你會大大利用這些資源 –