Commit 46470d92 authored by Alexander Alekhin's avatar Alexander Alekhin

core: fix kmeans multi-threaded performance

parent a5cd62f7
...@@ -42,12 +42,16 @@ ...@@ -42,12 +42,16 @@
//M*/ //M*/
#include "precomp.hpp" #include "precomp.hpp"
#include <opencv2/core/utils/configuration.private.hpp>
////////////////////////////////////////// kmeans //////////////////////////////////////////// ////////////////////////////////////////// kmeans ////////////////////////////////////////////
namespace cv namespace cv
{ {
static int CV_KMEANS_PARALLEL_GRANULARITY = (int)utils::getConfigurationParameterSizeT("OPENCV_KMEANS_PARALLEL_GRANULARITY", 1000);
static void generateRandomCenter(const std::vector<Vec2f>& box, float* center, RNG& rng) static void generateRandomCenter(const std::vector<Vec2f>& box, float* center, RNG& rng)
{ {
size_t j, dims = box.size(); size_t j, dims = box.size();
...@@ -134,7 +138,8 @@ static void generateCentersPP(const Mat& _data, Mat& _out_centers, ...@@ -134,7 +138,8 @@ static void generateCentersPP(const Mat& _data, Mat& _out_centers,
int ci = i; int ci = i;
parallel_for_(Range(0, N), parallel_for_(Range(0, N),
KMeansPPDistanceComputer(tdist2, data, dist, dims, step, step*ci)); KMeansPPDistanceComputer(tdist2, data, dist, dims, step, step*ci),
divUp(dims * N, CV_KMEANS_PARALLEL_GRANULARITY));
for( i = 0; i < N; i++ ) for( i = 0; i < N; i++ )
{ {
s += tdist2[i]; s += tdist2[i];
...@@ -447,7 +452,8 @@ double cv::kmeans( InputArray _data, int K, ...@@ -447,7 +452,8 @@ double cv::kmeans( InputArray _data, int K,
// assign labels // assign labels
dists = 0; dists = 0;
double* dist = dists.ptr<double>(0); double* dist = dists.ptr<double>(0);
parallel_for_(Range(0, N), KMeansDistanceComputer(dist, labels, data, centers, isLastIter)); parallel_for_(Range(0, N), KMeansDistanceComputer(dist, labels, data, centers, isLastIter),
divUp(dims * N * (isLastIter ? 1 : K), CV_KMEANS_PARALLEL_GRANULARITY));
compactness = sum(dists)[0]; compactness = sum(dists)[0];
if (isLastIter) if (isLastIter)
......
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