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