|  | /* { dg-do run } */ | 
|  |  | 
|  | #include <stdlib.h> | 
|  |  | 
|  | #define EPS 0.000001 | 
|  | #define N 100000 | 
|  |  | 
|  | #pragma omp declare target | 
|  | float p1[N], p2[N], v1[N], v2[N]; | 
|  | #pragma omp end declare target | 
|  |  | 
|  | void init () | 
|  | { | 
|  | int i, s = -1; | 
|  | for (i = 0; i < N; i++) | 
|  | { | 
|  | v1[i] = s * 0.01; | 
|  | v2[i] = i; | 
|  | s = -s; | 
|  | } | 
|  | } | 
|  |  | 
|  | void check () | 
|  | { | 
|  | int i; | 
|  | for (i = 0; i < N; i++) | 
|  | if (p1[i] - p2[i] > EPS || p2[i] - p1[i] > EPS) | 
|  | abort (); | 
|  | } | 
|  |  | 
|  | void vec_mult_ref () | 
|  | { | 
|  | int i; | 
|  | for (i = 0; i < N; i++) | 
|  | p1[i] = v1[i] * v2[i]; | 
|  | } | 
|  |  | 
|  | void vec_mult () | 
|  | { | 
|  | int i; | 
|  |  | 
|  | #pragma omp target update to(v1, v2) | 
|  |  | 
|  | #pragma omp target | 
|  | #pragma omp parallel for | 
|  | for (i = 0; i < N; i++) | 
|  | p2[i] = v1[i] * v2[i]; | 
|  |  | 
|  | #pragma omp target update from(p2) | 
|  | } | 
|  |  | 
|  | int main () | 
|  | { | 
|  | init (); | 
|  |  | 
|  | vec_mult_ref (); | 
|  | vec_mult (); | 
|  |  | 
|  | check (); | 
|  |  | 
|  | return 0; | 
|  | } |