我是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);
這不是CUDA,尺寸不是本地*全球,只是全球。全局大小是重要的,內核代碼運行那麼多次。只有當您想分享運行項目的信息並且必須劃分全局大小時,本地大小纔有用。例如,在項目0-1023之間共享一些數據。如果您根本不共享數據,那麼大小並不重要,但由於開銷減少和設備佔用率增加,因此較大的大小是首選。 – DarkZeros
@DarkZeros好吧,我知道了,在這種情況下全局大小很重要,所以clEnqueueNDRangeKernel調用中的local_work_size可以是1或NULL,實際上什麼都不會改變,對吧? – Matt
是的,它。這就是OpenCL允許本地大小爲NULL的原因,因此驅動程序會選擇它認爲最適合性能的大小。 – DarkZeros