generated from learning-process/parallel_programming_course
-
Notifications
You must be signed in to change notification settings - Fork 81
Expand file tree
/
Copy pathops_mpi.hpp
More file actions
77 lines (59 loc) · 2.26 KB
/
ops_mpi.hpp
File metadata and controls
77 lines (59 loc) · 2.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#pragma once
#include <mpi.h>
#include <vector>
#include "romanova_v_dijkstra_crs/common/include/common.hpp"
#include "task/include/task.hpp"
namespace romanova_v_dijkstra_crs {
class RomanovaVDijkstraCrsMPI : public BaseTask {
public:
static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() {
return ppc::task::TypeOfTask::kMPI;
}
explicit RomanovaVDijkstraCrsMPI(const InType &in);
private:
bool ValidationImpl() override;
bool PreProcessingImpl() override;
bool RunImpl() override;
bool PostProcessingImpl() override;
void RemoveFromQueues(int vert);
void CleanUpQueues();
void UpdateQueues(int vert);
void SetupMasterProcessData();
void CalculateGlobalMinInOut();
void BroadcastParameters();
void SetupLocalVertexRange(int rank);
void InitializeLocalArrays();
void SetupMinInOutArrays(int rank, int n);
[[nodiscard]] std::vector<int> CalculateVertexSendCounts(int rank, int n) const;
static std::vector<int> CalculateVertexDisplacements(int rank, int n, const std::vector<int> &vert_sendcounts);
void InitializeQueues();
void BroadcastGraphData(int rank);
void InitializeSource();
void RecieveData(int &flag, MPI_Status &status);
static void WaitRequests(std::vector<MPI_Request> &send_requests);
void MakeLocalR(std::vector<int> &local_r, double global_l, double global_m);
void ProcessLocalR(std::vector<int> &local_r, int &flag, MPI_Status &status);
std::vector<int> IsGlobalStop();
static double GetGlobalMin(MinHeap &q);
Graph data_;
std::vector<double> res_weights_;
std::vector<double> glob_min_in_;
std::vector<double> glob_min_out_;
std::vector<double> min_in_; // минимальный вес входящих ребер
std::vector<double> min_out_; // минимальный вес исходящих ребер
int local_n_{};
int st_vert_{};
int en_vert_{};
int delta_{};
int extra_{};
std::vector<double> local_d_; // приоритеты для qin и qout будем вычислять динамически, используя min_in_, min_out_
std::vector<bool> in_s_;
std::vector<bool> visited_;
MinHeap qd_;
MinHeap qin_;
MinHeap qout_;
std::vector<bool> in_qd_;
std::vector<bool> in_qin_;
std::vector<bool> in_qout_;
};
} // namespace romanova_v_dijkstra_crs