make first heaps algorithm-aware

This commit is contained in:
Michael Krasnyk 2017-03-31 21:53:39 +02:00
parent 3fc0fc65f9
commit d66cc125aa
6 changed files with 92 additions and 54 deletions

View File

@ -3,7 +3,7 @@
#include <boost/thread/tss.hpp> #include <boost/thread/tss.hpp>
#include "partition/multi_level_partition.hpp" #include "engine/algorithm.hpp"
#include "util/binary_heap.hpp" #include "util/binary_heap.hpp"
#include "util/typedefs.hpp" #include "util/typedefs.hpp"
@ -53,25 +53,50 @@ struct SearchEngineData
using MultiLayerDijkstraHeapPtr = boost::thread_specific_ptr<MultiLayerDijkstraHeap>; using MultiLayerDijkstraHeapPtr = boost::thread_specific_ptr<MultiLayerDijkstraHeap>;
private:
static SearchEngineHeapPtr forward_heap_1; static SearchEngineHeapPtr forward_heap_1;
static SearchEngineHeapPtr reverse_heap_1; static SearchEngineHeapPtr reverse_heap_1;
static MultiLayerDijkstraHeapPtr mld_forward_heap;
static MultiLayerDijkstraHeapPtr mld_reverse_heap;
public:
static SearchEngineHeapPtr forward_heap_2; static SearchEngineHeapPtr forward_heap_2;
static SearchEngineHeapPtr reverse_heap_2; static SearchEngineHeapPtr reverse_heap_2;
static SearchEngineHeapPtr forward_heap_3; static SearchEngineHeapPtr forward_heap_3;
static SearchEngineHeapPtr reverse_heap_3; static SearchEngineHeapPtr reverse_heap_3;
static ManyToManyHeapPtr many_to_many_heap; static ManyToManyHeapPtr many_to_many_heap;
static MultiLayerDijkstraHeapPtr mld_forward_heap;
static MultiLayerDijkstraHeapPtr mld_reverse_heap;
void InitializeOrClearFirstThreadLocalStorage(const unsigned number_of_nodes); template <typename Algorithm>
void InitializeOrClearFirstThreadLocalStorage(Algorithm, const unsigned number_of_nodes);
template <typename Algorithm> auto GetForwardHeapPtr(Algorithm) const
{
return forward_heap_1.get();
}
template <typename Algorithm> auto GetReverseHeapPtr(Algorithm) const
{
return reverse_heap_1.get();
}
void InitializeOrClearFirstThreadLocalStorage(routing_algorithms::mld::Algorithm,
const unsigned number_of_nodes);
auto GetForwardHeapPtr(routing_algorithms::mld::Algorithm) const
{
return mld_forward_heap.get();
}
auto GetReverseHeapPtr(routing_algorithms::mld::Algorithm) const
{
return mld_reverse_heap.get();
}
void InitializeOrClearSecondThreadLocalStorage(const unsigned number_of_nodes); void InitializeOrClearSecondThreadLocalStorage(const unsigned number_of_nodes);
void InitializeOrClearThirdThreadLocalStorage(const unsigned number_of_nodes); void InitializeOrClearThirdThreadLocalStorage(const unsigned number_of_nodes);
void InitializeOrClearManyToManyThreadLocalStorage(const unsigned number_of_nodes); void InitializeOrClearManyToManyThreadLocalStorage(const unsigned number_of_nodes);
void InitializeOrClearMultiLayerDijkstraThreadLocalStorage(const unsigned number_of_nodes);
}; };
} }
} }

View File

@ -164,8 +164,8 @@ void computeLengthAndSharingOfViaPath(
{ {
engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes()); engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes());
QueryHeap &existing_forward_heap = *engine_working_data.forward_heap_1; auto &existing_forward_heap = *engine_working_data.GetForwardHeapPtr(Algorithm{});
QueryHeap &existing_reverse_heap = *engine_working_data.reverse_heap_1; auto &existing_reverse_heap = *engine_working_data.GetReverseHeapPtr(Algorithm{});
QueryHeap &new_forward_heap = *engine_working_data.forward_heap_2; QueryHeap &new_forward_heap = *engine_working_data.forward_heap_2;
QueryHeap &new_reverse_heap = *engine_working_data.reverse_heap_2; QueryHeap &new_reverse_heap = *engine_working_data.reverse_heap_2;
@ -575,12 +575,13 @@ alternativePathSearch(SearchEngineData &engine_working_data,
std::vector<SearchSpaceEdge> reverse_search_space; std::vector<SearchSpaceEdge> reverse_search_space;
// Init queues, semi-expensive because access to TSS invokes a sys-call // Init queues, semi-expensive because access to TSS invokes a sys-call
engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes()); engine_working_data.InitializeOrClearFirstThreadLocalStorage(Algorithm{},
facade.GetNumberOfNodes());
engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes()); engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes());
engine_working_data.InitializeOrClearThirdThreadLocalStorage(facade.GetNumberOfNodes()); engine_working_data.InitializeOrClearThirdThreadLocalStorage(facade.GetNumberOfNodes());
QueryHeap &forward_heap1 = *(engine_working_data.forward_heap_1); auto &forward_heap1 = *engine_working_data.GetForwardHeapPtr(Algorithm{});
QueryHeap &reverse_heap1 = *(engine_working_data.reverse_heap_1); auto &reverse_heap1 = *engine_working_data.GetReverseHeapPtr(Algorithm{});
QueryHeap &forward_heap2 = *(engine_working_data.forward_heap_2); QueryHeap &forward_heap2 = *(engine_working_data.forward_heap_2);
QueryHeap &reverse_heap2 = *(engine_working_data.reverse_heap_2); QueryHeap &reverse_heap2 = *(engine_working_data.reverse_heap_2);

