-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmympi.h
125 lines (124 loc) · 2.84 KB
/
mympi.h
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include<mpi.h>
#include<pthread.h>
#include<stdlib.h>
#include<cstdlib>
#include<string>
#include<vector>
enum MPI_TAG {
MPI_TASK_APPLY,
MPI_HIST_MERGE,
MPI_MEMORY_READY,
MPI_SYNC,
MPI_SINGLETHREAD,
};
class MpiGlobal {
public:
MpiGlobal();
~MpiGlobal();
bool head() const;
bool myDuty(int i) const;
int size,rank;
private:
static int count;
};
extern MpiGlobal mpiGlobal;
class MpiChecker {
public:
MpiChecker();
};
void mpiSync();
class MpiSharedMemory {
public:
MpiSharedMemory(int size);
~MpiSharedMemory();
void * address() const;
protected:
void *p;
private:
MpiChecker mpiChecker;
};
template<typename T> class MpiSharedArray:MpiSharedMemory {
public:
MpiSharedArray(int size):MpiSharedMemory(sizeof(T)*size) {
}
inline T & operator [] (int i) {
return *address(i);
}
inline T * address(int i=0) {
return (T*)p+i;
}
};
template<typename T> class MpiSharedArray2:MpiSharedMemory {
public:
MpiSharedArray2(int s1,int s2):MpiSharedMemory(sizeof(T)*s1*s2),s1(s1),s2(s2) {
}
inline T * address(int i1,int i2) {
return (T*)p+i1*s2+i2;
}
private:
const int s1,s2;
};
template<typename T> class MpiSharedArray3:MpiSharedMemory {
public:
MpiSharedArray3(int s1,int s2,int s3):MpiSharedMemory(sizeof(T)*s1*s2*s3),s1(s1),s2(s2),s3(s3) {
}
inline T * address(int i1,int i2,int i3) {
return (T*)p+i1*(s2*s3)+i2*s3+i3;
}
private:
const int s1,s2,s3;
};
template<typename T> class MpiSharedArray4:MpiSharedMemory {
public:
MpiSharedArray4(int s1,int s2,int s3,int s4):MpiSharedMemory(sizeof(T)*s1*s2*s3*s4),s1(s1),s2(s2),s3(s3),s4(s4) {
}
inline T * address(int i1,int i2,int i3,int i4) {
return (T*)p+i1*(s2*s3*s4)+i2*(s3*s4)+i3*s4+i4;
}
private:
const int s1,s2,s3,s4;
};
class SingleThreadLocker {
public:
SingleThreadLocker(bool includingHead=false);
~SingleThreadLocker();
bool myDuty();
private:
static pthread_mutex_t *pMutex;
static bool staticInited;
const bool includingHead;
static const int WORKING_RANK;
};
#define SINGLERUN(f) {SingleThreadLocker __cbxLocker__; if (__cbxLocker__.myDuty()) {f}}
class MpiTaskManager {
public:
MpiTaskManager(const std::string &tag,int count,double supposedCost);
~MpiTaskManager();
int apply();
private:
void listen();
void write();
const int count;
const double supposedCost;
const std::string tag;
double cost1,cost2;
MpiChecker mpiChecker;
};
class ParallelHistogram {
public:
ParallelHistogram(const bool logScale,const bool clamped,const double min,const double max,const int count,const std::string &filename);
~ParallelHistogram();
void tip(double x);
void writeRecommand(int depth);
private:
void merge();
void write(int depth) const;
const bool logScale;
const bool clamped;
const double min,max;
const int count;
const std::string filename;
long *a;
double mu,sigma;
MpiChecker mpiChecker;
};