| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include <functional> | ||
| 4 | #include <queue> | ||
| 5 | #include <utility> | ||
| 6 | #include <vector> | ||
| 7 | |||
| 8 | #include "olesnitskiy_v_dijkstra_crs/common/include/common.hpp" | ||
| 9 | #include "task/include/task.hpp" | ||
| 10 | |||
| 11 | namespace olesnitskiy_v_dijkstra_crs { | ||
| 12 | |||
| 13 | class OlesnitskiyVDijkstraCrsMPI : public BaseTask { | ||
| 14 | public: | ||
| 15 | static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { | ||
| 16 | return ppc::task::TypeOfTask::kMPI; | ||
| 17 | } | ||
| 18 | explicit OlesnitskiyVDijkstraCrsMPI(const InType &in); | ||
| 19 | |||
| 20 | bool ValidationImpl() override; | ||
| 21 | bool PreProcessingImpl() override; | ||
| 22 | bool RunImpl() override; | ||
| 23 | bool PostProcessingImpl() override; | ||
| 24 | |||
| 25 | private: | ||
| 26 | struct Update { | ||
| 27 | int vertex{0}; | ||
| 28 | int distance{0}; | ||
| 29 | }; | ||
| 30 | |||
| 31 | struct DistVertexPair { | ||
| 32 | int dist{0}; | ||
| 33 | int vertex{0}; | ||
| 34 | }; | ||
| 35 | |||
| 36 | struct GraphData { | ||
| 37 | int vertices{0}; | ||
| 38 | int source{0}; | ||
| 39 | std::vector<int> offsets; | ||
| 40 | std::vector<int> edges; | ||
| 41 | std::vector<int> weights; | ||
| 42 | }; | ||
| 43 | |||
| 44 |
1/2✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
|
28 | struct DijkstraContext { |
| 45 | int start_idx{0}; | ||
| 46 | int end_idx{0}; | ||
| 47 | int local_vertices{0}; | ||
| 48 | int active{1}; | ||
| 49 | std::vector<int> counts; | ||
| 50 | std::vector<int> displs; | ||
| 51 | std::vector<int> local_distances; | ||
| 52 | std::vector<bool> local_visited; | ||
| 53 | std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<>> pq; | ||
| 54 | std::vector<std::vector<Update>> send_bufs; | ||
| 55 | }; | ||
| 56 | |||
| 57 | static bool IsVertexLocal(int vertex, int start_idx, int end_idx); | ||
| 58 | static int FindOwner(int vertex, const std::vector<int> &displs, const std::vector<int> &counts, int size); | ||
| 59 | static void ProcessLocalVertex(int vertex, int distance, const std::vector<int> &offsets, | ||
| 60 | const std::vector<int> &edges, const std::vector<int> &weights, DijkstraContext &ctx, | ||
| 61 | int rank, int size); | ||
| 62 | static void ProcessReceivedData(const std::vector<int> &recv_data, int total_recv, DijkstraContext &ctx); | ||
| 63 | static void PrepareSendData(const std::vector<std::vector<Update>> &send_bufs, std::vector<int> &send_data); | ||
| 64 | static void CalculateDisplacements(const std::vector<int> &sizes, std::vector<int> &displs, int &total); | ||
| 65 | static void PrepareByteArrays(const std::vector<int> &sizes, const std::vector<int> &displs, | ||
| 66 | std::vector<int> &counts_bytes, std::vector<int> &displs_bytes); | ||
| 67 | static GraphData BroadcastGraphData(int rank, int /*size*/, const InType &input); | ||
| 68 | static DistVertexPair FindGlobalBestVertex(const DistVertexPair &local_best); | ||
| 69 | static bool ShouldStopAlgorithm(const DistVertexPair &global_best); | ||
| 70 | static void ExchangeUpdates(DijkstraContext &ctx); | ||
| 71 | static DijkstraContext InitializeLocalData(int vertices, int size, int rank, int source); | ||
| 72 | static bool FindLocalBestVertex(DijkstraContext &ctx, DistVertexPair &local_best); | ||
| 73 | static void ProcessGlobalVertex(const DistVertexPair &global_best, const GraphData &graph, DijkstraContext &ctx, | ||
| 74 | int rank, int size); | ||
| 75 | static bool PerformDijkstraIteration(const GraphData &graph, DijkstraContext &ctx, int rank, int size); | ||
| 76 | static void RunDijkstraAlgorithm(const GraphData &graph, DijkstraContext &ctx, int rank, int size); | ||
| 77 | void CollectResults(const GraphData &graph, const DijkstraContext &ctx, int rank, int size); | ||
| 78 | }; | ||
| 79 | } // namespace olesnitskiy_v_dijkstra_crs | ||
| 80 |