1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /* { dg-do run } */
- /* { dg-additional-options "-DTESTITERS=20" { target { ! run_expensive_tests } } } */
- #include <stdlib.h>
- #define EPS 0.00001
- #define N 1000
- #ifndef TESTITERS
- #define TESTITERS N
- #endif
- #pragma omp declare target
- float Q[N][N];
- float Pfun (const int i, const int k)
- {
- return Q[i][k] * Q[k][i];
- }
- #pragma omp end declare target
- void init ()
- {
- int i, j;
- for (i = 0; i < N; i++)
- for (j = 0; j < N; j++)
- Q[i][j] = 0.001 * i * j;
- }
- float accum_ref (int k)
- {
- int i;
- float tmp = 0.0;
- for (i = 0; i < N; i++)
- tmp += Pfun (i, k);
- return tmp;
- }
- float accum (int k)
- {
- int i;
- float tmp = 0.0;
- #pragma omp target map(tofrom:tmp)
- #pragma omp parallel for reduction(+:tmp)
- for (i = 0; i < N; i++)
- tmp += Pfun (i, k);
- return tmp;
- }
- void check (float a, float b)
- {
- float err = (b == 0.0) ? a : (a - b) / b;
- if (((err > 0) ? err : -err) > EPS)
- abort ();
- }
- int main ()
- {
- int i;
- init ();
- #pragma omp target update to(Q)
- for (i = 0; i < TESTITERS; i++)
- check (accum (i), accum_ref (i));
- return 0;
- }
|