diff --git a/modules/ocl/src/opencl/brute_force_match.cl b/modules/ocl/src/opencl/brute_force_match.cl index edc0bd147..8dcb9d207 100644 --- a/modules/ocl/src/opencl/brute_force_match.cl +++ b/modules/ocl/src/opencl/brute_force_match.cl @@ -62,15 +62,12 @@ #define DIST_TYPE 0 #endif -int bit1Count(int x) +//http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel +int bit1Count(int v) { - int c = 0; - for (int i = 0 ; i < 32 ; i++) - { - c += x & 1; - x >>= 1; - } - return c; + v = v - ((v >> 1) & 0x55555555); // reuse input as temporary + v = (v & 0x33333333) + ((v >> 2) & 0x33333333); // temp + return ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count } // dirty fix for non-template support