2013-01-02 21 views
1

我想在我的AMD CPU上使用OpenCL 1.1 C++處理圖像。INVALID_WORK_GROUP_SIZE處理Image2D時

的特點是:

using CPU: AMD Turion(tm) 64 X2 Mobile Technology TL-60 
initCL:CL_DEVICE_IMAGE2D_MAX_WIDTH :8192 
initCL:CL_DEVICE_IMAGE2D_MAX_HEIGHT :8192 
initCL:timer resolution in ns:1 
initCL:CL_DEVICE_GLOBAL_MEM_SIZE in bytes:1975189504 
initCL:CL_DEVICE_GLOBAL_MEM_CACHE_SIZE in bytes:65536 
initCL:CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE in bytes:65536 
initCL:CL_DEVICE_LOCAL_MEM_SIZE in bytes:32768 
initCL:CL_DEVICE_MAX_COMPUTE_UNITS:2 
initCL:CL_DEVICE_MAX_WORK_GROUP_SIZE:1024 
initCL:CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS:3 
initCL:CL_DEVICE_MAX_WORK_ITEM_SIZES:dim=0, size 1024 
initCL:CL_DEVICE_MAX_WORK_ITEM_SIZES:dim=1, size 1024 
initCL:CL_DEVICE_MAX_WORK_ITEM_SIZES:dim=2, size 1024 
createCLKernel:mean_value 
createCLKernel:CL_KERNEL_WORK_GROUP_SIZE:1024 
createCLKernel:CL_KERNEL_LOCAL_MEM_SIZE used by the kernel in bytes:0 
createCLKernel:CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE:1 

內核是暫時空:

__kernel void mean_value(image2d_t p_image,     
        __global ulong4* p_meanValue) 
{ 

} 

執行調用:

cl::NDRange l_globalOffset; 
// The global worksize is the entire image 
cl::NDRange l_globalWorkSize(l_width, l_height); 
// Needs to be determined 
cl::NDRange l_localWorkSize;//(2, 2); 
// Computes the mean value 
cl::Event l_profileEvent; 
gQueue.enqueueNDRangeKernel(gKernelMeanValue, l_globalOffset, l_globalWorkSize, 
    l_localWorkSize, NULL, &l_profileEvent); 

如果l_width=558l_height=328l_localWorkSize不能大於(2,2)否則,我得到這個錯誤:「無效的工作組大小」

是因爲我只有2個內核? 是否有規則確定l_localWorkSize?

+0

這是否只發生在AMD CPU執行?您是否嘗試過使用其他OpenCL驅動程序? –

+0

@TomiAarnio:不,我沒有嘗試其他驅動 –

回答

0

您可以使用clGetDeviceInfo功能檢查兩件事情:

  • CL_DEVICE_MAX_WORK_GROUP_SIZE檢查4是不是太大了您的工作組和

  • CL_DEVICE_MAX_WORK_ITEM_SIZES,以檢查按維數劃分的工作項目數量不算太大。

而事實組大小可侷限於核的數量是有道理的:如果你有間工作項通信/同步,你會希望他們在同一時間執行,否則OpenCL驅動程序將不得不仿效這種情況,這在一般情況下可能至少很難並且可能不可能。

+0

我在我的問題中顯示了這些值。我的顧慮是他們遠遠高於4. –

+0

好吧,對不起沒有花時間去正確地閱讀它:( – Pragmateek

+0

所以這個問題可能是由於工作組的數量:(558 * 328)/(2 * 2)= 45756.並且(1,1)的局部大小有效嗎? – Pragmateek

0

我在OpenCL規範中看到enqueueNDRangeKernel()成功,如果l_globalWorkSize可以被l_localWorkSize整除。就我而言,我可以將它設置爲(2,41)。

+0

對不起沒有提及它(閱讀你的問題的一半,寫了我的答案的一半:)):另外一個原因。但是你用(1,1)進行了測試,它的工作原理是什麼? – Pragmateek

+0

是的。它與(1,1)一起工作。 –

+0

你是完全正確的,它應該是平分的。所以我假設你解決了你的問題,或者你不能將X維度設置爲2以上? – alariq