[openacc] Add __builtin_goacc_parlevel_{id,size}
[gcc.git] / libgomp / testsuite / libgomp.oacc-c-c++-common / gang-static-2.c
1 #include <assert.h>
2 #include <openacc.h>
3 #include <gomp-constants.h>
4
5 #define N 100
6
7 #define GANG_ID(I) \
8 (acc_on_device (acc_device_not_host) \
9 ? __builtin_goacc_parlevel_id (GOMP_DIM_GANG) \
10 : (I))
11
12 void
13 test_static(int *a, int num_gangs, int sarg)
14 {
15 int i, j;
16
17 if (acc_on_device (acc_device_host))
18 return;
19
20 if (sarg == 0)
21 sarg = 1;
22
23 for (i = 0; i < N / sarg; i++)
24 for (j = 0; j < sarg; j++)
25 assert (a[i*sarg+j] == i % num_gangs);
26 }
27
28 void
29 test_nonstatic(int *a, int gangs)
30 {
31 int i, j;
32
33 if (acc_on_device (acc_device_host))
34 return;
35
36 for (i = 0; i < N; i+=gangs)
37 for (j = 0; j < gangs; j++)
38 assert (a[i+j] == i/gangs);
39 }
40
41 int
42 main ()
43 {
44 int a[N];
45 int i, x;
46
47 #pragma acc parallel loop gang (static:*) num_gangs (10)
48 for (i = 0; i < 100; i++)
49 a[i] = GANG_ID (i);
50
51 test_nonstatic (a, 10);
52
53 #pragma acc parallel loop gang (static:1) num_gangs (10)
54 for (i = 0; i < 100; i++)
55 a[i] = GANG_ID (i);
56
57 test_static (a, 10, 1);
58
59 #pragma acc parallel loop gang (static:2) num_gangs (10)
60 for (i = 0; i < 100; i++)
61 a[i] = GANG_ID (i);
62
63 test_static (a, 10, 2);
64
65 #pragma acc parallel loop gang (static:5) num_gangs (10)
66 for (i = 0; i < 100; i++)
67 a[i] = GANG_ID (i);
68
69 test_static (a, 10, 5);
70
71 #pragma acc parallel loop gang (static:20) num_gangs (10)
72 for (i = 0; i < 100; i++)
73 a[i] = GANG_ID (i);
74
75 test_static (a, 10, 20);
76
77 /* Non-static gang. */
78 #pragma acc parallel loop gang num_gangs (10)
79 for (i = 0; i < 100; i++)
80 a[i] = GANG_ID (i);
81
82 test_nonstatic (a, 10);
83
84 /* Static arguments with a variable expression. */
85
86 x = 20;
87 #pragma acc parallel loop gang (static:0+x) num_gangs (10)
88 for (i = 0; i < 100; i++)
89 a[i] = GANG_ID (i);
90
91 test_static (a, 10, 20);
92
93 x = 20;
94 #pragma acc parallel loop gang (static:x) num_gangs (10)
95 for (i = 0; i < 100; i++)
96 a[i] = GANG_ID (i);
97
98 test_static (a, 10, 20);
99
100 return 0;
101 }