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