Helios++
Helios software for LiDAR simulations
SAHKDTreeGeometricStrategy Class Reference

Class providing a strategy for geometry-level parallelization of SAH KDTree building. The geometry-level parallelization is the one to be applied on upper tree nodes, where multiple threads work on the building of the same node. More...

#include <SAHKDTreeGeometricStrategy.h>

Inheritance diagram for SAHKDTreeGeometricStrategy:
Collaboration diagram for SAHKDTreeGeometricStrategy:

Public Member Functions

 SAHKDTreeGeometricStrategy (SAHKDTreeFactory &kdtf)
 SAHKDTreeGeometricStrategy default constructor. More...
 
SimpleKDTreeGeometricStrategyclone (SimpleKDTreeFactory *kdtf) const override
 Create a clone of the SAHKDTreeGeometricStrategy. More...
 
- Public Member Functions inherited from SimpleKDTreeGeometricStrategy
 SimpleKDTreeGeometricStrategy (SimpleKDTreeFactory &kdtf)
 SimpleKDTreeGeometricStrategy default constructor. More...
 

Protected Member Functions

void GEOM_defineSplit (KDTreeNode *node, KDTreeNode *parent, vector< Primitive * > &primitives, int const depth, int const assignedThreads) const override
 Geometry-level parallel version of the SAHKDTreeFactory::defineSplit function. More...
 
void GEOM_buildChildrenNodes (KDTreeNode *node, KDTreeNode *parent, vector< Primitive * > const &primitives, int const depth, int const index, vector< Primitive * > &leftPrimitives, vector< Primitive * > &rightPrimitives, std::shared_ptr< SharedTaskSequencer > masters) override
 Geometry-level parallel version of the SAHKDTreeFactory::buildChildrenNodes. More...
 
virtual double GEOM_findSplitPositionBySAH (KDTreeNode *node, vector< Primitive * > &primitives, int assignedThreads) const
 Geometry-level parallel version of the SAHKDTreeFactory::findSplitPositionBySAH function. More...
 
- Protected Member Functions inherited from SimpleKDTreeGeometricStrategy
virtual void GEOM_computeNodeBoundaries (KDTreeNode *node, KDTreeNode *parent, bool const left, vector< Primitive * > const &primitives, int assignedThreads)
 Geometry-level parallel version of the SimpleKDTreeFactory::computeNodeBoundaries function. More...
 
virtual void GEOM_populateSplits (vector< Primitive * > const &primitives, int const splitAxis, double const splitPos, vector< Primitive * > &leftPrimitives, vector< Primitive * > &rightPrimitives, int assignedThreads) const
 Geometry-level parallel version of the SimpleKDTreeFactory::populateSplits function. More...
 

Protected Attributes

SAHKDTreeFactorysahkdtf
 The surface area heuristic KDTree factory to which geometric strategy shall be applied.
 
- Protected Attributes inherited from SimpleKDTreeGeometricStrategy
SimpleKDTreeFactorykdtf
 The simple KDTree factory to which geometric strategy shall be applied.
 

Friends

class MultiThreadKDTreeFactory
 

Detailed Description

Class providing a strategy for geometry-level parallelization of SAH KDTree building. The geometry-level parallelization is the one to be applied on upper tree nodes, where multiple threads work on the building of the same node.

Author
Alberto M. Esmoris Pena
Version
1.0
See also
SimpleKDTreeGeometricStrategy

Constructor & Destructor Documentation

◆ SAHKDTreeGeometricStrategy()

SAHKDTreeGeometricStrategy::SAHKDTreeGeometricStrategy ( SAHKDTreeFactory kdtf)
inline

SAHKDTreeGeometricStrategy default constructor.

See also
SAHKDTreeGeoemtricStrategy::sahkdtf
SimpleKDTreeGeometricStrategy::SimpleKDTreeGeometricStrategy

Member Function Documentation

◆ clone()

SimpleKDTreeGeometricStrategy * SAHKDTreeGeometricStrategy::clone ( SimpleKDTreeFactory kdtf) const
overridevirtual

Create a clone of the SAHKDTreeGeometricStrategy.

Parameters
kdtfThe KDTreeFactory to be referenced by the clone
Returns
Clone of the SAHKDTreeGeometricStrategy

Reimplemented from SimpleKDTreeGeometricStrategy.

◆ GEOM_buildChildrenNodes()

void SAHKDTreeGeometricStrategy::GEOM_buildChildrenNodes ( KDTreeNode node,
KDTreeNode parent,
vector< Primitive * > const &  primitives,
int const  depth,
int const  index,
vector< Primitive * > &  leftPrimitives,
vector< Primitive * > &  rightPrimitives,
std::shared_ptr< SharedTaskSequencer masters 
)
overrideprotectedvirtual

◆ GEOM_defineSplit()

void SAHKDTreeGeometricStrategy::GEOM_defineSplit ( KDTreeNode node,
KDTreeNode parent,
vector< Primitive * > &  primitives,
int const  depth,
int const  assignedThreads 
) const
overrideprotectedvirtual

◆ GEOM_findSplitPositionBySAH()

double SAHKDTreeGeometricStrategy::GEOM_findSplitPositionBySAH ( KDTreeNode node,
vector< Primitive * > &  primitives,
int  assignedThreads 
) const
protectedvirtual

Geometry-level parallel version of the SAHKDTreeFactory::findSplitPositionBySAH function.

Parameters
assignedThreadsHow many threads can be used to parallelize computations
See also
SAHKDTreeFactory::findSplitPositionBySAH

Using assignedThreads = min(assignedThreads, lossNodes) is expected to work properly because each node requires iterating over the entire set of primitives, which during upper tree levels (those handled by geometry-level parallelization) is expected to be high. However, if performance problems are diagnosed when using lossNodes >= assignedThreads or even lossNodes+x >= assignedThreads for small values of x, then switching strategy to something like assignedThreads = min(assignedThreads, lossNodes/k), for k > 1, might alleviate the problem with an adequate k.

Reimplemented in FastSAHKDTreeGeometricStrategy.


The documentation for this class was generated from the following files: