PR c++/86342 - -Wdeprecated-copy and system headers.
[official-gcc.git] / libgomp / testsuite / libgomp.oacc-c-c++-common / private-variables.c
blob53f03d17bb2f96b98b7ed385cb1d146d8b390762
1 #include <assert.h>
2 #include <openacc.h>
4 typedef struct {
5 int x, y;
6 } vec2;
8 typedef struct {
9 int x, y, z;
10 int attr[13];
11 } vec3_attr;
14 /* Test of gang-private variables declared in local scope with parallel
15 directive. */
17 void local_g_1()
19 int i, arr[32];
21 for (i = 0; i < 32; i++)
22 arr[i] = 3;
24 #pragma acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
26 int x;
28 #pragma acc loop gang(static:1)
29 for (i = 0; i < 32; i++)
30 x = i * 2;
32 #pragma acc loop gang(static:1)
33 for (i = 0; i < 32; i++)
35 if (acc_on_device (acc_device_host))
36 x = i * 2;
37 arr[i] += x;
41 for (i = 0; i < 32; i++)
42 assert (arr[i] == 3 + i * 2);
46 /* Test of worker-private variables declared in a local scope, broadcasting
47 to vector-partitioned mode. Back-to-back worker loops. */
49 void local_w_1()
51 int i, arr[32 * 32 * 32];
53 for (i = 0; i < 32 * 32 * 32; i++)
54 arr[i] = i;
56 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
58 int j;
60 #pragma acc loop gang
61 for (i = 0; i < 32; i++)
63 #pragma acc loop worker
64 for (j = 0; j < 32; j++)
66 int k;
67 int x = i ^ j * 3;
69 #pragma acc loop vector
70 for (k = 0; k < 32; k++)
71 arr[i * 1024 + j * 32 + k] += x * k;
74 #pragma acc loop worker
75 for (j = 0; j < 32; j++)
77 int k;
78 int x = i | j * 5;
80 #pragma acc loop vector
81 for (k = 0; k < 32; k++)
82 arr[i * 1024 + j * 32 + k] += x * k;
87 for (i = 0; i < 32; i++)
88 for (int j = 0; j < 32; j++)
89 for (int k = 0; k < 32; k++)
91 int idx = i * 1024 + j * 32 + k;
92 assert (arr[idx] == idx + (i ^ j * 3) * k + (i | j * 5) * k);
97 /* Test of worker-private variables declared in a local scope, broadcasting
98 to vector-partitioned mode. Successive vector loops. */
100 void local_w_2()
102 int i, arr[32 * 32 * 32];
104 for (i = 0; i < 32 * 32 * 32; i++)
105 arr[i] = i;
107 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
109 int j;
111 #pragma acc loop gang
112 for (i = 0; i < 32; i++)
114 #pragma acc loop worker
115 for (j = 0; j < 32; j++)
117 int k;
118 int x = i ^ j * 3;
120 #pragma acc loop vector
121 for (k = 0; k < 32; k++)
122 arr[i * 1024 + j * 32 + k] += x * k;
124 x = i | j * 5;
126 #pragma acc loop vector
127 for (k = 0; k < 32; k++)
128 arr[i * 1024 + j * 32 + k] += x * k;
133 for (i = 0; i < 32; i++)
134 for (int j = 0; j < 32; j++)
135 for (int k = 0; k < 32; k++)
137 int idx = i * 1024 + j * 32 + k;
138 assert (arr[idx] == idx + (i ^ j * 3) * k + (i | j * 5) * k);
143 /* Test of worker-private variables declared in a local scope, broadcasting
144 to vector-partitioned mode. Aggregate worker variable. */
146 void local_w_3()
148 int i, arr[32 * 32 * 32];
150 for (i = 0; i < 32 * 32 * 32; i++)
151 arr[i] = i;
153 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
155 int j;
157 #pragma acc loop gang
158 for (i = 0; i < 32; i++)
160 #pragma acc loop worker
161 for (j = 0; j < 32; j++)
163 int k;
164 vec2 pt;
166 pt.x = i ^ j * 3;
167 pt.y = i | j * 5;
169 #pragma acc loop vector
170 for (k = 0; k < 32; k++)
171 arr[i * 1024 + j * 32 + k] += pt.x * k;
173 #pragma acc loop vector
174 for (k = 0; k < 32; k++)
175 arr[i * 1024 + j * 32 + k] += pt.y * k;
180 for (i = 0; i < 32; i++)
181 for (int j = 0; j < 32; j++)
182 for (int k = 0; k < 32; k++)
184 int idx = i * 1024 + j * 32 + k;
185 assert (arr[idx] == idx + (i ^ j * 3) * k + (i | j * 5) * k);
190 /* Test of worker-private variables declared in a local scope, broadcasting
191 to vector-partitioned mode. Addressable worker variable. */
193 void local_w_4()
195 int i, arr[32 * 32 * 32];
197 for (i = 0; i < 32 * 32 * 32; i++)
198 arr[i] = i;
200 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
202 int j;
204 #pragma acc loop gang
205 for (i = 0; i < 32; i++)
207 #pragma acc loop worker
208 for (j = 0; j < 32; j++)
210 int k;
211 vec2 pt, *ptp;
213 ptp = &pt;
215 pt.x = i ^ j * 3;
217 #pragma acc loop vector
218 for (k = 0; k < 32; k++)
219 arr[i * 1024 + j * 32 + k] += ptp->x * k;
221 ptp->y = i | j * 5;
223 #pragma acc loop vector
224 for (k = 0; k < 32; k++)
225 arr[i * 1024 + j * 32 + k] += pt.y * k;
230 for (i = 0; i < 32; i++)
231 for (int j = 0; j < 32; j++)
232 for (int k = 0; k < 32; k++)
234 int idx = i * 1024 + j * 32 + k;
235 assert (arr[idx] == idx + (i ^ j * 3) * k + (i | j * 5) * k);
240 /* Test of worker-private variables declared in a local scope, broadcasting
241 to vector-partitioned mode. Array worker variable. */
243 void local_w_5()
245 int i, arr[32 * 32 * 32];
247 for (i = 0; i < 32 * 32 * 32; i++)
248 arr[i] = i;
250 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
252 int j;
254 #pragma acc loop gang
255 for (i = 0; i < 32; i++)
257 #pragma acc loop worker
258 for (j = 0; j < 32; j++)
260 int k;
261 int pt[2];
263 pt[0] = i ^ j * 3;
265 #pragma acc loop vector
266 for (k = 0; k < 32; k++)
267 arr[i * 1024 + j * 32 + k] += pt[0] * k;
269 pt[1] = i | j * 5;
271 #pragma acc loop vector
272 for (k = 0; k < 32; k++)
273 arr[i * 1024 + j * 32 + k] += pt[1] * k;
278 for (i = 0; i < 32; i++)
279 for (int j = 0; j < 32; j++)
280 for (int k = 0; k < 32; k++)
282 int idx = i * 1024 + j * 32 + k;
283 assert (arr[idx] == idx + (i ^ j * 3) * k + (i | j * 5) * k);
288 /* Test of gang-private variables declared on loop directive. */
290 void loop_g_1()
292 int x = 5, i, arr[32];
294 for (i = 0; i < 32; i++)
295 arr[i] = i;
297 #pragma acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
299 #pragma acc loop gang private(x)
300 for (i = 0; i < 32; i++)
302 x = i * 2;
303 arr[i] += x;
307 for (i = 0; i < 32; i++)
308 assert (arr[i] == i * 3);
312 /* Test of gang-private variables declared on loop directive, with broadcasting
313 to partitioned workers. */
315 void loop_g_2()
317 int x = 5, i, arr[32 * 32];
319 for (i = 0; i < 32 * 32; i++)
320 arr[i] = i;
322 #pragma acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
324 #pragma acc loop gang private(x)
325 for (i = 0; i < 32; i++)
327 x = i * 2;
329 #pragma acc loop worker
330 for (int j = 0; j < 32; j++)
331 arr[i * 32 + j] += x;
335 for (i = 0; i < 32 * 32; i++)
336 assert (arr[i] == i + (i / 32) * 2);
340 /* Test of gang-private variables declared on loop directive, with broadcasting
341 to partitioned vectors. */
343 void loop_g_3()
345 int x = 5, i, arr[32 * 32];
347 for (i = 0; i < 32 * 32; i++)
348 arr[i] = i;
350 #pragma acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
352 #pragma acc loop gang private(x)
353 for (i = 0; i < 32; i++)
355 x = i * 2;
357 #pragma acc loop vector
358 for (int j = 0; j < 32; j++)
359 arr[i * 32 + j] += x;
363 for (i = 0; i < 32 * 32; i++)
364 assert (arr[i] == i + (i / 32) * 2);
368 /* Test of gang-private addressable variable declared on loop directive, with
369 broadcasting to partitioned workers. */
371 void loop_g_4()
373 int x = 5, i, arr[32 * 32];
375 for (i = 0; i < 32 * 32; i++)
376 arr[i] = i;
378 #pragma acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
380 #pragma acc loop gang private(x)
381 for (i = 0; i < 32; i++)
383 int *p = &x;
385 x = i * 2;
387 #pragma acc loop worker
388 for (int j = 0; j < 32; j++)
389 arr[i * 32 + j] += x;
391 (*p)--;
395 for (i = 0; i < 32 * 32; i++)
396 assert (arr[i] == i + (i / 32) * 2);
400 /* Test of gang-private array variable declared on loop directive, with
401 broadcasting to partitioned workers. */
403 void loop_g_5()
405 int x[8], i, arr[32 * 32];
407 for (i = 0; i < 32 * 32; i++)
408 arr[i] = i;
410 #pragma acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
412 #pragma acc loop gang private(x)
413 for (i = 0; i < 32; i++)
415 for (int j = 0; j < 8; j++)
416 x[j] = j * 2;
418 #pragma acc loop worker
419 for (int j = 0; j < 32; j++)
420 arr[i * 32 + j] += x[j % 8];
424 for (i = 0; i < 32 * 32; i++)
425 assert (arr[i] == i + (i % 8) * 2);
429 /* Test of gang-private aggregate variable declared on loop directive, with
430 broadcasting to partitioned workers. */
432 void loop_g_6()
434 int i, arr[32 * 32];
435 vec3_attr pt;
437 for (i = 0; i < 32 * 32; i++)
438 arr[i] = i;
440 #pragma acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
442 #pragma acc loop gang private(pt)
443 for (i = 0; i < 32; i++)
445 pt.x = i;
446 pt.y = i * 2;
447 pt.z = i * 4;
448 pt.attr[5] = i * 6;
450 #pragma acc loop worker
451 for (int j = 0; j < 32; j++)
452 arr[i * 32 + j] += pt.x + pt.y + pt.z + pt.attr[5];
456 for (i = 0; i < 32 * 32; i++)
457 assert (arr[i] == i + (i / 32) * 13);
461 /* Test of vector-private variables declared on loop directive. */
463 void loop_v_1()
465 int x, i, arr[32 * 32 * 32];
467 for (i = 0; i < 32 * 32 * 32; i++)
468 arr[i] = i;
470 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
472 int j;
474 #pragma acc loop gang
475 for (i = 0; i < 32; i++)
477 #pragma acc loop worker
478 for (j = 0; j < 32; j++)
480 int k;
482 #pragma acc loop vector private(x)
483 for (k = 0; k < 32; k++)
485 x = i ^ j * 3;
486 arr[i * 1024 + j * 32 + k] += x * k;
489 #pragma acc loop vector private(x)
490 for (k = 0; k < 32; k++)
492 x = i | j * 5;
493 arr[i * 1024 + j * 32 + k] += x * k;
499 for (i = 0; i < 32; i++)
500 for (int j = 0; j < 32; j++)
501 for (int k = 0; k < 32; k++)
503 int idx = i * 1024 + j * 32 + k;
504 assert (arr[idx] == idx + (i ^ j * 3) * k + (i | j * 5) * k);
509 /* Test of vector-private variables declared on loop directive. Array type. */
511 void loop_v_2()
513 int pt[2], i, arr[32 * 32 * 32];
515 for (i = 0; i < 32 * 32 * 32; i++)
516 arr[i] = i;
518 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
520 int j;
522 #pragma acc loop gang
523 for (i = 0; i < 32; i++)
525 #pragma acc loop worker
526 for (j = 0; j < 32; j++)
528 int k;
530 #pragma acc loop vector private(pt)
531 for (k = 0; k < 32; k++)
533 pt[0] = i ^ j * 3;
534 pt[1] = i | j * 5;
535 arr[i * 1024 + j * 32 + k] += pt[0] * k;
536 arr[i * 1024 + j * 32 + k] += pt[1] * k;
542 for (i = 0; i < 32; i++)
543 for (int j = 0; j < 32; j++)
544 for (int k = 0; k < 32; k++)
546 int idx = i * 1024 + j * 32 + k;
547 assert (arr[idx] == idx + (i ^ j * 3) * k + (i | j * 5) * k);
552 /* Test of worker-private variables declared on a loop directive. */
554 void loop_w_1()
556 int x = 5, i, arr[32 * 32];
558 for (i = 0; i < 32 * 32; i++)
559 arr[i] = i;
561 #pragma acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
563 int j;
565 #pragma acc loop gang
566 for (i = 0; i < 32; i++)
568 #pragma acc loop worker private(x)
569 for (j = 0; j < 32; j++)
571 x = i ^ j * 3;
572 /* Try to ensure 'x' accesses doesn't get optimized into a
573 temporary. */
574 __asm__ __volatile__ ("");
575 arr[i * 32 + j] += x;
580 for (i = 0; i < 32 * 32; i++)
581 assert (arr[i] == i + ((i / 32) ^ (i % 32) * 3));
585 /* Test of worker-private variables declared on a loop directive, broadcasting
586 to vector-partitioned mode. */
588 void loop_w_2()
590 int x = 5, i, arr[32 * 32 * 32];
592 for (i = 0; i < 32 * 32 * 32; i++)
593 arr[i] = i;
595 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
597 int j;
599 #pragma acc loop gang
600 for (i = 0; i < 32; i++)
602 #pragma acc loop worker private(x)
603 for (j = 0; j < 32; j++)
605 int k;
606 x = i ^ j * 3;
608 #pragma acc loop vector
609 for (k = 0; k < 32; k++)
610 arr[i * 1024 + j * 32 + k] += x * k;
615 for (i = 0; i < 32; i++)
616 for (int j = 0; j < 32; j++)
617 for (int k = 0; k < 32; k++)
619 int idx = i * 1024 + j * 32 + k;
620 assert (arr[idx] == idx + (i ^ j * 3) * k);
625 /* Test of worker-private variables declared on a loop directive, broadcasting
626 to vector-partitioned mode. Back-to-back worker loops. */
628 void loop_w_3()
630 int x = 5, i, arr[32 * 32 * 32];
632 for (i = 0; i < 32 * 32 * 32; i++)
633 arr[i] = i;
635 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
637 int j;
639 #pragma acc loop gang
640 for (i = 0; i < 32; i++)
642 #pragma acc loop worker private(x)
643 for (j = 0; j < 32; j++)
645 int k;
646 x = i ^ j * 3;
648 #pragma acc loop vector
649 for (k = 0; k < 32; k++)
650 arr[i * 1024 + j * 32 + k] += x * k;
653 #pragma acc loop worker private(x)
654 for (j = 0; j < 32; j++)
656 int k;
657 x = i | j * 5;
659 #pragma acc loop vector
660 for (k = 0; k < 32; k++)
661 arr[i * 1024 + j * 32 + k] += x * k;
666 for (i = 0; i < 32; i++)
667 for (int j = 0; j < 32; j++)
668 for (int k = 0; k < 32; k++)
670 int idx = i * 1024 + j * 32 + k;
671 assert (arr[idx] == idx + (i ^ j * 3) * k + (i | j * 5) * k);
676 /* Test of worker-private variables declared on a loop directive, broadcasting
677 to vector-partitioned mode. Successive vector loops. */
679 void loop_w_4()
681 int x = 5, i, arr[32 * 32 * 32];
683 for (i = 0; i < 32 * 32 * 32; i++)
684 arr[i] = i;
686 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
688 int j;
690 #pragma acc loop gang
691 for (i = 0; i < 32; i++)
693 #pragma acc loop worker private(x)
694 for (j = 0; j < 32; j++)
696 int k;
697 x = i ^ j * 3;
699 #pragma acc loop vector
700 for (k = 0; k < 32; k++)
701 arr[i * 1024 + j * 32 + k] += x * k;
703 x = i | j * 5;
705 #pragma acc loop vector
706 for (k = 0; k < 32; k++)
707 arr[i * 1024 + j * 32 + k] += x * k;
712 for (i = 0; i < 32; i++)
713 for (int j = 0; j < 32; j++)
714 for (int k = 0; k < 32; k++)
716 int idx = i * 1024 + j * 32 + k;
717 assert (arr[idx] == idx + (i ^ j * 3) * k + (i | j * 5) * k);
722 /* Test of worker-private variables declared on a loop directive, broadcasting
723 to vector-partitioned mode. Addressable worker variable. */
725 void loop_w_5()
727 int x = 5, i, arr[32 * 32 * 32];
729 for (i = 0; i < 32 * 32 * 32; i++)
730 arr[i] = i;
732 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
734 int j;
736 #pragma acc loop gang
737 for (i = 0; i < 32; i++)
739 #pragma acc loop worker private(x)
740 for (j = 0; j < 32; j++)
742 int k;
743 int *p = &x;
745 x = i ^ j * 3;
747 #pragma acc loop vector
748 for (k = 0; k < 32; k++)
749 arr[i * 1024 + j * 32 + k] += x * k;
751 *p = i | j * 5;
753 #pragma acc loop vector
754 for (k = 0; k < 32; k++)
755 arr[i * 1024 + j * 32 + k] += x * k;
760 for (i = 0; i < 32; i++)
761 for (int j = 0; j < 32; j++)
762 for (int k = 0; k < 32; k++)
764 int idx = i * 1024 + j * 32 + k;
765 assert (arr[idx] == idx + (i ^ j * 3) * k + (i | j * 5) * k);
770 /* Test of worker-private variables declared on a loop directive, broadcasting
771 to vector-partitioned mode. Aggregate worker variable. */
773 void loop_w_6()
775 int i, arr[32 * 32 * 32];
776 vec2 pt;
778 for (i = 0; i < 32 * 32 * 32; i++)
779 arr[i] = i;
781 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
783 int j;
785 #pragma acc loop gang
786 for (i = 0; i < 32; i++)
788 #pragma acc loop worker private(pt)
789 for (j = 0; j < 32; j++)
791 int k;
793 pt.x = i ^ j * 3;
794 pt.y = i | j * 5;
796 #pragma acc loop vector
797 for (k = 0; k < 32; k++)
798 arr[i * 1024 + j * 32 + k] += pt.x * k;
800 #pragma acc loop vector
801 for (k = 0; k < 32; k++)
802 arr[i * 1024 + j * 32 + k] += pt.y * k;
807 for (i = 0; i < 32; i++)
808 for (int j = 0; j < 32; j++)
809 for (int k = 0; k < 32; k++)
811 int idx = i * 1024 + j * 32 + k;
812 assert (arr[idx] == idx + (i ^ j * 3) * k + (i | j * 5) * k);
817 /* Test of worker-private variables declared on loop directive, broadcasting
818 to vector-partitioned mode. Array worker variable. */
820 void loop_w_7()
822 int i, arr[32 * 32 * 32];
823 int pt[2];
825 for (i = 0; i < 32 * 32 * 32; i++)
826 arr[i] = i;
828 /* "pt" is treated as "present_or_copy" on the parallel directive because it
829 is an array variable. */
830 #pragma acc parallel copy(arr) num_gangs(32) num_workers(32) vector_length(32)
832 int j;
834 #pragma acc loop gang
835 for (i = 0; i < 32; i++)
837 /* But here, it is made private per-worker. */
838 #pragma acc loop worker private(pt)
839 for (j = 0; j < 32; j++)
841 int k;
843 pt[0] = i ^ j * 3;
845 #pragma acc loop vector
846 for (k = 0; k < 32; k++)
847 arr[i * 1024 + j * 32 + k] += pt[0] * k;
849 pt[1] = i | j * 5;
851 #pragma acc loop vector
852 for (k = 0; k < 32; k++)
853 arr[i * 1024 + j * 32 + k] += pt[1] * k;
858 for (i = 0; i < 32; i++)
859 for (int j = 0; j < 32; j++)
860 for (int k = 0; k < 32; k++)
862 int idx = i * 1024 + j * 32 + k;
863 assert (arr[idx] == idx + (i ^ j * 3) * k + (i | j * 5) * k);
868 /* Test of gang-private variables declared on the parallel directive. */
870 void parallel_g_1()
872 int x = 5, i, arr[32];
874 for (i = 0; i < 32; i++)
875 arr[i] = 3;
877 #pragma acc parallel private(x) copy(arr) num_gangs(32) num_workers(8) vector_length(32)
879 #pragma acc loop gang(static:1)
880 for (i = 0; i < 32; i++)
881 x = i * 2;
883 #pragma acc loop gang(static:1)
884 for (i = 0; i < 32; i++)
886 if (acc_on_device (acc_device_host))
887 x = i * 2;
888 arr[i] += x;
892 for (i = 0; i < 32; i++)
893 assert (arr[i] == 3 + i * 2);
897 /* Test of gang-private array variable declared on the parallel directive. */
899 void parallel_g_2()
901 int x[32], i, arr[32 * 32];
903 for (i = 0; i < 32 * 32; i++)
904 arr[i] = i;
906 #pragma acc parallel private(x) copy(arr) num_gangs(32) num_workers(2) vector_length(32)
908 #pragma acc loop gang
909 for (i = 0; i < 32; i++)
911 int j;
912 for (j = 0; j < 32; j++)
913 x[j] = j * 2;
915 #pragma acc loop worker
916 for (j = 0; j < 32; j++)
917 arr[i * 32 + j] += x[31 - j];
921 for (i = 0; i < 32 * 32; i++)
922 assert (arr[i] == i + (31 - (i % 32)) * 2);
926 int main ()
928 local_g_1();
929 local_w_1();
930 local_w_2();
931 local_w_3();
932 local_w_4();
933 local_w_5();
934 loop_g_1();
935 loop_g_2();
936 loop_g_3();
937 loop_g_4();
938 loop_g_5();
939 loop_g_6();
940 loop_v_1();
941 loop_v_2();
942 loop_w_1();
943 loop_w_2();
944 loop_w_3();
945 loop_w_4();
946 loop_w_5();
947 loop_w_6();
948 loop_w_7();
949 parallel_g_1();
950 parallel_g_2();
952 return 0;