diff --git a/modules/core/src/kmeans.cpp b/modules/core/src/kmeans.cpp index 495ff5e3c1..10c087434d 100644 --- a/modules/core/src/kmeans.cpp +++ b/modules/core/src/kmeans.cpp @@ -42,12 +42,16 @@ //M*/ #include "precomp.hpp" +#include ////////////////////////////////////////// kmeans //////////////////////////////////////////// namespace cv { +static int CV_KMEANS_PARALLEL_GRANULARITY = (int)utils::getConfigurationParameterSizeT("OPENCV_KMEANS_PARALLEL_GRANULARITY", 1000); + + static void generateRandomCenter(const std::vector& box, float* center, RNG& rng) { size_t j, dims = box.size(); @@ -134,7 +138,8 @@ static void generateCentersPP(const Mat& _data, Mat& _out_centers, int ci = i; 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++ ) { s += tdist2[i]; @@ -447,7 +452,8 @@ double cv::kmeans( InputArray _data, int K, // assign labels dists = 0; double* dist = dists.ptr(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]; if (isLastIter)