Have you played with supplying an explicit group size and handling edge cases yourself? Many implementations handle an unspecified local size poorly. (Gotcha: Apple CPU will only ever use local_size==1, relying on you to vectorize by hand.)