diff --git a/include/diy/detail/algorithms/kdtree.hpp b/include/diy/detail/algorithms/kdtree.hpp index 733dcbbabd4fed082d843bdfb8f3267f2d887a87..2a46c400100904bec841f12d35f5465050df8b67 100644 --- a/include/diy/detail/algorithms/kdtree.hpp +++ b/include/diy/detail/algorithms/kdtree.hpp @@ -445,15 +445,18 @@ enqueue_exchange(Block* b, const diy::ReduceProxy& srp, int dim, const Histogram size_t cur = 0; float width = (link->core().max[dim] - link->core().min[dim])/bins_; float split = 0; - for (size_t i = 0; i < histogram.size(); ++i) + size_t i = 0; + for (; i < histogram.size(); ++i) { if (cur + histogram[i] > total/2) - { - split = link->core().min[dim] + width*i; break; - } cur += histogram[i]; } + if (i == 0) + ++i; + else if (i >= histogram.size() - 1) + i = histogram.size() - 2; + split = link->core().min[dim] + width*i; log->trace("Found split: {} (dim={}) in {} - {}", split, dim, link->core().min[dim], link->core().max[dim]); // subset and enqueue