forked from hxmhuang/OpenArray_Dev
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMPI.cpp
More file actions
103 lines (85 loc) · 1.86 KB
/
MPI.cpp
File metadata and controls
103 lines (85 loc) · 1.86 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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
* MPI.cpp
*
=======================================================*/
#include "MPI.hpp"
#include "c-interface/c_oa_cache.hpp"
namespace oa{
MPI::MPI(){
m_comm = MPI_COMM_NULL;
}
void MPI::c_init(MPI_Comm comm, int argc, char** argv){
if(argc > 0){
MPI_Init(&argc, &argv);
}else{
MPI_Init(NULL, NULL);
}
m_comm = comm;
}
void MPI::init(int comm, int argc, char** argv){
if(argc > 0){
MPI_Init(&argc, &argv);
}else{
MPI_Init(NULL, NULL);
}
// comm is a fortran MPI_Comm, use f2c to change into c MPI_Comm
m_comm = MPI_Comm_f2c(comm);
}
void MPI::finalize(){
c_clear_cache(); // clear cache used in FSET(CSET)
MPI_Finalize();
}
MPI_Comm& MPI::comm(){
return m_comm;
}
int MPI::rank(){
int rank;
MPI_Comm_rank(m_comm, &rank);
return rank;
}
int MPI::rank(MPI_Comm comm){
int rank;
MPI_Comm_rank(comm, &rank);
return rank;
}
int MPI::size(){
int size;
MPI_Comm_size(m_comm, &size);
return size;
}
int MPI::size(MPI_Comm comm){
int size;
MPI_Comm_size(comm, &size);
return size;
}
MPI* MPI::global(){
static MPI obj;
return &obj;
}
void MPI::order_start() {
int r = rank();
for (int i = 0; i < r; i++)
MPI_Barrier(m_comm);
}
void MPI::order_end() {
int s = size();
int r = rank();
for (int i = r; i < s; i++)
MPI_Barrier(m_comm);
}
void *MPI::wait_func(void *arg) {
int i,j;
vector<MPI_Request> *mra = (vector<MPI_Request> *)arg;
for(i=0;i<(*mra).size();i++)
{
MPI_Wait(&(*mra)[i], MPI_STATUSES_IGNORE);
}
return NULL;
}
void MPI::wait_begin(vector<MPI_Request> *mra, pthread_t * tid) {
pthread_create(tid, NULL, wait_func, (void *)(mra));
}
void MPI::wait_end(pthread_t * tid) {
pthread_join(*tid,NULL);
}
}