diff options
Diffstat (limited to 'libgomp/testsuite/libgomp.c/examples-4/e.55.2.c')
-rw-r--r-- | libgomp/testsuite/libgomp.c/examples-4/e.55.2.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/libgomp/testsuite/libgomp.c/examples-4/e.55.2.c b/libgomp/testsuite/libgomp.c/examples-4/e.55.2.c new file mode 100644 index 00000000000..f03cae372ff --- /dev/null +++ b/libgomp/testsuite/libgomp.c/examples-4/e.55.2.c @@ -0,0 +1,95 @@ +/* { dg-do run } */ +/* { dg-require-effective-target offload_device } */ + +#include <omp.h> +#include <stdlib.h> + +#define EPS 0.00001 +#define N 10000 + +#pragma omp declare target +void init (float *a, float *b, int n) +{ + int i; + for (i = 0; i < n; i++) + { + a[i] = 0.1 * i; + b[i] = 0.01 * i * i; + } +} +#pragma omp end declare target + +void vec_mult_ref (float *p, float *v1, float *v2, int n) +{ + int i; + + v1 = (float *) malloc (n * sizeof (float)); + v2 = (float *) malloc (n * sizeof (float)); + + init (v1, v2, n); + + for (i = 0; i < n; i++) + p[i] = v1[i] * v2[i]; + + free (v1); + free (v2); +} + +void vec_mult (float *p, float *v1, float *v2, int n) +{ + int i; + + #pragma omp task shared(v1, v2) depend(out: v1, v2) + #pragma omp target map(v1, v2) + { + if (omp_is_initial_device ()) + abort (); + + v1 = (float *) malloc (n * sizeof (float)); + v2 = (float *) malloc (n * sizeof (float)); + + init (v1, v2, n); + } + + #pragma omp task shared(v1, v2) depend(in: v1, v2) + #pragma omp target map(to: v1, v2) map(from: p[0:n]) + { + if (omp_is_initial_device ()) + abort (); + + #pragma omp parallel for + for (i = 0; i < n; i++) + p[i] = v1[i] * v2[i]; + + free (v1); + free (v2); + } +} + +void check (float *a, float *b, int n) +{ + int i; + for (i = 0 ; i < n ; i++) + { + float err = (a[i] == 0.0) ? b[i] : (b[i] - a[i]) / a[i]; + if (((err > 0) ? err : -err) > EPS) + abort (); + } +} + +int main () +{ + float *p1 = (float *) malloc (N * sizeof (float)); + float *p2 = (float *) malloc (N * sizeof (float)); + float *v1, *v2; + + vec_mult_ref (p1, v1, v2, N); + vec_mult (p2, v1, v2, N); + + check (p1, p2, N); + + free (p1); + free (p2); + + return 0; +} |