1 #include <openacc.h>
2 #include <stdlib.h>
3 #include <stdbool.h>
4 
5 #define N   32
6 
7 int
main(int argc,char ** argv)8 main(int argc, char **argv)
9 {
10     float *a, *b, *d_a, *d_b, exp, exp2;
11     int i;
12     const int one = 1;
13     const int zero = 0;
14     int n;
15 
16     a = (float *) malloc (N * sizeof (float));
17     b = (float *) malloc (N * sizeof (float));
18     d_a = (float *) acc_malloc (N * sizeof (float));
19     d_b = (float *) acc_malloc (N * sizeof (float));
20 
21     for (i = 0; i < N; i++)
22         a[i] = 4.0;
23 
24 #pragma acc parallel copyin(a[0:N]) copyout(b[0:N]) if(1)
25     {
26         int ii;
27 
28         for (ii = 0; ii < N; ii++)
29         {
30             if (acc_on_device (acc_device_host))
31                 b[ii] = a[ii] + 1;
32             else
33                 b[ii] = a[ii];
34         }
35     }
36 
37 #if ACC_MEM_SHARED
38     exp = 5.0;
39 #else
40     exp = 4.0;
41 #endif
42 
43     for (i = 0; i < N; i++)
44     {
45         if (b[i] != exp)
46             abort();
47     }
48 
49     for (i = 0; i < N; i++)
50         a[i] = 16.0;
51 
52 #pragma acc parallel if(0)
53     {
54         int ii;
55 
56         for (ii = 0; ii < N; ii++)
57         {
58             if (acc_on_device (acc_device_host))
59                 b[ii] = a[ii] + 1;
60             else
61                 b[ii] = a[ii];
62         }
63     }
64 
65     for (i = 0; i < N; i++)
66     {
67         if (b[i] != 17.0)
68             abort();
69     }
70 
71     for (i = 0; i < N; i++)
72         a[i] = 8.0;
73 
74 #pragma acc parallel copyin(a[0:N]) copyout(b[0:N]) if(one)
75     {
76         int ii;
77 
78         for (ii = 0; ii < N; ii++)
79         {
80             if (acc_on_device (acc_device_host))
81                 b[ii] = a[ii] + 1;
82             else
83                 b[ii] = a[ii];
84         }
85     }
86 
87 #if ACC_MEM_SHARED
88     exp = 9.0;
89 #else
90     exp = 8.0;
91 #endif
92 
93     for (i = 0; i < N; i++)
94     {
95         if (b[i] != exp)
96             abort();
97     }
98 
99     for (i = 0; i < N; i++)
100         a[i] = 22.0;
101 
102 #pragma acc parallel if(zero)
103     {
104         int ii;
105 
106         for (ii = 0; ii < N; ii++)
107         {
108             if (acc_on_device (acc_device_host))
109                 b[ii] = a[ii] + 1;
110             else
111                 b[ii] = a[ii];
112         }
113     }
114 
115     for (i = 0; i < N; i++)
116     {
117         if (b[i] != 23.0)
118             abort();
119     }
120 
121     for (i = 0; i < N; i++)
122         a[i] = 16.0;
123 
124 #pragma acc parallel copyin(a[0:N]) copyout(b[0:N]) if(true)
125     {
126         int ii;
127 
128         for (ii = 0; ii < N; ii++)
129         {
130             if (acc_on_device (acc_device_host))
131                 b[ii] = a[ii] + 1;
132             else
133                 b[ii] = a[ii];
134         }
135     }
136 
137 #if ACC_MEM_SHARED
138     exp = 17.0;
139 #else
140     exp = 16.0;
141 #endif
142 
143     for (i = 0; i < N; i++)
144     {
145         if (b[i] != exp)
146             abort();
147     }
148 
149     for (i = 0; i < N; i++)
150         a[i] = 76.0;
151 
152 #pragma acc parallel if(false)
153     {
154         int ii;
155 
156         for (ii = 0; ii < N; ii++)
157         {
158             if (acc_on_device (acc_device_host))
159                 b[ii] = a[ii] + 1;
160             else
161                 b[ii] = a[ii];
162         }
163     }
164 
165     for (i = 0; i < N; i++)
166     {
167         if (b[i] != 77.0)
168             abort();
169     }
170 
171     for (i = 0; i < N; i++)
172         a[i] = 22.0;
173 
174     n = 1;
175 
176 #pragma acc parallel copyin(a[0:N]) copyout(b[0:N]) if(n)
177     {
178         int ii;
179 
180         for (ii = 0; ii < N; ii++)
181         {
182             if (acc_on_device (acc_device_host))
183                 b[ii] = a[ii] + 1;
184             else
185                 b[ii] = a[ii];
186         }
187     }
188 
189 #if ACC_MEM_SHARED
190     exp = 23.0;
191 #else
192     exp = 22.0;
193 #endif
194 
195     for (i = 0; i < N; i++)
196     {
197         if (b[i] != exp)
198             abort();
199     }
200 
201     for (i = 0; i < N; i++)
202         a[i] = 18.0;
203 
204     n = 0;
205 
206 #pragma acc parallel if(n)
207     {
208         int ii;
209 
210         for (ii = 0; ii < N; ii++)
211         {
212             if (acc_on_device (acc_device_host))
213                 b[ii] = a[ii] + 1;
214             else
215                 b[ii] = a[ii];
216         }
217     }
218 
219     for (i = 0; i < N; i++)
220     {
221         if (b[i] != 19.0)
222             abort();
223     }
224 
225     for (i = 0; i < N; i++)
226         a[i] = 49.0;
227 
228     n = 1;
229 
230 #pragma acc parallel copyin(a[0:N]) copyout(b[0:N]) if(n + n)
231     {
232         int ii;
233 
234         for (ii = 0; ii < N; ii++)
235         {
236             if (acc_on_device (acc_device_host))
237                 b[ii] = a[ii] + 1;
238             else
239                 b[ii] = a[ii];
240         }
241     }
242 
243 #if ACC_MEM_SHARED
244     exp = 50.0;
245 #else
246     exp = 49.0;
247 #endif
248 
249     for (i = 0; i < N; i++)
250     {
251         if (b[i] != exp)
252             abort();
253     }
254 
255     for (i = 0; i < N; i++)
256         a[i] = 38.0;
257 
258     n = 0;
259 
260 #pragma acc parallel if(n + n)
261     {
262         int ii;
263 
264         for (ii = 0; ii < N; ii++)
265         {
266             if (acc_on_device (acc_device_host))
267                 b[ii] = a[ii] + 1;
268             else
269                 b[ii] = a[ii];
270         }
271     }
272 
273     for (i = 0; i < N; i++)
274     {
275         if (b[i] != 39.0)
276             abort();
277     }
278 
279     for (i = 0; i < N; i++)
280         a[i] = 91.0;
281 
282 #pragma acc parallel copyin(a[0:N]) copyout(b[0:N]) if(-2)
283     {
284         int ii;
285 
286         for (ii = 0; ii < N; ii++)
287         {
288             if (acc_on_device (acc_device_host))
289                 b[ii] = a[ii] + 1;
290             else
291                 b[ii] = a[ii];
292         }
293     }
294 
295 #if ACC_MEM_SHARED
296     exp = 92.0;
297 #else
298     exp = 91.0;
299 #endif
300 
301     for (i = 0; i < N; i++)
302     {
303         if (b[i] != exp)
304             abort();
305     }
306 
307     for (i = 0; i < N; i++)
308         a[i] = 43.0;
309 
310 #pragma acc parallel copyin(a[0:N]) copyout(b[0:N]) if(one == 1)
311     {
312         int ii;
313 
314         for (ii = 0; ii < N; ii++)
315         {
316             if (acc_on_device (acc_device_host))
317                 b[ii] = a[ii] + 1;
318             else
319                 b[ii] = a[ii];
320         }
321     }
322 
323 #if ACC_MEM_SHARED
324     exp = 44.0;
325 #else
326     exp = 43.0;
327 #endif
328 
329     for (i = 0; i < N; i++)
330     {
331         if (b[i] != exp)
332             abort();
333     }
334 
335     for (i = 0; i < N; i++)
336         a[i] = 87.0;
337 
338 #pragma acc parallel if(one == 0)
339     {
340         int ii;
341 
342         for (ii = 0; ii < N; ii++)
343         {
344             if (acc_on_device (acc_device_host))
345                 b[ii] = a[ii] + 1;
346             else
347                 b[ii] = a[ii];
348         }
349     }
350 
351     for (i = 0; i < N; i++)
352     {
353         if (b[i] != 88.0)
354             abort();
355     }
356 
357     for (i = 0; i < N; i++)
358     {
359         a[i] = 3.0;
360         b[i] = 9.0;
361     }
362 
363 #if ACC_MEM_SHARED
364     exp = 0.0;
365     exp2 = 0.0;
366 #else
367     acc_map_data (a, d_a, N * sizeof (float));
368     acc_map_data (b, d_b, N * sizeof (float));
369     exp = 3.0;
370     exp2 = 9.0;
371 #endif
372 
373 #pragma acc update device(a[0:N], b[0:N]) if(1)
374 
375     for (i = 0; i < N; i++)
376     {
377         a[i] = 0.0;
378         b[i] = 0.0;
379     }
380 
381 #pragma acc update host(a[0:N], b[0:N]) if(1)
382 
383     for (i = 0; i < N; i++)
384     {
385         if (a[i] != exp)
386             abort();
387 
388         if (b[i] != exp2)
389             abort();
390     }
391 
392     for (i = 0; i < N; i++)
393     {
394         a[i] = 6.0;
395         b[i] = 12.0;
396     }
397 
398 #pragma acc update device(a[0:N], b[0:N]) if(0)
399 
400     for (i = 0; i < N; i++)
401     {
402         a[i] = 0.0;
403         b[i] = 0.0;
404     }
405 
406 #pragma acc update host(a[0:N], b[0:N]) if(1)
407 
408     for (i = 0; i < N; i++)
409     {
410         if (a[i] != exp)
411             abort();
412 
413         if (b[i] != exp2)
414             abort();
415     }
416 
417     for (i = 0; i < N; i++)
418     {
419         a[i] = 26.0;
420         b[i] = 21.0;
421     }
422 
423 #pragma acc update device(a[0:N], b[0:N]) if(1)
424 
425     for (i = 0; i < N; i++)
426     {
427         a[i] = 0.0;
428         b[i] = 0.0;
429     }
430 
431 #pragma acc update host(a[0:N], b[0:N]) if(0)
432 
433     for (i = 0; i < N; i++)
434     {
435         if (a[i] != 0.0)
436             abort();
437 
438         if (b[i] != 0.0)
439             abort();
440     }
441 
442 #if !ACC_MEM_SHARED
443     acc_unmap_data (a);
444     acc_unmap_data (b);
445 #endif
446 
447     acc_free (d_a);
448     acc_free (d_b);
449 
450     for (i = 0; i < N; i++)
451     {
452         a[i] = 4.0;
453         b[i] = 0.0;
454     }
455 
456 #pragma acc data copyin(a[0:N]) copyout(b[0:N]) if(1)
457 {
458 #pragma acc parallel present(a[0:N])
459     {
460         int ii;
461 
462         for (ii = 0; ii < N; ii++)
463         {
464             b[ii] = a[ii];
465         }
466     }
467 }
468 
469     for (i = 0; i < N; i++)
470     {
471         if (b[i] != 4.0)
472             abort();
473     }
474 
475     for (i = 0; i < N; i++)
476     {
477         a[i] = 8.0;
478         b[i] = 1.0;
479     }
480 
481 #pragma acc data copyin(a[0:N]) copyout(b[0:N]) if(0)
482 {
483 #if !ACC_MEM_SHARED
484     if (acc_is_present (a, N * sizeof (float)))
485         abort ();
486 #endif
487 
488 #if !ACC_MEM_SHARED
489     if (acc_is_present (b, N * sizeof (float)))
490         abort ();
491 #endif
492 }
493 
494     for (i = 0; i < N; i++)
495     {
496         a[i] = 18.0;
497         b[i] = 21.0;
498     }
499 
500 #pragma acc data copyin(a[0:N]) if(1)
501 {
502 #if !ACC_MEM_SHARED
503     if (!acc_is_present (a, N * sizeof (float)))
504         abort ();
505 #endif
506 
507 #pragma acc data copyout(b[0:N]) if(0)
508     {
509 #if !ACC_MEM_SHARED
510         if (acc_is_present (b, N * sizeof (float)))
511             abort ();
512 #endif
513 
514 #pragma acc data copyout(b[0:N]) if(1)
515         {
516 #pragma acc parallel present(a[0:N]) present(b[0:N])
517             {
518                 int ii;
519 
520                 for (ii = 0; ii < N; ii++)
521                 {
522                     b[ii] = a[ii];
523                 }
524             }
525         }
526 
527 #if !ACC_MEM_SHARED
528         if (acc_is_present (b, N * sizeof (float)))
529             abort ();
530 #endif
531     }
532 }
533 
534     for (i = 0; i < N; i++)
535     {
536         if (b[i] != 18.0)
537             abort ();
538     }
539 
540 #pragma acc enter data copyin (b[0:N]) if (0)
541 
542 #if !ACC_MEM_SHARED
543     if (acc_is_present (b, N * sizeof (float)))
544 	abort ();
545 #endif
546 
547 #pragma acc exit data delete (b[0:N]) if (0)
548 
549 #pragma acc enter data copyin (b[0:N]) if (1)
550 
551 #if !ACC_MEM_SHARED
552     if (!acc_is_present (b, N * sizeof (float)))
553 	abort ();
554 #endif
555 
556 #pragma acc exit data delete (b[0:N]) if (1)
557 
558 #if !ACC_MEM_SHARED
559     if (acc_is_present (b, N * sizeof (float)))
560 	abort ();
561 #endif
562 
563 #pragma acc enter data copyin (b[0:N]) if (zero)
564 
565 #if !ACC_MEM_SHARED
566     if (acc_is_present (b, N * sizeof (float)))
567 	abort ();
568 #endif
569 
570 #pragma acc exit data delete (b[0:N]) if (zero)
571 
572 #pragma acc enter data copyin (b[0:N]) if (one)
573 
574 #if !ACC_MEM_SHARED
575     if (!acc_is_present (b, N * sizeof (float)))
576 	abort ();
577 #endif
578 
579 #pragma acc exit data delete (b[0:N]) if (one)
580 
581 #if !ACC_MEM_SHARED
582     if (acc_is_present (b, N * sizeof (float)))
583 	abort ();
584 #endif
585 
586 #pragma acc enter data copyin (b[0:N]) if (one == 0)
587 
588 #if !ACC_MEM_SHARED
589     if (acc_is_present (b, N * sizeof (float)))
590 	abort ();
591 #endif
592 
593 #pragma acc exit data delete (b[0:N]) if (one == 0)
594 
595 #pragma acc enter data copyin (b[0:N]) if (one == 1)
596 
597 #if !ACC_MEM_SHARED
598     if (!acc_is_present (b, N * sizeof (float)))
599 	abort ();
600 #endif
601 
602 #pragma acc exit data delete (b[0:N]) if (one == 1)
603 
604 #if !ACC_MEM_SHARED
605     if (acc_is_present (b, N * sizeof (float)))
606 	abort ();
607 #endif
608 
609     for (i = 0; i < N; i++)
610         a[i] = 4.0;
611 
612 #pragma acc kernels copyin(a[0:N]) copyout(b[0:N]) if(1)
613     {
614         int ii;
615 
616         for (ii = 0; ii < N; ii++)
617         {
618             if (acc_on_device (acc_device_host))
619                 b[ii] = a[ii] + 1;
620             else
621                 b[ii] = a[ii];
622         }
623     }
624 
625 #if ACC_MEM_SHARED
626     exp = 5.0;
627 #else
628     exp = 4.0;
629 #endif
630 
631     for (i = 0; i < N; i++)
632     {
633         if (b[i] != exp)
634             abort();
635     }
636 
637     for (i = 0; i < N; i++)
638         a[i] = 16.0;
639 
640 #pragma acc kernels if(0)
641     {
642         int ii;
643 
644         for (ii = 0; ii < N; ii++)
645         {
646             if (acc_on_device (acc_device_host))
647                 b[ii] = a[ii] + 1;
648             else
649                 b[ii] = a[ii];
650         }
651     }
652 
653     for (i = 0; i < N; i++)
654     {
655         if (b[i] != 17.0)
656             abort();
657     }
658 
659     for (i = 0; i < N; i++)
660         a[i] = 8.0;
661 
662 #pragma acc kernels copyin(a[0:N]) copyout(b[0:N]) if(one)
663     {
664         int ii;
665 
666         for (ii = 0; ii < N; ii++)
667         {
668             if (acc_on_device (acc_device_host))
669                 b[ii] = a[ii] + 1;
670             else
671                 b[ii] = a[ii];
672         }
673     }
674 
675 #if ACC_MEM_SHARED
676     exp = 9.0;
677 #else
678     exp = 8.0;
679 #endif
680 
681     for (i = 0; i < N; i++)
682     {
683         if (b[i] != exp)
684             abort();
685     }
686 
687     for (i = 0; i < N; i++)
688         a[i] = 22.0;
689 
690 #pragma acc kernels if(zero)
691     {
692         int ii;
693 
694         for (ii = 0; ii < N; ii++)
695         {
696             if (acc_on_device (acc_device_host))
697                 b[ii] = a[ii] + 1;
698             else
699                 b[ii] = a[ii];
700         }
701     }
702 
703     for (i = 0; i < N; i++)
704     {
705         if (b[i] != 23.0)
706             abort();
707     }
708 
709     for (i = 0; i < N; i++)
710         a[i] = 16.0;
711 
712 #pragma acc kernels copyin(a[0:N]) copyout(b[0:N]) if(true)
713     {
714         int ii;
715 
716         for (ii = 0; ii < N; ii++)
717         {
718             if (acc_on_device (acc_device_host))
719                 b[ii] = a[ii] + 1;
720             else
721                 b[ii] = a[ii];
722         }
723     }
724 
725 #if ACC_MEM_SHARED
726     exp = 17.0;
727 #else
728     exp = 16.0;
729 #endif
730 
731     for (i = 0; i < N; i++)
732     {
733         if (b[i] != exp)
734             abort();
735     }
736 
737     for (i = 0; i < N; i++)
738         a[i] = 76.0;
739 
740 #pragma acc kernels if(false)
741     {
742         int ii;
743 
744         for (ii = 0; ii < N; ii++)
745         {
746             if (acc_on_device (acc_device_host))
747                 b[ii] = a[ii] + 1;
748             else
749                 b[ii] = a[ii];
750         }
751     }
752 
753     for (i = 0; i < N; i++)
754     {
755         if (b[i] != 77.0)
756             abort();
757     }
758 
759     for (i = 0; i < N; i++)
760         a[i] = 22.0;
761 
762     n = 1;
763 
764 #pragma acc kernels copyin(a[0:N]) copyout(b[0:N]) if(n)
765     {
766         int ii;
767 
768         for (ii = 0; ii < N; ii++)
769         {
770             if (acc_on_device (acc_device_host))
771                 b[ii] = a[ii] + 1;
772             else
773                 b[ii] = a[ii];
774         }
775     }
776 
777 #if ACC_MEM_SHARED
778     exp = 23.0;
779 #else
780     exp = 22.0;
781 #endif
782 
783     for (i = 0; i < N; i++)
784     {
785         if (b[i] != exp)
786             abort();
787     }
788 
789     for (i = 0; i < N; i++)
790         a[i] = 18.0;
791 
792     n = 0;
793 
794 #pragma acc kernels if(n)
795     {
796         int ii;
797 
798         for (ii = 0; ii < N; ii++)
799         {
800             if (acc_on_device (acc_device_host))
801                 b[ii] = a[ii] + 1;
802             else
803                 b[ii] = a[ii];
804         }
805     }
806 
807     for (i = 0; i < N; i++)
808     {
809         if (b[i] != 19.0)
810             abort();
811     }
812 
813     for (i = 0; i < N; i++)
814         a[i] = 49.0;
815 
816     n = 1;
817 
818 #pragma acc kernels copyin(a[0:N]) copyout(b[0:N]) if(n + n)
819     {
820         int ii;
821 
822         for (ii = 0; ii < N; ii++)
823         {
824             if (acc_on_device (acc_device_host))
825                 b[ii] = a[ii] + 1;
826             else
827                 b[ii] = a[ii];
828         }
829     }
830 
831 #if ACC_MEM_SHARED
832     exp = 50.0;
833 #else
834     exp = 49.0;
835 #endif
836 
837     for (i = 0; i < N; i++)
838     {
839         if (b[i] != exp)
840             abort();
841     }
842 
843     for (i = 0; i < N; i++)
844         a[i] = 38.0;
845 
846     n = 0;
847 
848 #pragma acc kernels if(n + n)
849     {
850         int ii;
851 
852         for (ii = 0; ii < N; ii++)
853         {
854             if (acc_on_device (acc_device_host))
855                 b[ii] = a[ii] + 1;
856             else
857                 b[ii] = a[ii];
858         }
859     }
860 
861     for (i = 0; i < N; i++)
862     {
863         if (b[i] != 39.0)
864             abort();
865     }
866 
867     for (i = 0; i < N; i++)
868         a[i] = 91.0;
869 
870 #pragma acc kernels copyin(a[0:N]) copyout(b[0:N]) if(-2)
871     {
872         int ii;
873 
874         for (ii = 0; ii < N; ii++)
875         {
876             if (acc_on_device (acc_device_host))
877                 b[ii] = a[ii] + 1;
878             else
879                 b[ii] = a[ii];
880         }
881     }
882 
883 #if ACC_MEM_SHARED
884     exp = 92.0;
885 #else
886     exp = 91.0;
887 #endif
888 
889     for (i = 0; i < N; i++)
890     {
891         if (b[i] != exp)
892             abort();
893     }
894 
895     for (i = 0; i < N; i++)
896         a[i] = 43.0;
897 
898 #pragma acc kernels copyin(a[0:N]) copyout(b[0:N]) if(one == 1)
899     {
900         int ii;
901 
902         for (ii = 0; ii < N; ii++)
903         {
904             if (acc_on_device (acc_device_host))
905                 b[ii] = a[ii] + 1;
906             else
907                 b[ii] = a[ii];
908         }
909     }
910 
911 #if ACC_MEM_SHARED
912     exp = 44.0;
913 #else
914     exp = 43.0;
915 #endif
916 
917     for (i = 0; i < N; i++)
918     {
919         if (b[i] != exp)
920             abort();
921     }
922 
923     for (i = 0; i < N; i++)
924         a[i] = 87.0;
925 
926 #pragma acc kernels if(one == 0)
927     {
928         int ii;
929 
930         for (ii = 0; ii < N; ii++)
931         {
932             if (acc_on_device (acc_device_host))
933                 b[ii] = a[ii] + 1;
934             else
935                 b[ii] = a[ii];
936         }
937     }
938 
939     for (i = 0; i < N; i++)
940     {
941         if (b[i] != 88.0)
942             abort();
943     }
944 
945     for (i = 0; i < N; i++)
946     {
947         a[i] = 3.0;
948         b[i] = 9.0;
949     }
950 
951 #if ACC_MEM_SHARED
952     exp = 0.0;
953     exp2 = 0.0;
954 #else
955     acc_map_data (a, d_a, N * sizeof (float));
956     acc_map_data (b, d_b, N * sizeof (float));
957     exp = 3.0;
958     exp2 = 9.0;
959 #endif
960 
961     return 0;
962 }
963