View File

@ -55,16 +55,17 @@ namespace ch
/// by the previous route. /// by the previous route.
/// This variation is only an optimazation for graphs with slow queries, for example /// This variation is only an optimazation for graphs with slow queries, for example
/// not fully contracted graphs. /// not fully contracted graphs.
template <typename AlgorithmT> template <typename Algorithm>
InternalRouteResult directShortestPathSearchImpl( InternalRouteResult directShortestPathSearchImpl(
SearchEngineData &engine_working_data, SearchEngineData &engine_working_data,
const datafacade::ContiguousInternalMemoryDataFacade<AlgorithmT> &facade, const datafacade::ContiguousInternalMemoryDataFacade<Algorithm> &facade,
const PhantomNodes &phantom_nodes) const PhantomNodes &phantom_nodes)
{ {
engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes()); engine_working_data.InitializeOrClearFirstThreadLocalStorage(Algorithm{},
facade.GetNumberOfNodes());
engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes()); engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes());
auto &forward_heap = *(engine_working_data.forward_heap_1); auto &forward_heap = *engine_working_data.GetForwardHeapPtr(Algorithm{});
auto &reverse_heap = *(engine_working_data.reverse_heap_1); auto &reverse_heap = *engine_working_data.GetReverseHeapPtr(Algorithm{});
auto &forward_core_heap = *(engine_working_data.forward_heap_2); auto &forward_core_heap = *(engine_working_data.forward_heap_2);
auto &reverse_core_heap = *(engine_working_data.reverse_heap_2); auto &reverse_core_heap = *(engine_working_data.reverse_heap_2);
forward_heap.Clear(); forward_heap.Clear();
@ -130,10 +131,10 @@ InternalRouteResult directShortestPathSearch(
const datafacade::ContiguousInternalMemoryDataFacade<mld::Algorithm> &facade, const datafacade::ContiguousInternalMemoryDataFacade<mld::Algorithm> &facade,
const PhantomNodes &phantom_nodes) const PhantomNodes &phantom_nodes)
{ {
engine_working_data.InitializeOrClearMultiLayerDijkstraThreadLocalStorage( engine_working_data.InitializeOrClearFirstThreadLocalStorage(mld::Algorithm{},
facade.GetNumberOfNodes()); facade.GetNumberOfNodes());
auto &forward_heap = *(engine_working_data.mld_forward_heap); auto &forward_heap = *engine_working_data.GetForwardHeapPtr(mld::Algorithm{});
auto &reverse_heap = *(engine_working_data.mld_reverse_heap); auto &reverse_heap = *engine_working_data.GetReverseHeapPtr(mld::Algorithm{});
forward_heap.Clear(); forward_heap.Clear();
reverse_heap.Clear(); reverse_heap.Clear();
insertNodesInHeaps(forward_heap, reverse_heap, phantom_nodes); insertNodesInHeaps(forward_heap, reverse_heap, phantom_nodes);

View File

@ -47,10 +47,10 @@ unsigned getMedianSampleTime(const std::vector<unsigned> &timestamps)
} }
} }
template <typename AlgorithmT> template <typename Algorithm>
SubMatchingList SubMatchingList
mapMatchingImpl(SearchEngineData &engine_working_data, mapMatchingImpl(SearchEngineData &engine_working_data,
const datafacade::ContiguousInternalMemoryDataFacade<AlgorithmT> &facade, const datafacade::ContiguousInternalMemoryDataFacade<Algorithm> &facade,
const CandidateLists &candidates_list, const CandidateLists &candidates_list,
const std::vector<util::Coordinate> &trace_coordinates, const std::vector<util::Coordinate> &trace_coordinates,
const std::vector<unsigned> &trace_timestamps, const std::vector<unsigned> &trace_timestamps,
@ -141,11 +141,12 @@ mapMatchingImpl(SearchEngineData &engine_working_data,
return sub_matchings; return sub_matchings;
} }
engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes()); const auto nodes_number = facade.GetNumberOfNodes();
engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes()); engine_working_data.InitializeOrClearFirstThreadLocalStorage(Algorithm{}, nodes_number);
engine_working_data.InitializeOrClearSecondThreadLocalStorage(nodes_number);
auto &forward_heap = *(engine_working_data.forward_heap_1); auto &forward_heap = *engine_working_data.GetForwardHeapPtr(Algorithm{});
auto &reverse_heap = *(engine_working_data.reverse_heap_1); auto &reverse_heap = *engine_working_data.GetReverseHeapPtr(Algorithm{});
auto &forward_core_heap = *(engine_working_data.forward_heap_2); auto &forward_core_heap = *(engine_working_data.forward_heap_2);
auto &reverse_core_heap = *(engine_working_data.reverse_heap_2); auto &reverse_core_heap = *(engine_working_data.reverse_heap_2);

