123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- /* { dg-do run } */
- /* { dg-additional-options "-DCHUNKSZ=5000" { target { ! run_expensive_tests } } } */
- /* { dg-additional-options "-DCHUNKSZ=1000" { target run_expensive_tests } } */
- #include <stdlib.h>
- #define EPS 0.00001
- #define N 100000
- float Y[N];
- float Z[N];
- #pragma omp declare target
- float F (float a)
- {
- return -a;
- }
- #pragma omp end declare target
- void pipedF_ref ()
- {
- int i;
- for (i = 0; i < N; i++)
- Y[i] = F (Y[i]);
- }
- void pipedF ()
- {
- int i, C;
- for (C = 0; C < N; C += CHUNKSZ)
- {
- #pragma omp task
- #pragma omp target map(Z[C:CHUNKSZ])
- #pragma omp parallel for
- for (i = C; i < C + CHUNKSZ; i++)
- Z[i] = F (Z[i]);
- }
- #pragma omp taskwait
- }
- void init ()
- {
- int i;
- for (i = 0; i < N; i++)
- Y[i] = Z[i] = 0.1 * i;
- }
- void check ()
- {
- int i;
- for (i = 0; i < N; i++)
- {
- float err = (Z[i] == 0.0) ? Y[i] : (Y[i] - Z[i]) / Z[i];
- if (((err > 0) ? err : -err) > EPS)
- abort ();
- }
- }
- int main ()
- {
- init ();
- pipedF_ref ();
- pipedF ();
- check ();
- return 0;
- }
|