| /* { dg-do run } */ | |
| #include <stdlib.h> | |
| const int ROWS = 5; | |
| const int COLS = 5; | |
| void init (int Q[][COLS], const int rows, const int cols) | |
| { | |
| int i, j; | |
| for (i = 0; i < rows; i++) | |
| for (j = 0; j < cols; j++) | |
| Q[i][j] = (i + 1) * 100 + (j + 1); | |
| } | |
| void check (int a[][COLS], int b[][COLS], const int rows, const int cols) | |
| { | |
| int i, j; | |
| for (i = 0; i < rows; i++) | |
| for (j = 0; j < cols; j++) | |
| if (a[i][j] != b[i][j]) | |
| abort (); | |
| } | |
| void gramSchmidt_ref (int Q[][COLS], const int rows, const int cols) | |
| { | |
| int i, k; | |
| for (k = 0; k < cols; k++) | |
| { | |
| int tmp = 0; | |
| for (i = 0; i < rows; i++) | |
| tmp += (Q[i][k] * Q[i][k]); | |
| for (i = 0; i < rows; i++) | |
| Q[i][k] *= tmp; | |
| } | |
| } | |
| void gramSchmidt (int Q[][COLS], const int rows, const int cols) | |
| { | |
| int i, k; | |
| #pragma omp target data map(Q[0:rows][0:cols]) map(to:COLS) | |
| for (k = 0; k < cols; k++) | |
| { | |
| int tmp = 0; | |
| #pragma omp target map(tofrom:tmp) | |
| #pragma omp parallel for reduction(+:tmp) | |
| for (i = 0; i < rows; i++) | |
| tmp += (Q[i][k] * Q[i][k]); | |
| #pragma omp target | |
| #pragma omp parallel for | |
| for (i = 0; i < rows; i++) | |
| Q[i][k] *= tmp; | |
| } | |
| } | |
| int main () | |
| { | |
| int (*Q1)[COLS] = (int(*)[COLS]) malloc (ROWS * COLS * sizeof (int)); | |
| int (*Q2)[COLS] = (int(*)[COLS]) malloc (ROWS * COLS * sizeof (int)); | |
| init (Q1, ROWS, COLS); | |
| init (Q2, ROWS, COLS); | |
| gramSchmidt_ref (Q1, ROWS, COLS); | |
| gramSchmidt (Q2, ROWS, COLS); | |
| check (Q1, Q2, ROWS, COLS); | |
| free (Q1); | |
| free (Q2); | |
| return 0; | |
| } |