From 6dd601354658fa51f08775d1fe0bbd636708efeb Mon Sep 17 00:00:00 2001 From: Peng Xiao Date: Sat, 13 Apr 2013 14:34:30 +0800 Subject: [PATCH] Use a faster way to count 1's (used by Hamming) --- modules/ocl/src/opencl/brute_force_match.cl | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) 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