1// { dg-do run } 2 3#include <omp.h> 4 5#define EPS 0.000001 6#define N 1000 7 8extern "C" void abort (void); 9 10void init (float *a1, float *a2, int n) 11{ 12 int s = -1; 13 for (int i = 0; i < n; i++) 14 { 15 a1[i] = s * 0.01; 16 a2[i] = i; 17 s = -s; 18 } 19} 20 21void check (float *a, float *b, int n) 22{ 23 for (int i = 0; i < n; i++) 24 if (a[i] - b[i] > EPS || b[i] - a[i] > EPS) 25 abort (); 26} 27 28void vec_mult_ref (float *&p, float *&v1, float *&v2, int n) 29{ 30 for (int i = 0; i < n; i++) 31 p[i] = v1[i] * v2[i]; 32} 33 34void vec_mult (float *&p, float *&v1, float *&v2, int n) 35{ 36 #pragma omp target map(to: v1[0:n], v2[:n]) map(from: p[0:n]) 37 #pragma omp parallel for 38 for (int i = 0; i < n; i++) 39 p[i] = v1[i] * v2[i]; 40} 41 42int main () 43{ 44 float *p = new float [N]; 45 float *p1 = new float [N]; 46 float *v1 = new float [N]; 47 float *v2 = new float [N]; 48 49 init (v1, v2, N); 50 51 vec_mult_ref (p, v1, v2, N); 52 vec_mult (p1, v1, v2, N); 53 54 check (p, p1, N); 55 56 delete [] p; 57 delete [] p1; 58 delete [] v1; 59 delete [] v2; 60 61 return 0; 62} 63