Skip to content

Commit d135fd2

Browse files
committed
Speedup SplitEntityLocation
1 parent b3c1786 commit d135fd2

File tree

1 file changed

+42
-53
lines changed

1 file changed

+42
-53
lines changed

octree.h

Lines changed: 42 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2745,31 +2745,6 @@ namespace OrthoTree
27452745
return true;
27462746
}
27472747

2748-
2749-
struct GridBoundary
2750-
{
2751-
GridID MinGridID, BeginGridID, EndGridID;
2752-
};
2753-
template<dim_t DIMENSION_ID>
2754-
static constexpr void ConstructGridIDListRecursively(
2755-
GridID gridStepNo, DimArray<GridBoundary> const& gridIDBoundaries, DimArray<GridID>& currentGridID, std::vector<DimArray<GridID>>& allGridID) noexcept
2756-
{
2757-
if constexpr (DIMENSION_ID == 0)
2758-
allGridID.emplace_back(currentGridID);
2759-
else
2760-
{
2761-
auto const& [minGridID, beginGridID, endGridID] = gridIDBoundaries[DIMENSION_ID - 1];
2762-
currentGridID[DIMENSION_ID - 1] = minGridID;
2763-
ConstructGridIDListRecursively<DIMENSION_ID - 1>(gridStepNo, gridIDBoundaries, currentGridID, allGridID);
2764-
for (auto gridID = beginGridID; gridID < endGridID; ++gridID)
2765-
{
2766-
currentGridID[DIMENSION_ID - 1] = gridID * gridStepNo;
2767-
ConstructGridIDListRecursively<DIMENSION_ID - 1>(gridStepNo, gridIDBoundaries, currentGridID, allGridID);
2768-
}
2769-
}
2770-
}
2771-
2772-
27732748
template<bool DO_RANGE_MUST_FULLY_CONTAIN = false>
27742749
constexpr void RangeSearchBaseCopy(
27752750
TBox const& range, TContainer const& geometryCollection, Node const& parentNode, std::vector<TEntityID>& foundEntities) const noexcept
@@ -3629,7 +3604,6 @@ namespace OrthoTree
36293604
using Base = OrthoTreeBase<DIMENSION_NO, TBox_, TVector_, TBox_, TRay_, TPlane_, TGeometry_, TAdapter_, TContainer_>;
36303605
using EntityDistance = typename Base::EntityDistance;
36313606
using BoxDistance = typename Base::BoxDistance;
3632-
using GridBoundary = typename Base::GridBoundary;
36333607
template<typename T>
36343608
using DimArray = std::array<T, DIMENSION_NO>;
36353609
using IGM = typename Base::IGM;
@@ -3693,43 +3667,59 @@ namespace OrthoTree
36933667
auto const remainingDepthNo = static_cast<depth_t>(this->m_maxDepthNo - depthID);
36943668
auto const gridStepNo = detail::pow2<depth_t, GridID>(remainingDepthNo);
36953669

3696-
auto gridBoundaries = DimArray<GridBoundary>{};
3670+
struct GridSet
3671+
{
3672+
GridID BeginID;
3673+
GridID EndID;
3674+
};
3675+
auto gridBoundaries = DimArray<GridSet>{};
36973676
std::size_t boxNoByGrid = 1;
36983677
for (dim_t dimensionID = 0; dimensionID < DIMENSION_NO; ++dimensionID)
36993678
{
3700-
GridID const firstGridSplit = (boxMinMaxGridID[0][dimensionID] / gridStepNo) + GridID{ 1 };
3701-
GridID const lastGridSplit = (boxMinMaxGridID[1][dimensionID] / gridStepNo);
3702-
GridID const gridIDNo = (lastGridSplit < firstGridSplit ? 0 : (lastGridSplit - firstGridSplit + 1)) + 1;
3703-
boxNoByGrid *= gridIDNo;
3679+
auto beginID = boxMinMaxGridID[0][dimensionID] / gridStepNo;
3680+
auto endID = 1 + boxMinMaxGridID[1][dimensionID] / gridStepNo;
3681+
boxNoByGrid *= endID - beginID;
37043682
if (boxNoByGrid >= SI::CHILD_NO)
37053683
return;
37063684

3707-
gridBoundaries[dimensionID] = { boxMinMaxGridID[0][dimensionID], firstGridSplit, lastGridSplit + 1 };
3685+
gridBoundaries[dimensionID] = { beginID * gridStepNo, endID * gridStepNo };
37083686
}
37093687