View File

@ -228,10 +228,10 @@ void unpackLegs(const datafacade::ContiguousInternalMemoryDataFacade<ch::Algorit
} }
} }
template <typename AlgorithmT> template <typename Algorithm>
InternalRouteResult InternalRouteResult
shortestPathSearchImpl(SearchEngineData &engine_working_data, shortestPathSearchImpl(SearchEngineData &engine_working_data,
const datafacade::ContiguousInternalMemoryDataFacade<AlgorithmT> &facade, const datafacade::ContiguousInternalMemoryDataFacade<Algorithm> &facade,
const std::vector<PhantomNodes> &phantom_nodes_vector, const std::vector<PhantomNodes> &phantom_nodes_vector,
const boost::optional<bool> continue_straight_at_waypoint) const boost::optional<bool> continue_straight_at_waypoint)
{ {
@ -241,11 +241,12 @@ shortestPathSearchImpl(SearchEngineData &engine_working_data,
!(continue_straight_at_waypoint ? *continue_straight_at_waypoint !(continue_straight_at_waypoint ? *continue_straight_at_waypoint
: facade.GetContinueStraightDefault()); : facade.GetContinueStraightDefault());
engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes()); engine_working_data.InitializeOrClearFirstThreadLocalStorage(Algorithm{},
facade.GetNumberOfNodes());
engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes()); engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes());
QueryHeap &forward_heap = *(engine_working_data.forward_heap_1); auto &forward_heap = *engine_working_data.GetForwardHeapPtr(Algorithm{});
QueryHeap &reverse_heap = *(engine_working_data.reverse_heap_1); auto &reverse_heap = *engine_working_data.GetReverseHeapPtr(Algorithm{});
QueryHeap &forward_core_heap = *(engine_working_data.forward_heap_2); QueryHeap &forward_core_heap = *(engine_working_data.forward_heap_2);
QueryHeap &reverse_core_heap = *(engine_working_data.reverse_heap_2); QueryHeap &reverse_core_heap = *(engine_working_data.reverse_heap_2);

View File

@ -18,7 +18,9 @@ SearchEngineData::ManyToManyHeapPtr SearchEngineData::many_to_many_heap;
SearchEngineData::MultiLayerDijkstraHeapPtr SearchEngineData::mld_forward_heap; SearchEngineData::MultiLayerDijkstraHeapPtr SearchEngineData::mld_forward_heap;
SearchEngineData::MultiLayerDijkstraHeapPtr SearchEngineData::mld_reverse_heap; SearchEngineData::MultiLayerDijkstraHeapPtr SearchEngineData::mld_reverse_heap;
void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(const unsigned number_of_nodes) template <typename Algorithm>
void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(Algorithm,
const unsigned number_of_nodes)
{ {
if (forward_heap_1.get()) if (forward_heap_1.get())
{ {
@ -39,6 +41,35 @@ void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(const unsigned n
} }
} }
template void
SearchEngineData::InitializeOrClearFirstThreadLocalStorage(routing_algorithms::ch::Algorithm,
const unsigned number_of_nodes);
template void
SearchEngineData::InitializeOrClearFirstThreadLocalStorage(routing_algorithms::corech::Algorithm,
const unsigned number_of_nodes);
void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(routing_algorithms::mld::Algorithm,
const unsigned number_of_nodes)
{
if (mld_forward_heap.get())
{
mld_forward_heap->Clear();
}
else
{
mld_forward_heap.reset(new MultiLayerDijkstraHeap(number_of_nodes));
}
if (mld_reverse_heap.get())
{
mld_reverse_heap->Clear();
}
else
{
mld_reverse_heap.reset(new MultiLayerDijkstraHeap(number_of_nodes));
}
}
void SearchEngineData::InitializeOrClearSecondThreadLocalStorage(const unsigned number_of_nodes) void SearchEngineData::InitializeOrClearSecondThreadLocalStorage(const unsigned number_of_nodes)
{ {
if (forward_heap_2.get()) if (forward_heap_2.get())
@ -92,27 +123,5 @@ void SearchEngineData::InitializeOrClearManyToManyThreadLocalStorage(const unsig
many_to_many_heap.reset(new ManyToManyQueryHeap(number_of_nodes)); many_to_many_heap.reset(new ManyToManyQueryHeap(number_of_nodes));
} }
} }
void SearchEngineData::InitializeOrClearMultiLayerDijkstraThreadLocalStorage(
const unsigned number_of_nodes)
{
if (mld_forward_heap.get())
{
mld_forward_heap->Clear();
}
else
{
mld_forward_heap.reset(new MultiLayerDijkstraHeap(number_of_nodes));
}
if (mld_reverse_heap.get())
{
mld_reverse_heap->Clear();
}
else
{
mld_reverse_heap.reset(new MultiLayerDijkstraHeap(number_of_nodes));
}
}
} }
} }