aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/libgomp/testsuite/libgomp.c/target-1.c
blob: f734d3c279dcd9e07b93e1ba21300e5fd4378566 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
extern
#ifdef __cplusplus
"C"
#endif
void abort (void);

void
fn1 (double *x, double *y, int z)
{
  int i;
  for (i = 0; i < z; i++)
    {
      x[i] = i & 31;
      y[i] = (i & 63) - 30;
    }
}

#pragma omp declare target
int tgtv = 6;
int
tgt (void)
{
  #pragma omp atomic update
    tgtv++;
  return 0;
}
#pragma omp end declare target

double
fn2 (int x, int y, int z)
{
  double b[1024], c[1024], s = 0;
  int i, j;
  fn1 (b, c, x);
  #pragma omp target data map(to: b)
  {
    #pragma omp target map(tofrom: c)
      #pragma omp teams num_teams(y) thread_limit(z) reduction(+:s) firstprivate(x)
	#pragma omp distribute dist_schedule(static, 4) collapse(1)
	  for (j=0; j < x; j += y)
	    #pragma omp parallel for reduction(+:s)
	      for (i = j; i < j + y; i++)
		tgt (), s += b[i] * c[i];
    #pragma omp target update from(b, tgtv)
  }
  return s;
}

double
fn3 (int x)
{
  double b[1024], c[1024], s = 0;
  int i;
  fn1 (b, c, x);
  #pragma omp target map(to: b, c)
    #pragma omp parallel for reduction(+:s)
      for (i = 0; i < x; i++)
	tgt (), s += b[i] * c[i];
  return s;
}

double
fn4 (int x, double *p)
{
  double b[1024], c[1024], d[1024], s = 0;
  int i;
  fn1 (b, c, x);
  fn1 (d + x, p + x, x);
  #pragma omp target map(to: b, c[0:x], d[x:x]) map(to:p[x:64 + (x & 31)])
    #pragma omp parallel for reduction(+:s)
      for (i = 0; i < x; i++)
	s += b[i] * c[i] + d[x + i] + p[x + i];
  return s;
}

int
main ()
{
  double a = fn2 (128, 4, 6);
  int b = tgtv;
  double c = fn3 (61);
  #pragma omp target update from(tgtv)
  int d = tgtv;
  double e[1024];
  double f = fn4 (64, e);
  if (a != 13888.0 || b != 6 + 128 || c != 4062.0 || d != 6 + 128 + 61
      || f != 8032.0)
    abort ();
  return 0;
}