-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathmpi_aux.cpp
133 lines (118 loc) · 2.91 KB
/
mpi_aux.cpp
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
125
126
127
128
129
130
131
132
133
#include <mpi.h>
#include <mpi_aux.h>
// #include <knotkit.h>
#define DATATAG 1
void
comm_init (int *argc, char ***argv)
{
MPI_Init (argc, argv);
}
void
comm_finalize ()
{
MPI_Finalize ();
}
int
self_rank ()
{
int node;
MPI_Comm_rank (MPI_COMM_WORLD, &node);
return node;
}
int
num_tasks ()
{
int ntasks;
MPI_Comm_size (MPI_COMM_WORLD, &ntasks);
return ntasks;
}
void
send_int (int v, int dest)
{
MPI_Send (&v, 1, MPI_INT, dest, DATATAG, MPI_COMM_WORLD);
}
void
send_string (const char *s, int dest)
{
int n = strlen (s);
MPI_Send (&n, 1, MPI_INT, dest, DATATAG, MPI_COMM_WORLD);
MPI_Send ((void *)s, n, MPI_CHAR, dest, DATATAG, MPI_COMM_WORLD);
}
void
send_string (const std::string &s, int dest)
{
send_string (s.c_str (), dest);
}
int
recv_int (int *src)
{
int v;
MPI_Status status;
MPI_Recv (&v, /* message buffer */
1, /* one data item */
MPI_INT, /* of type int */
MPI_ANY_SOURCE, /* receive from any sender */
MPI_ANY_TAG, /* any type of message */
MPI_COMM_WORLD, /* default communicator */
&status); /* info about the received message */
if (src)
*src = status.MPI_SOURCE;
return v;
}
std::string
recv_string (int *src)
{
int n;
MPI_Status status;
MPI_Recv (&n, /* message buffer */
1, /* one data item */
MPI_INT, /* of type int */
MPI_ANY_SOURCE, /* receive from any sender */
MPI_ANY_TAG, /* any type of message */
MPI_COMM_WORLD, /* default communicator */
&status); /* info about the received message */
char *s = new char[n + 1];
MPI_Recv (s, /* message buffer */
n, /* one data item */
MPI_CHAR, /* of type int */
status.MPI_SOURCE, /* receive from any sender */
MPI_ANY_TAG, /* any type of message */
MPI_COMM_WORLD, /* default communicator */
&status); /* info about the received message */
if (src)
*src = status.MPI_SOURCE;
s[n] = '\0';
std::string s_std (s);
delete [] s;
return s_std;
}
#if 0
void
send_htw_knot (unsigned n, bool alternating, unsigned k, int dest)
{
int data[3];
data[0] = (int)n;
data[1] = (int)alternating;
data[2] = (int)k;
MPI_Send (&data, 3, MPI_INT, dest, DATATAG, MPI_COMM_WORLD);
}
knot_diagram
recv_knot (int *src)
{
int data[3];
MPI_Status status;
MPI_Recv (&data, /* message buffer */
3, /* one data item */
MPI_INT, /* of type int */
MPI_ANY_SOURCE, /* receive from any sender */
MPI_ANY_TAG, /* any type of message */
MPI_COMM_WORLD, /* default communicator */
&status); /* info about the received message */
if (src)
*src = status.MPI_SOURCE;
dt_code k = htw_knot ((unsigned)data[0],
(bool)data[1],
(unsigned)data[2]);
return knot_diagram (k);
}
#endif