diff --git a/openbr/openbr_plugin.cpp b/openbr/openbr_plugin.cpp index 608fc8a..ac47eda 100644 --- a/openbr/openbr_plugin.cpp +++ b/openbr/openbr_plugin.cpp @@ -802,6 +802,8 @@ void br::Context::setProperty(const QString &key, const QString &value) if (key == "parallelism") { const int maxThreads = std::max(1, QThread::idealThreadCount()); + if (parallelism == 0) parallelism = 1; + QThreadPool::globalInstance()->setMaxThreadCount(parallelism ? std::min(maxThreads, abs(parallelism)) : maxThreads); } else if (key == "log") { logFile.close(); @@ -1193,8 +1195,7 @@ private: QFutureSynchronizer futures; for (int i=0; iparallelism) futures.addFuture(QtConcurrent::run(_train, transforms[i], &templatesList[i])); - else _train (transforms[i], &templatesList[i]); + futures.addFuture(QtConcurrent::run(_train, transforms[i], &templatesList[i])); } futures.waitForFinished(); } @@ -1308,21 +1309,12 @@ void Transform::project(const TemplateList &src, TemplateList &dst) const { dst.reserve(src.size()); - // There are certain conditions where we should process the templates in serial, - // but generally we'd prefer to process them in parallel. - if ((src.size() < 2) || (Globals->parallelism == 0)) { - foreach (const Template &t, src) { - dst.append(Template()); - _project(this, &t, &dst.last()); - } - } else { - for (int i=0; i futures; - for (int i=0; i futures; + for (int i=0; i futures; for (int i=0; iparallelism) futures.addFuture(QtConcurrent::run(_backProject, this, &dst[i], &src[i])); - else _backProject (this, &dst[i], &src[i]); + futures.addFuture(QtConcurrent::run(_backProject, this, &dst[i], &src[i])); futures.waitForFinished(); } diff --git a/openbr/plugins/distance.cpp b/openbr/plugins/distance.cpp index cb07e12..f0eb470 100644 --- a/openbr/plugins/distance.cpp +++ b/openbr/plugins/distance.cpp @@ -158,8 +158,7 @@ class PipeDistance : public Distance { QFutureSynchronizer futures; foreach (br::Distance *distance, distances) - if (Globals->parallelism) futures.addFuture(QtConcurrent::run(distance, &Distance::train, data)); - else distance->train(data); + futures.addFuture(QtConcurrent::run(distance, &Distance::train, data)); futures.waitForFinished(); } diff --git a/openbr/plugins/draw.cpp b/openbr/plugins/draw.cpp index 82d7edd..e81c09c 100644 --- a/openbr/plugins/draw.cpp +++ b/openbr/plugins/draw.cpp @@ -98,6 +98,7 @@ class DrawGridTransform : public UntrainableTransform BR_REGISTER(Transform, DrawGridTransform) +#if 0 /*! * \ingroup transforms * \brief Remove landmarks. @@ -162,6 +163,7 @@ Template EditTransform::currentTemplate; QMutex EditTransform::currentTemplateLock; BR_REGISTER(Transform, EditTransform) +#endif } // namespace br diff --git a/openbr/plugins/gallery.cpp b/openbr/plugins/gallery.cpp index 07ef58e..e950943 100644 --- a/openbr/plugins/gallery.cpp +++ b/openbr/plugins/gallery.cpp @@ -107,8 +107,7 @@ class EmptyGallery : public Gallery QList< QFuture > futures; foreach (const QString &folder, NaturalStringSort(dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))) { const QDir subdir = dir.absoluteFilePath(folder); - if (Globals->parallelism) futures.append(QtConcurrent::run(&EmptyGallery::getTemplates, subdir)); - else templates.append(getTemplates(subdir)); + futures.append(QtConcurrent::run(&EmptyGallery::getTemplates, subdir)); } foreach (const QFuture &future, futures) templates.append(future.result()); diff --git a/openbr/plugins/meta.cpp b/openbr/plugins/meta.cpp index 59b3cb3..83526f4 100644 --- a/openbr/plugins/meta.cpp +++ b/openbr/plugins/meta.cpp @@ -109,8 +109,7 @@ class PipeTransform : public CompositeTransform fprintf(stderr, " projecting..."); QFutureSynchronizer futures; for (int j=0; jparallelism) futures.addFuture(QtConcurrent::run(this, &PipeTransform::_projectPartial, ©[j], i, nextTrainableTransform)); - else _projectPartial( ©[j], i, nextTrainableTransform); + futures.addFuture(QtConcurrent::run(this, &PipeTransform::_projectPartial, ©[j], i, nextTrainableTransform)); futures.waitForFinished(); i = nextTrainableTransform; } @@ -289,8 +288,7 @@ class ForkTransform : public CompositeTransform if (!trainable) return; QFutureSynchronizer futures; for (int i=0; iparallelism) futures.addFuture(QtConcurrent::run(_train, transforms[i], &data)); - else _train (transforms[i], &data); + futures.addFuture(QtConcurrent::run(_train, transforms[i], &data)); } futures.waitForFinished(); } diff --git a/openbr/plugins/misc.cpp b/openbr/plugins/misc.cpp index 63b2664..400e9e3 100644 --- a/openbr/plugins/misc.cpp +++ b/openbr/plugins/misc.cpp @@ -328,6 +328,7 @@ class AnonymizeTransform : public UntrainableMetaTransform BR_REGISTER(Transform, AnonymizeTransform) +#if 0 /*! * \ingroup transforms * \brief Name a point @@ -375,6 +376,7 @@ class ElicitMetadataTransform : public UntrainableMetaTransform }; BR_REGISTER(Transform, ElicitMetadataTransform) +#endif /*! * \ingroup transforms diff --git a/openbr/plugins/normalize.cpp b/openbr/plugins/normalize.cpp index a3f4942..057e016 100644 --- a/openbr/plugins/normalize.cpp +++ b/openbr/plugins/normalize.cpp @@ -137,11 +137,9 @@ private: } QFutureSynchronizer futures; - const bool parallel = (data.size() > 1000) && Globals->parallelism; for (size_t c = 0; c < mv.size(); c++) { for (int i=0; i(0, i), &bv[c].at(0, i))); - else _train (method, mv[c].col(i), labels, &av[c].at(0, i), &bv[c].at(0, i)); + futures.addFuture(QtConcurrent::run(_train, method, mv[c].col(i), labels, &av[c].at(0, i), &bv[c].at(0, i))); av[c] = av[c].reshape(1, data.first().m().rows); bv[c] = bv[c].reshape(1, data.first().m().rows); } diff --git a/openbr/plugins/quantize.cpp b/openbr/plugins/quantize.cpp index 2a37edc..decffa3 100644 --- a/openbr/plugins/quantize.cpp +++ b/openbr/plugins/quantize.cpp @@ -82,8 +82,7 @@ class HistEqQuantizationTransform : public Transform QFutureSynchronizer futures; for (int i=0; iparallelism) futures.addFuture(QtConcurrent::run(&HistEqQuantizationTransform::computeThresholds, data.col(i), &thresholds.data()[i*256])); - else computeThresholds( data.col(i), &thresholds.data()[i*256]); + futures.addFuture(QtConcurrent::run(&HistEqQuantizationTransform::computeThresholds, data.col(i), &thresholds.data()[i*256])); futures.waitForFinished(); } @@ -156,8 +155,7 @@ class BayesianQuantizationDistance : public Distance QFutureSynchronizer futures; for (int i=0; iparallelism) futures.addFuture(QtConcurrent::run(&BayesianQuantizationDistance::computeLogLikelihood, data.col(i), templateLabels, &loglikelihoods.data()[i*256])); - else computeLogLikelihood( data.col(i), templateLabels, &loglikelihoods.data()[i*256]); + futures.addFuture(QtConcurrent::run(&BayesianQuantizationDistance::computeLogLikelihood, data.col(i), templateLabels, &loglikelihoods.data()[i*256])); futures.waitForFinished(); } diff --git a/openbr/plugins/quantize2.cpp b/openbr/plugins/quantize2.cpp index d392810..f6e69f1 100644 --- a/openbr/plugins/quantize2.cpp +++ b/openbr/plugins/quantize2.cpp @@ -83,8 +83,7 @@ class BayesianQuantizationTransform : public Transform QFutureSynchronizer futures; for (int i=0; iparallelism) futures.addFuture(QtConcurrent::run(&BayesianQuantizationTransform::computeThresholds, data.col(i), labels, &thresholds.data()[i*256])); - else computeThresholds( data.col(i), labels, &thresholds.data()[i*256]); + futures.addFuture(QtConcurrent::run(&BayesianQuantizationTransform::computeThresholds, data.col(i), labels, &thresholds.data()[i*256])); futures.waitForFinished(); } diff --git a/openbr/plugins/stasm.cpp b/openbr/plugins/stasm.cpp index 483968d..2be406b 100644 --- a/openbr/plugins/stasm.cpp +++ b/openbr/plugins/stasm.cpp @@ -33,7 +33,7 @@ BR_REGISTER(Initializer, StasmInitializer) * \brief Wraps STASM key point detector * \author Scott Klum \cite sklum */ - +#if 0 class StasmTransform : public UntrainableTransform { Q_OBJECT @@ -67,6 +67,7 @@ class StasmTransform : public UntrainableTransform }; BR_REGISTER(Transform, StasmTransform) +#endif } // namespace br diff --git a/openbr/plugins/validate.cpp b/openbr/plugins/validate.cpp index ea1b6de..83efc34 100644 --- a/openbr/plugins/validate.cpp +++ b/openbr/plugins/validate.cpp @@ -46,8 +46,7 @@ class CrossValidateTransform : public MetaTransform if (partitions[j] == i) partitionedData.removeAt(j); // Train on the remaining templates - if (Globals->parallelism) futures.addFuture(QtConcurrent::run(transforms[i], &Transform::train, partitionedData)); - else transforms[i]->train(partitionedData); + futures.addFuture(QtConcurrent::run(transforms[i], &Transform::train, partitionedData)); } futures.waitForFinished(); }