PDA

View Full Version : work group size question.."CL_INVALID_WORK_GROUP_SIZE"



phoebe0105
06-03-2010, 01:01 PM
In my source code, I just use two work-items.
global work size is 50 and local work size is also 50.

But I'm not success in my source code. :cry:

If I call the clEnqueueNDRangeKernel() function, this source code is occured "CL_INVALID_WORK_GROUP_SIZE" error.

I don't know why is occured the error.

Please, tell me an advice.

david.garcia
06-03-2010, 02:31 PM
Can you show us the parameters that you passed to clEnqueueNDRangeKernel()?

Also, have you tried passing 0 as the local_work_size argument to clEnqueueNDRangeKernel()?

Finally, what is the value that is returned when you query CL_DEVICE_MAX_WORK_GROUP_SIZE using clGetDeviceInfo()?

phoebe0105
06-03-2010, 10:40 PM
Can you show us the parameters that you passed to clEnqueueNDRangeKernel()?

Also, have you tried passing 0 as the local_work_size argument to clEnqueueNDRangeKernel()?

Finally, what is the value that is returned when you query CL_DEVICE_MAX_WORK_GROUP_SIZE using clGetDeviceInfo()?

the parameter of clEnqueueNDRangeKernel() is that.


Set work-item dimensions
szGlobalWorkSize[0] = (iWidth/16); //iWidth=800
szGlobalWorkSize[1] = (iHeight/16); // iHeight = 800
szLocalWorkSize[0]= NUM_THREADS; //50
szLocalWorkSize[1]= NUM_THREADS; //50

err = clEnqueueNDRangeKernel(oclHandles.queue,
m_clHexEncodeKernel,
2, NULL,
szGlobalWorkSize,
szLocalWorkSize,
0, NULL, NULL);



I try to use clGetDeviceInfo(), then I get the max work group size.
The max work group size is 512.


// device Info
size_t returned_size = 0;
size_t max_workgroup_size = 0;
err = clGetDeviceInfo(*oclHandles.devices, CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(size_t), &max_workgroup_size, &returned_size);
if (err != CL_SUCCESS)
{
errMsg.SetString(_T("Error: Failed to retrieve device info!\n"));
return EXIT_FAILURE;
}

david.garcia
06-04-2010, 05:17 AM
Your problem is that the local size you are using is not really 50, it is 50x50 = 2500, which is way above the hardware limit of 512.

Use a smaller local size or simply pass zero as the local size:

err = clEnqueueNDRangeKernel(oclHandles.queue,
m_clHexEncodeKernel,
2, NULL,
szGlobalWorkSize,
0,
0, NULL, NULL);