Skip to content

Commit

Permalink
disable parallel kdtree construction on windows
Browse files Browse the repository at this point in the history
  • Loading branch information
koide3 committed May 1, 2024
1 parent de8502f commit 21f963f
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 3 deletions.
16 changes: 15 additions & 1 deletion include/small_gicp/ann/kdtree_omp.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
#include <atomic>
#include <small_gicp/ann/kdtree.hpp>

#ifdef _MSC_VER
#pragma message("warning: Task-based OpenMP parallelism causes run-time memory errors with Eigen matrices.")
#pragma message("warning: Thus, OpenMP-based multi-threading for KdTree construction is disabled on MSVC.")
#endif


namespace small_gicp {

/// @brief Kd-tree builder with OpenMP.
Expand All @@ -23,14 +29,17 @@ struct KdTreeBuilderOMP {
std::atomic_uint64_t node_count = 0;
kdtree.nodes.resize(traits::size(points));

#ifndef _MSC_VER
#pragma omp parallel num_threads(num_threads)
{
#pragma omp single nowait
{
//
kdtree.root = create_node(kdtree, node_count, points, kdtree.indices.begin(), kdtree.indices.begin(), kdtree.indices.end());
}
}
#else
kdtree.root = create_node(kdtree, node_count, points, kdtree.indices.begin(), kdtree.indices.begin(), kdtree.indices.end());
#endif

kdtree.nodes.resize(node_count);
}
Expand Down Expand Up @@ -74,11 +83,16 @@ struct KdTreeBuilderOMP {
node.node_type.sub.thresh = proj(traits::point(points, *median_itr));

// Create left and right child nodes.
#ifndef _MSC_VER
#pragma omp task default(shared) if (N > 512)
node.left = create_node(kdtree, node_count, points, global_first, first, median_itr);
#pragma omp task default(shared) if (N > 512)
node.right = create_node(kdtree, node_count, points, global_first, median_itr, last);
#pragma omp taskwait
#else
node.left = create_node(kdtree, node_count, points, global_first, first, median_itr);
node.right = create_node(kdtree, node_count, points, global_first, median_itr, last);
#endif

return node_index;
}
Expand Down
8 changes: 6 additions & 2 deletions include/small_gicp/ann/projection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ struct AxisAlignedProjection {
Eigen::Vector4d sum_sq = Eigen::Vector4d::Zero();

const size_t step = N < setting.max_scan_count ? 1 : N / setting.max_scan_count;
for (auto itr = first; itr < last; itr += step) {
const size_t num_steps = N / step;
for (int i = 0; i < num_steps; i++) {
const auto itr = first + step * i;
const Eigen::Vector4d pt = traits::point(points, *itr);
sum_pt += pt;
sum_sq += pt.cwiseProduct(pt);
Expand Down Expand Up @@ -71,7 +73,9 @@ struct NormalProjection {
Eigen::Matrix4d sum_sq = Eigen::Matrix4d::Zero();

const size_t step = N < setting.max_scan_count ? 1 : N / setting.max_scan_count;
for (auto itr = first; itr < last; itr += step) {
const size_t num_steps = N / step;
for (int i = 0; i < num_steps; i++) {
const auto itr = first + step * i;
const Eigen::Vector4d pt = traits::point(points, *itr);
sum_pt += pt;
sum_sq += pt * pt.transpose();
Expand Down

0 comments on commit 21f963f

Please sign in to comment.