diff --git a/src/metric/rank_metric.cc b/src/metric/rank_metric.cc index 193938c0f8e6..797a1d54ac84 100644 --- a/src/metric/rank_metric.cc +++ b/src/metric/rank_metric.cc @@ -192,28 +192,32 @@ struct EvalRank : public Metric, public EvalRankConfig { } } + CHECK(tparam_); + std::vector sum_tloc(tparam_->Threads(), 0.0); + if (!rank_gpu_ || tparam_->gpu_id < 0) { const auto &labels = info.labels_.ConstHostVector(); const auto &h_preds = preds.ConstHostVector(); dmlc::OMPException exc; - #pragma omp parallel reduction(+:sum_metric) +#pragma omp parallel num_threads(tparam_->Threads()) { exc.Run([&]() { // each thread takes a local rec PredIndPairContainer rec; - #pragma omp for schedule(static) +#pragma omp for schedule(static) for (bst_omp_uint k = 0; k < ngroups; ++k) { exc.Run([&]() { rec.clear(); for (unsigned j = gptr[k]; j < gptr[k + 1]; ++j) { rec.emplace_back(h_preds[j], static_cast(labels[j])); } - sum_metric += this->EvalGroup(&rec); + sum_tloc[omp_get_thread_num()] += this->EvalGroup(&rec); }); } }); } + sum_metric = std::accumulate(sum_tloc.cbegin(), sum_tloc.cend(), 0.0); exc.Rethrow(); }