Retro68/gcc/libgomp/testsuite/libgomp.c/examples-4/declare_target-4.c
2017-04-10 13:32:00 +02:00

72 lines
1.1 KiB
C

/* { 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;
}