3710-
auto gridIDs = std::vector<DimArray<GridID>>{};
3711-
gridIDs.reserve(boxNoByGrid);
3712-
auto temporaryGridID = DimArray<GridID>{};
3713-
Base::template ConstructGridIDListRecursively<DIMENSION_NO>(gridStepNo, gridBoundaries, temporaryGridID, gridIDs);
3688+
if (boxNoByGrid < 2)
3689+
return;
37143690

3715-
auto const boxNo = gridIDs.size();
3691+
auto const increaseGridID = [&](DimArray<GridID>& gridID) {
3692+
for (dim_t dimensionID = 0; dimensionID < DIMENSION_NO; ++dimensionID)
3693+
{
3694+
gridID[dimensionID] += gridStepNo;
3695+
if (gridID[dimensionID] < gridBoundaries[dimensionID].EndID)
3696+
break;
3697+
3698+
gridID[dimensionID] = gridBoundaries[dimensionID].BeginID;
3699+
}
3700+
};
3701+
3702+
DimArray<GridID> gridID;
3703+
for (dim_t dimensionID = 0; dimensionID < DIMENSION_NO; ++dimensionID)
3704+
gridID[dimensionID] = gridBoundaries[dimensionID].BeginID;
37163705

3717-
// First element into locationID
37183706
location.DepthAndLocation.DepthID = depthID;
3719-
location.DepthAndLocation.LocID = SI::Encode(gridIDs[0]);
3707+
location.DepthAndLocation.LocID = SI::Encode(gridID);
3708+
increaseGridID(gridID);
3709+
37203710
auto const entityID = location.EntityID;
37213711

3722-
auto const additionalBoxNo = boxNo - 1;
3712+
auto const additionalBoxNo = boxNoByGrid - 1;
37233713
auto const locationNo = additionalLocations.size();
37243714
additionalLocations.resize(locationNo + additionalBoxNo);
37253715

3726-
LOOPIVDEP
3727-
for (std::size_t iBox = 0; iBox < additionalBoxNo; ++iBox)
3716+
for (auto locationPosition = locationNo; locationPosition < additionalLocations.size(); ++locationPosition, increaseGridID(gridID))
37283717
{
3729-
auto& subLocation = additionalLocations.at(locationNo + iBox);
3718+
auto& subLocation = additionalLocations.at(locationPosition);
3719+
37303720
subLocation.EntityID = entityID;
37313721
subLocation.DepthAndLocation.DepthID = depthID;
3732-
subLocation.DepthAndLocation.LocID = SI::Encode(gridIDs[iBox + 1]);
3722+
subLocation.DepthAndLocation.LocID = SI::Encode(gridID);
37333723
}
37343724
}
37353725

@@ -3811,9 +3801,10 @@ namespace OrthoTree
38113801
auto remainedEntityNo = entityNo;
38123802
auto tasks = std::vector<TaskData>(threadNo);
38133803
auto it = boxes.begin();
3814-
for (auto& taskData : tasks) {
3804+
for (auto& taskData : tasks)
3805+
{
38153806
auto const entityNoOnThread = std::min(entityNoPerThread, remainedEntityNo);
3816-
remainedEntityNo -= entityNoOnThread;
3807+
remainedEntityNo -= entityNoOnThread;
38173808

38183809
taskData.BeginIt = it;
38193810
it = std::next(it, entityNoOnThread);
@@ -3850,14 +3841,12 @@ namespace OrthoTree
38503841

38513842
locations.resize(position);
38523843
EXEC_POL_DEF(epf2); // GCC 11.3
3853-
std::for_each(
3854-
EXEC_POL_ADD(epf2) tasks.begin() + 1, tasks.end(), [&locations](auto& taskData) {
3855-
if (taskData.Locations.empty())
3856-
return;
3844+
std::for_each(EXEC_POL_ADD(epf2) tasks.begin() + 1, tasks.end(), [&locations](auto& taskData) {
3845+
if (taskData.Locations.empty())
3846+
return;
38573847

3858-
std::copy(
3859-
taskData.Locations.begin(), taskData.Locations.end(), std::next(locations.begin(), taskData.InsertionPosition));
3860-
});
3848+
std::copy(taskData.Locations.begin(), taskData.Locations.end(), std::next(locations.begin(), taskData.InsertionPosition));
3849+
});
38613850
}
38623851

38633852
if constexpr (IS_PARALLEL_EXEC)

0 commit comments

Comments
 (0)