| #define size 8 |
| |
| #pragma omp declare target |
| int |
| identity (int x) |
| { |
| return x; |
| } |
| |
| int |
| expx (int x, int n) |
| { |
| for (int i = 0; i < n - 1; i++) |
| x *= x; |
| |
| return x; |
| } |
| |
| float |
| init (int x, int y) |
| { |
| int x1 = identity (identity (identity (identity (x)))); |
| int y1 = identity (identity (identity (identity (y)))); |
| |
| int x2 = expx (x1, 2); |
| int y2 = expx (y1, 2); |
| |
| return (x2 + y2); |
| } |
| #pragma omp end declare target |
| |
| int |
| main () |
| { |
| int i, j; |
| int a[size][size]; |
| |
| #pragma omp target teams map(to:a[:size][:size]) |
| #pragma omp distribute parallel for default(none) private(i, j) shared(a) |
| for (i = 0; i < size; ++i) |
| for (j = 0; j < size; ++j) |
| a[i][j] = init (i, j); |
| |
| for (i = 0; i < size; ++i) |
| for (j = 0; j < size; ++j) |
| if (i * i + j * j != a[i][j]) |
| __builtin_abort (); |
| |
| return 0; |
| } |