-
Notifications
You must be signed in to change notification settings - Fork 0
/
omp_calc.c
56 lines (44 loc) · 1.21 KB
/
omp_calc.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
#include <stdio.h>
#include <time.h>
#include <omp.h>
#define INTERVALS 10000000
double a[INTERVALS], b[INTERVALS];
int main(int argc, char **argv)
{
double time2;
// time_t time1 = clock();
double start_time = omp_get_wtime();
double *to = b;
double *from = a;
int time_steps = 100;
omp_set_dynamic(0);
omp_set_num_threads(4);
long i = 0;
/* Set up initial and boundary conditions. */
from[0] = 1.0;
from[INTERVALS - 1] = 0.0;
to[0] = from[0];
to[INTERVALS - 1] = from[INTERVALS - 1];
#pragma omp parallel for
for(long i = 1; i < INTERVALS; i++)
from[i] = 0.0;
printf("Number of intervals: %ld. Number of time steps: %d\n", INTERVALS, time_steps);
/* Apply stencil iteratively. */
while(time_steps-- > 0)
{
#pragma omp parallel for shared(from, to)
for(long i = 1; i < (INTERVALS - 1); i++)
to[i] = from[i] + 0.1*(from[i - 1] - 2*from[i] + from[i + 1]);
{
double* tmp = from;
from = to;
to = tmp;
}
}
time2 = (omp_get_wtime() - start_time);
// 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[i]);
return 0;
}