Commit 55d84cf8 authored by Ilya Lavrenov's avatar Ilya Lavrenov

optimization of cv::minMaxLoc - used min/max

parent effff27c
...@@ -42,9 +42,13 @@ ...@@ -42,9 +42,13 @@
#if wdepth <= 4 #if wdepth <= 4
#define MIN_ABS(a) convertFromU(abs(a)) #define MIN_ABS(a) convertFromU(abs(a))
#define MIN_ABS2(a, b) convertFromU(abs_diff(a, b)) #define MIN_ABS2(a, b) convertFromU(abs_diff(a, b))
#define MIN(a, b) min(a, b)
#define MAX(a, b) max(a, b)
#else #else
#define MIN_ABS(a) fabs(a) #define MIN_ABS(a) fabs(a)
#define MIN_ABS2(a, b) fabs(a - b) #define MIN_ABS2(a, b) fabs(a - b)
#define MIN(a, b) fmin(a, b)
#define MAX(a, b) fmax(a, b)
#endif #endif
#if kercn != 3 #if kercn != 3
...@@ -60,44 +64,41 @@ ...@@ -60,44 +64,41 @@
#define srcTSIZE (int)sizeof(srcT1) #define srcTSIZE (int)sizeof(srcT1)
#endif #endif
#ifdef NEED_MINLOC
#define CALC_MINLOC(inc) minloc = id + inc
#else
#define CALC_MINLOC(inc)
#endif
#ifdef NEED_MAXLOC
#define CALC_MAXLOC(inc) maxloc = id + inc
#else
#define CALC_MAXLOC(inc)
#endif
#ifdef NEED_MINVAL #ifdef NEED_MINVAL
#ifdef NEED_MINLOC
#define CALC_MIN(p, inc) \ #define CALC_MIN(p, inc) \
if (minval > temp.p) \ if (minval > temp.p) \
{ \ { \
minval = temp.p; \ minval = temp.p; \
CALC_MINLOC(inc); \ minloc = id + inc; \
} }
#else #else
#define CALC_MIN(p, inc) \
minval = MIN(minval, temp.p);
#endif
#else
#define CALC_MIN(p, inc) #define CALC_MIN(p, inc)
#endif #endif
#ifdef NEED_MAXVAL #ifdef NEED_MAXVAL
#ifdef NEED_MAXLOC
#define CALC_MAX(p, inc) \ #define CALC_MAX(p, inc) \
if (maxval < temp.p) \ if (maxval < temp.p) \
{ \ { \
maxval = temp.p; \ maxval = temp.p; \
CALC_MAXLOC(inc); \ maxloc = id + inc; \
} }
#else #else
#define CALC_MAX(p, inc) \
maxval = MAX(maxval, temp.p);
#endif
#else
#define CALC_MAX(p, inc) #define CALC_MAX(p, inc)
#endif #endif
#ifdef OP_CALC2 #ifdef OP_CALC2
#define CALC_MAX2(p) \ #define CALC_MAX2(p) \
if (maxval2 < temp.p) \ maxval2 = MAX(maxval2, temp.p);
maxval2 = temp.p;
#else #else
#define CALC_MAX2(p) #define CALC_MAX2(p)
#endif #endif
...@@ -208,25 +209,28 @@ __kernel void minmaxloc(__global const uchar * srcptr, int src_step, int src_off ...@@ -208,25 +209,28 @@ __kernel void minmaxloc(__global const uchar * srcptr, int src_step, int src_off
#if kercn == 1 #if kercn == 1
#ifdef NEED_MINVAL #ifdef NEED_MINVAL
#if NEED_MINLOC
if (minval > temp) if (minval > temp)
{ {
minval = temp; minval = temp;
#ifdef NEED_MINLOC
minloc = id; minloc = id;
#endif
} }
#else
minval = MIN(minval, temp);
#endif
#endif #endif
#ifdef NEED_MAXVAL #ifdef NEED_MAXVAL
#ifdef NEED_MAXLOC
if (maxval < temp) if (maxval < temp)
{ {
maxval = temp; maxval = temp;
#ifdef NEED_MAXLOC
maxloc = id; maxloc = id;
#endif
} }
#else
maxval = MAX(maxval, temp);
#endif
#ifdef OP_CALC2 #ifdef OP_CALC2
if (maxval2 < temp2) maxval2 = MAX(maxval2, temp2);
maxval2 = temp2;
#endif #endif
#endif #endif
#elif kercn >= 2 #elif kercn >= 2
...@@ -282,32 +286,35 @@ __kernel void minmaxloc(__global const uchar * srcptr, int src_step, int src_off ...@@ -282,32 +286,35 @@ __kernel void minmaxloc(__global const uchar * srcptr, int src_step, int src_off
{ {
int lid3 = lid - WGS2_ALIGNED; int lid3 = lid - WGS2_ALIGNED;
#ifdef NEED_MINVAL #ifdef NEED_MINVAL
#ifdef NEED_MINLOC
if (localmem_min[lid3] >= minval) if (localmem_min[lid3] >= minval)
{ {
#ifdef NEED_MINLOC
if (localmem_min[lid3] == minval) if (localmem_min[lid3] == minval)
localmem_minloc[lid3] = min(localmem_minloc[lid3], minloc); localmem_minloc[lid3] = min(localmem_minloc[lid3], minloc);
else else
localmem_minloc[lid3] = minloc, localmem_minloc[lid3] = minloc,
#endif
localmem_min[lid3] = minval; localmem_min[lid3] = minval;
} }
#else
localmem_min[lid3] = MIN(localmem_min[lid3], minval);
#endif
#endif #endif
#ifdef NEED_MAXVAL #ifdef NEED_MAXVAL
#ifdef NEED_MAXLOC
if (localmem_max[lid3] <= maxval) if (localmem_max[lid3] <= maxval)
{ {
#ifdef NEED_MAXLOC
if (localmem_max[lid3] == maxval) if (localmem_max[lid3] == maxval)
localmem_maxloc[lid3] = min(localmem_maxloc[lid3], maxloc); localmem_maxloc[lid3] = min(localmem_maxloc[lid3], maxloc);
else else
localmem_maxloc[lid3] = maxloc, localmem_maxloc[lid3] = maxloc,
#endif
localmem_max[lid3] = maxval; localmem_max[lid3] = maxval;
} }
#else
localmem_max[lid3] = MAX(localmem_max[lid3], maxval);
#endif
#endif #endif
#ifdef OP_CALC2 #ifdef OP_CALC2
if (localmem_max2[lid3] < maxval2) localmem_max2[lid3] = MAX(localmem_max2[lid3], maxval2);
localmem_max2[lid3] = maxval2;
#endif #endif
} }
barrier(CLK_LOCAL_MEM_FENCE); barrier(CLK_LOCAL_MEM_FENCE);
...@@ -319,32 +326,35 @@ __kernel void minmaxloc(__global const uchar * srcptr, int src_step, int src_off ...@@ -319,32 +326,35 @@ __kernel void minmaxloc(__global const uchar * srcptr, int src_step, int src_off
int lid2 = lsize + lid; int lid2 = lsize + lid;
#ifdef NEED_MINVAL #ifdef NEED_MINVAL
#ifdef NEED_MAXLOC
if (localmem_min[lid] >= localmem_min[lid2]) if (localmem_min[lid] >= localmem_min[lid2])
{ {
#ifdef NEED_MINLOC
if (localmem_min[lid] == localmem_min[lid2]) if (localmem_min[lid] == localmem_min[lid2])
localmem_minloc[lid] = min(localmem_minloc[lid2], localmem_minloc[lid]); localmem_minloc[lid] = min(localmem_minloc[lid2], localmem_minloc[lid]);
else else
localmem_minloc[lid] = localmem_minloc[lid2], localmem_minloc[lid] = localmem_minloc[lid2],
#endif
localmem_min[lid] = localmem_min[lid2]; localmem_min[lid] = localmem_min[lid2];
} }
#else
localmem_min[lid] = MIN(localmem_min[lid], localmem_min[lid2]);
#endif
#endif #endif
#ifdef NEED_MAXVAL #ifdef NEED_MAXVAL
#ifdef NEED_MAXLOC
if (localmem_max[lid] <= localmem_max[lid2]) if (localmem_max[lid] <= localmem_max[lid2])
{ {
#ifdef NEED_MAXLOC
if (localmem_max[lid] == localmem_max[lid2]) if (localmem_max[lid] == localmem_max[lid2])
localmem_maxloc[lid] = min(localmem_maxloc[lid2], localmem_maxloc[lid]); localmem_maxloc[lid] = min(localmem_maxloc[lid2], localmem_maxloc[lid]);
else else
localmem_maxloc[lid] = localmem_maxloc[lid2], localmem_maxloc[lid] = localmem_maxloc[lid2],
#endif
localmem_max[lid] = localmem_max[lid2]; localmem_max[lid] = localmem_max[lid2];
} }
#else
localmem_max[lid] = MAX(localmem_max[lid], localmem_max[lid2]);
#endif
#endif #endif
#ifdef OP_CALC2 #ifdef OP_CALC2
if (localmem_max2[lid] < localmem_max2[lid2]) localmem_max2[lid] = MAX(localmem_max2[lid], localmem_max2[lid2]);
localmem_max2[lid] = localmem_max2[lid2];
#endif #endif
} }
barrier(CLK_LOCAL_MEM_FENCE); barrier(CLK_LOCAL_MEM_FENCE);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment