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