2016-10-26 63 views
0

我在我的MacBookPro上有3個OpenCL設備,所以我想用一個小的exsample進行一點點複雜的計算。clEnqueueNDRangeKernel返回CL_INVALID_WORK_GROUP_SIZE

我創建的上下文包含3個設備,其中兩個是GPU,另一個是CPU。然後創建3個命令隊列,一個來自(或爲他們)每個隊列。

然後創建一個大的全局緩衝區,大但不大於任何一個設備中可用的最小緩衝區。然後從輸入緩衝區創建3個子緩衝區,它們的大小都是仔細計算的。另一個不那麼大的輸出緩衝區也被創建,並在其上創建了3個小的子緩衝區。

設置內核後,設置參數等,一切看起來不錯。前兩個設備接受內核並開始運行,但第三個設備拒絕並返回CL_INVALID_WORK_GROUP_SIZE。

我不想在這裏放任何源代碼,因爲它們沒有什麼特別的,我相信它裏面沒有任何錯誤。

我做了一些日誌如下所示:

command queue 0 
device: Iris Pro max work group size 512 
local work size(32 * 16) = 512 
global work size(160 * 48) = 7680 
number of work groups = 15 

command queue 1 
device: GeForce GT 750M max work group size 1024 
local work size(32 * 32) = 1024 
global work size(160 * 96) = 15360 
number of work groups = 15 

command queue 2 
device: Intel(R) Core(TM) i7-4850HQ CPU @ 2.30GHz max work group size 1024 
local work size(32 * 32) = 1024 
global work size(160 * 96) = 15360 
number of work groups = 15 

我檢查了前兩個輸出是否正確不如預期,所以內核和主機代碼必須是正確的。
我只能想到一種可能性,同時使用CPU和GPU時是否有任何限制並共享一個緩衝區對象?

在此先感謝。

回答

0

好吧我找出問題所在。 CPU支持最大工作項大小(1024,1,1),因此本地工作大小不能使用(32x32)。

但使用本地工作尺寸大於(1,1)時仍有問題。繼續嘗試。

+0

除了全球最大的使用它,每個內核可能有它自己的最大本地工作組大小,使用lGetKernelWorkGroupInfo來獲得它我聽說如果你使用障礙,CPU設備將有最大1,1,1 – Dithermaster

+0

我測試了另一個AMD CPU(相當老),它支持1024個工作組大小,但工作項大小爲(1024,1024,10240),它接受內核(32x32),也許英特爾CPU有額外的限制,將再次測試 –

0

從英特爾的OpenCL指南: https://software.intel.com/en-us/node/540486

查詢CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE收益始終爲1,即使沒有阻擋一個非常簡單的內核。在這種情況下,工作組大小可以是128(這是一個一維工作組),但不能是256

結論,最好不要在一些情況下:(

+0

CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE與此無關討論。查看clGetKernelWorkGroupInfo和CL_KERNEL_WORK_GROUP_SIZE。 – Dithermaster

+0

這給了一個提示,爲什麼失敗。也許只有英特爾工程師才能知道發生了什麼事 –