1 /* { dg-do run } */
2
3 #include <stdlib.h>
4
5 const int ROWS = 5;
6 const int COLS = 5;
7
init(int Q[][COLS],const int rows,const int cols)8 void init (int Q[][COLS], const int rows, const int cols)
9 {
10 int i, j;
11 for (i = 0; i < rows; i++)
12 for (j = 0; j < cols; j++)
13 Q[i][j] = (i + 1) * 100 + (j + 1);
14 }
15
check(int a[][COLS],int b[][COLS],const int rows,const int cols)16 void check (int a[][COLS], int b[][COLS], const int rows, const int cols)
17 {
18 int i, j;
19 for (i = 0; i < rows; i++)
20 for (j = 0; j < cols; j++)
21 if (a[i][j] != b[i][j])
22 abort ();
23 }
24
gramSchmidt_ref(int Q[][COLS],const int rows,const int cols)25 void gramSchmidt_ref (int Q[][COLS], const int rows, const int cols)
26 {
27 int i, k;
28
29 for (k = 0; k < cols; k++)
30 {
31 int tmp = 0;
32
33 for (i = 0; i < rows; i++)
34 tmp += (Q[i][k] * Q[i][k]);
35
36 for (i = 0; i < rows; i++)
37 Q[i][k] *= tmp;
38 }
39 }
40
gramSchmidt(int Q[][COLS],const int rows,const int cols)41 void gramSchmidt (int Q[][COLS], const int rows, const int cols)
42 {
43 int i, k;
44
45 #pragma omp target data map(Q[0:rows][0:cols]) map(to:COLS)
46 for (k = 0; k < cols; k++)
47 {
48 int tmp = 0;
49
50 #pragma omp target map(tofrom:tmp)
51 #pragma omp parallel for reduction(+:tmp)
52 for (i = 0; i < rows; i++)
53 tmp += (Q[i][k] * Q[i][k]);
54
55 #pragma omp target
56 #pragma omp parallel for
57 for (i = 0; i < rows; i++)
58 Q[i][k] *= tmp;
59 }
60 }
61
main()62 int main ()
63 {
64 int (*Q1)[COLS] = (int(*)[COLS]) malloc (ROWS * COLS * sizeof (int));
65 int (*Q2)[COLS] = (int(*)[COLS]) malloc (ROWS * COLS * sizeof (int));
66
67 init (Q1, ROWS, COLS);
68 init (Q2, ROWS, COLS);
69
70 gramSchmidt_ref (Q1, ROWS, COLS);
71 gramSchmidt (Q2, ROWS, COLS);
72
73 check (Q1, Q2, ROWS, COLS);
74
75 free (Q1);
76 free (Q2);
77
78 return 0;
79 }
80