-
Notifications
You must be signed in to change notification settings - Fork 0
/
mpiCalc.c
109 lines (76 loc) · 2.69 KB
/
mpiCalc.c
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
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <mpi.h>
#define INTERVALS 10000000
double a[INTERVALS], b[INTERVALS];
int main(int argc, char **argv)
{
double time2;
// time_t time1 = clock();
double startT = MPI_Wtime();
double *from = a;
int rank, size;
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
MPI_Status status;
MPI_Request request;
int time_steps = 100;
long int points_per_domain = INTERVALS / size;
int start = 0;
long int end = points_per_domain + 1;
double *to_local, *from_local;
to_local = (double*)malloc((end-start)*sizeof(double));
from_local = (double*)malloc((end-start)*sizeof(double));
/* Set up initial and boundary conditions. */
for(long int i = 1; i < end; i++)
from_local[i] = 0.0;
if (rank == 0) {
from_local[0] = 1.0;
to_local[0] = from_local[0];
}
if (rank == size - 1) {
from_local[end] = 0.0;
to_local[end] = from_local[end];
}
// MPI_Barrier(MPI_COMM_WORLD);
while(time_steps-- > 0)
{
if (rank > 0) {
MPI_Recv(&from_local[start], 1, MPI_DOUBLE, rank - 1, 0, MPI_COMM_WORLD, &status);
MPI_Send(&from_local[start+1], 1, MPI_DOUBLE, rank - 1, 1, MPI_COMM_WORLD);
}
if (rank < size - 1){
MPI_Send(&from_local[end-1], 1, MPI_DOUBLE, rank + 1, 0, MPI_COMM_WORLD);
MPI_Recv(&from_local[end], 1, MPI_DOUBLE, rank + 1, 1, MPI_COMM_WORLD, &status);
}
// MPI_Barrier(MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
// printf("rank is: %d, timeStep is: %d\n", rank, time_steps);
for(long int i = 1; i < end; i++)
to_local[i] = from_local[i] + 0.1*(from_local[i - 1] - 2.0*from_local[i] + from_local[i + 1]);
// // printf("the to_local is: %lf, rank is: %d\n", from_local[0], rank);
// // for(long i = 1; i < (end); i++)
// // from_local[i] = to_local[i];
double *temp_ptr = to_local;
to_local = from_local;
from_local = temp_ptr;
// from_local = to_local;
}
MPI_Gather(from_local+1, points_per_domain, MPI_DOUBLE,
from, points_per_domain, MPI_DOUBLE, 0, MPI_COMM_WORLD);
// if (rank == 0) {
// for(long int i = 2; i < 12; i += 2)
// printf("Interval %ld: %f\n", i, from[i]);
// }
time2 = MPI_Wtime() - startT;
if(rank == 0)
printf("Elapsed time (s) = %f\n", time2);
MPI_Finalize();
// time2 = (clock() - time1) / (double) CLOCKS_PER_SEC;
// printf("Elapsed time (s) = %f\n", time2);
// for(long i = 2; i < 30; i += 2)
// printf("Interval %ld: %f\n", i, to_local[i]);
return 0;
}