__kernel void FindOddQty(__global int *data, __local int* local_result, __global int* group_result, const int arraySize) { int sum; int localSize = get_local_size(0); int numGroups = get_num_groups(0); int localID = get_local_id(0); int groupID = get_group_id(0); int startPos, workAmount, endPos; workAmount = arraySize / numGroups; startPos = groupID * workAmount + localID; endPos = (groupID + 1) * workAmount; // I.e. The start of the next work item if (endPos > arraySize) endPos = arraySize; int val = 0; for (int i = startPos; i < endPos; i += localSize) { val += data[i] & 1; } local_result[localID] = val; barrier(CLK_LOCAL_MEM_FENCE); if(localID == 0) { sum = 0.0f; for (int i = 0; i < localSize; i++) { sum += local_result[i]; } group_result[groupID] = sum; } }