mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-02 18:53:22 +00:00
70 lines
1.0 KiB
C
70 lines
1.0 KiB
C
/* { 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;
|
|
}
|