Commit 51eba617 authored by Vadim Pisarevsky's avatar Vadim Pisarevsky

a part of PR269 (parallelization of several functions) by Alexander Mordvintsev

parent b179e2dd
...@@ -2459,7 +2459,7 @@ static void generateRandomCenter(const vector<Vec2f>& box, float* center, RNG& r ...@@ -2459,7 +2459,7 @@ static void generateRandomCenter(const vector<Vec2f>& box, float* center, RNG& r
center[j] = ((float)rng*(1.f+margin*2.f)-margin)*(box[j][1] - box[j][0]) + box[j][0]; center[j] = ((float)rng*(1.f+margin*2.f)-margin)*(box[j][1] - box[j][0]) + box[j][0];
} }
class KMeansPPDistanceComputer class KMeansPPDistanceComputer : public ParallelLoopBody
{ {
public: public:
KMeansPPDistanceComputer( float *_tdist2, KMeansPPDistanceComputer( float *_tdist2,
...@@ -2475,10 +2475,10 @@ public: ...@@ -2475,10 +2475,10 @@ public:
step(_step), step(_step),
stepci(_stepci) { } stepci(_stepci) { }
void operator()( const cv::BlockedRange& range ) const void operator()( const cv::Range& range ) const
{ {
const int begin = range.begin(); const int begin = range.start;
const int end = range.end(); const int end = range.end;
for ( int i = begin; i<end; i++ ) for ( int i = begin; i<end; i++ )
{ {
...@@ -2534,7 +2534,7 @@ static void generateCentersPP(const Mat& _data, Mat& _out_centers, ...@@ -2534,7 +2534,7 @@ static void generateCentersPP(const Mat& _data, Mat& _out_centers,
break; break;
int ci = i; int ci = i;
parallel_for(BlockedRange(0, N), parallel_for_(Range(0, N),
KMeansPPDistanceComputer(tdist2, data, dist, dims, step, step*ci)); KMeansPPDistanceComputer(tdist2, data, dist, dims, step, step*ci));
for( i = 0; i < N; i++ ) for( i = 0; i < N; i++ )
{ {
...@@ -2562,7 +2562,7 @@ static void generateCentersPP(const Mat& _data, Mat& _out_centers, ...@@ -2562,7 +2562,7 @@ static void generateCentersPP(const Mat& _data, Mat& _out_centers,
} }
} }
class KMeansDistanceComputer class KMeansDistanceComputer : public ParallelLoopBody
{ {
public: public:
KMeansDistanceComputer( double *_distances, KMeansDistanceComputer( double *_distances,
...@@ -2576,10 +2576,10 @@ public: ...@@ -2576,10 +2576,10 @@ public:
{ {
} }
void operator()( const BlockedRange& range ) const void operator()( const Range& range ) const
{ {
const int begin = range.begin(); const int begin = range.start;
const int end = range.end(); const int end = range.end;
const int K = centers.rows; const int K = centers.rows;
const int dims = centers.cols; const int dims = centers.cols;
...@@ -2836,7 +2836,7 @@ double cv::kmeans( InputArray _data, int K, ...@@ -2836,7 +2836,7 @@ double cv::kmeans( InputArray _data, int K,
// assign labels // assign labels
Mat dists(1, N, CV_64F); Mat dists(1, N, CV_64F);
double* dist = dists.ptr<double>(0); double* dist = dists.ptr<double>(0);
parallel_for(BlockedRange(0, N), parallel_for_(Range(0, N),
KMeansDistanceComputer(dist, labels, data, centers)); KMeansDistanceComputer(dist, labels, data, centers));
compactness = 0; compactness = 0;
for( i = 0; i < N; i++ ) for( i = 0; i < N; i++ )
......
...@@ -1726,7 +1726,7 @@ typedef void (*BatchDistFunc)(const uchar* src1, const uchar* src2, size_t step2 ...@@ -1726,7 +1726,7 @@ typedef void (*BatchDistFunc)(const uchar* src1, const uchar* src2, size_t step2
int nvecs, int len, uchar* dist, const uchar* mask); int nvecs, int len, uchar* dist, const uchar* mask);
struct BatchDistInvoker struct BatchDistInvoker : public ParallelLoopBody
{ {
BatchDistInvoker( const Mat& _src1, const Mat& _src2, BatchDistInvoker( const Mat& _src1, const Mat& _src2,
Mat& _dist, Mat& _nidx, int _K, Mat& _dist, Mat& _nidx, int _K,
...@@ -1743,12 +1743,12 @@ struct BatchDistInvoker ...@@ -1743,12 +1743,12 @@ struct BatchDistInvoker
func = _func; func = _func;
} }
void operator()(const BlockedRange& range) const void operator()(const Range& range) const
{ {
AutoBuffer<int> buf(src2->rows); AutoBuffer<int> buf(src2->rows);
int* bufptr = buf; int* bufptr = buf;
for( int i = range.begin(); i < range.end(); i++ ) for( int i = range.start; i < range.end; i++ )
{ {
func(src1->ptr(i), src2->ptr(), src2->step, src2->rows, src2->cols, func(src1->ptr(i), src2->ptr(), src2->step, src2->rows, src2->cols,
K > 0 ? (uchar*)bufptr : dist->ptr(i), mask->data ? mask->ptr(i) : 0); K > 0 ? (uchar*)bufptr : dist->ptr(i), mask->data ? mask->ptr(i) : 0);
...@@ -1899,8 +1899,8 @@ void cv::batchDistance( InputArray _src1, InputArray _src2, ...@@ -1899,8 +1899,8 @@ void cv::batchDistance( InputArray _src1, InputArray _src2,
("The combination of type=%d, dtype=%d and normType=%d is not supported", ("The combination of type=%d, dtype=%d and normType=%d is not supported",
type, dtype, normType)); type, dtype, normType));
parallel_for(BlockedRange(0, src1.rows), parallel_for_(Range(0, src1.rows),
BatchDistInvoker(src1, src2, dist, nidx, K, mask, update, func)); BatchDistInvoker(src1, src2, dist, nidx, K, mask, update, func));
} }
......
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