-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcommon.cpp
More file actions
84 lines (66 loc) · 1.88 KB
/
Copy pathcommon.cpp
File metadata and controls
84 lines (66 loc) · 1.88 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
78
79
80
81
82
83
84
#include <chrono>
#include "common.h"
using namespace std;
my_timer_t start_clock() {
return std::chrono::steady_clock::now();
}
double stop_clock_get_elapsed(my_timer_t &start) {
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double> diff = end - start;
return diff.count();
}
int pMod(int num, int denom) {
return ((num % denom) + denom) % denom;
}
int divideAndRoundUp(int num, int denom) {
if (num % denom > 0) {
return num / denom + 1;
}
else {
return num / denom;
}
}
string spcoord_t::string_rep() {
return std::to_string(r) + " " + std::to_string(c) + " " + std::to_string(value);
}
MPI_Datatype SPCOORD;
void initialize_mpi_datatypes() {
const int nitems = 3;
int blocklengths[3] = {1, 1, 1};
MPI_Datatype types[3] = {MPI_UINT64_T, MPI_UINT64_T, MPI_DOUBLE};
MPI_Aint offsets[3];
offsets[0] = offsetof(spcoord_t, r);
offsets[1] = offsetof(spcoord_t, c);
offsets[2] = offsetof(spcoord_t, value);
MPI_Type_create_struct(nitems, blocklengths, offsets, types, &SPCOORD);
MPI_Type_commit(&SPCOORD);
}
bool column_major(spcoord_t a, spcoord_t b) {
if(a.c == b.c) {
return a.r < b.r;
}
else {
return a.c < b.c;
}
}
bool row_major(spcoord_t &a, spcoord_t &b) {
if(a.r == b.r) {
return a.c < b.c;
}
else {
return a.r < b.r;
}
}
void divideIntoSegments(int total, int num_segments,
vector<int> &segment_starts,
vector<int> &segment_sizes) {
int share_size = divideAndRoundUp(total, num_segments);
segment_starts.clear();
for(int i = 0; i < num_segments; i++) {
segment_starts.push_back(std::min(share_size * i, total));
}
segment_starts.push_back(total);
for(int i = 0; i < num_segments; i++) {
segment_sizes.push_back(segment_starts[i+1] - segment_starts[i]);
}
}