-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjacobi1d_omp_final.c
123 lines (105 loc) · 2.89 KB
/
jacobi1d_omp_final.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/* Include benchmark-specific header */
#include "jacobi-1d.h"
double bench_t_start, bench_t_end;
static
double rtclock()
{
struct timeval Tp;
/* structure including fields:
long tv_sec - seconds since Jan. 1, 1970
long tv_usec - microseconds */
int stat;
stat = gettimeofday (&Tp, NULL); /* get current time and data in seconds and mircroseconds (fill fields of struct Tp) */
if (stat != 0) /* 0 - succcess, (-1) - failure */
printf ("Error return from gettimeofday: %d", stat);
return (Tp.tv_sec + Tp.tv_usec * 1.0e-6);
}
void bench_timer_start()
{
bench_t_start = rtclock (); /* remember time of start */
}
void bench_timer_stop()
{
bench_t_end = rtclock (); /* remember time of end */
}
void bench_timer_print()
{
printf ("Time in seconds = %0.6lf\n", bench_t_end - bench_t_start); /* print runtime */
}
/* initialiating of an array */
static
void init_array (int n,
double A[n],
double B[n])
{
int i;
for (i = 0; i < n; i++) {
A[i] = ((double) i + 2) / n;
B[i] = ((double) i + 3) / n;
}
}
/* printing of an array */
static
void print_array(int n, double A[n])
{
int i;
fprintf(stderr, "==BEGIN DUMP_ARRAYS==\n");
fprintf(stderr, "begin dump: %s", "A");
for (i = 0; i < n; i++)
{
if (i % 20 == 0) fprintf(stderr, "\n");
fprintf(stderr, "%0.2lf ", A[i]);
}
fprintf(stderr, "\nend dump: %s\n", "A");
fprintf(stderr, "==END DUMP_ARRAYS==\n");
}
static
void kernel_jacobi_1d(int tsteps,
int n,
double A[n],
double B[n])
{
int t, i;
double C[4];
double *D = (double*)malloc((n) * sizeof(double));
D[0] = A[0];
D[n - 1] = A[n - 1];
double *F;
for (t = 0; t < tsteps; t++)
{
C[0] = A[2];
C[1] = A[3];
C[2] = A[n - 3];
C[3] = A[n - 4];
#pragma omp parallel for
for (i = 2; i < n - 2; i++)
{
D[i] = (0.33333 * 0.33333) * (A[i - 2] + 2 * A[i - 1] + 3 * A[i] + 2 * A[i + 1] + A[i + 2]);
B[i] = 0.33333 * (A[i - 1] + A[i] + A [i + 1]);
}
D[1] = 0.33333 * (B[0] + 0.33333 * (A[0] + 2 * A[1] + 2 * C[0] + C[1]));
D[n - 2] = 0.33333 * (B[n - 1] + 0.33333 * (2 * A[n - 2] + 2 * C[2] + C[3] + A[n - 1]));
F = D;
D = A;
A = F;
}
}
int main(int argc, char** argv)
{
int n = N;
int tsteps = TSTEPS;
double (*A)[n]; A = (double(*)[n])malloc ((n) * sizeof(double));
double (*B)[n]; B = (double(*)[n])malloc ((n) * sizeof(double));
double sum = 0;
init_array (n, *A, *B);
bench_timer_start();
kernel_jacobi_1d(tsteps, n, *A, *B);
bench_timer_stop();
//bench_timer_print();
sum = bench_t_end - bench_t_start;
printf("%d,%d,%f\n", n, tsteps, sum);
//if (argc > 42 && ! strcmp(argv[0], "")) print_array(n, *A);
free((void*)A);
free((void*)B);
return 0;
}