(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.oacc-c-c++-common/
data-2.c
       1  /* Test asynchronous, unstructed data regions, directives variant.  */
       2  /* See also data-2-lib.c.  */
       3  
       4  #include <stdlib.h>
       5  #undef NDEBUG
       6  #include <assert.h>
       7  
       8  int
       9  main (int argc, char **argv)
      10  {
      11    int N = 12345;
      12    float *a, *b, *c, *d, *e;
      13    int i;
      14    int nbytes;
      15  
      16    nbytes = N * sizeof (float);
      17  
      18    a = (float *) malloc (nbytes);
      19    b = (float *) malloc (nbytes);
      20    c = (float *) malloc (nbytes);
      21    d = (float *) malloc (nbytes);
      22    e = (float *) malloc (nbytes);
      23  
      24    for (i = 0; i < N; i++)
      25      {
      26        a[i] = 3.0;
      27        b[i] = 0.0;
      28      }
      29  
      30  #pragma acc enter data copyin (a[0:N]) async
      31  #pragma acc enter data copyin (b[0:N]) async
      32  #pragma acc enter data copyin (N) async
      33  
      34  #pragma acc parallel present (a[0:N], b[0:N], N) async
      35  #pragma acc loop
      36    for (i = 0; i < N; i++)
      37      b[i] = a[i];
      38  
      39  #pragma acc update self (a[0:N]) async
      40  #pragma acc update self (b[0:N]) async
      41  
      42  #pragma acc wait
      43  
      44    for (i = 0; i < N; i++)
      45      {
      46        assert (a[i] == 3.0);
      47        assert (b[i] == 3.0);
      48      }
      49  
      50    for (i = 0; i < N; i++)
      51      {
      52        a[i] = 2.0;
      53        b[i] = 0.0;
      54      }
      55  
      56  #pragma acc update device (a[0:N]) async (1)
      57  #pragma acc update device (b[0:N]) async (1)
      58  
      59  #pragma acc parallel present (a[0:N], b[0:N], N) async (1)
      60  #pragma acc loop
      61    for (i = 0; i < N; i++)
      62      b[i] = a[i];
      63  
      64  #pragma acc update self (a[0:N]) async (1)
      65  #pragma acc update self (b[0:N]) async (1)
      66  
      67  #pragma acc wait (1)
      68    /* Test unseen async-argument.  */
      69  #pragma acc wait (10)
      70  
      71    for (i = 0; i < N; i++)
      72      {
      73        assert (a[i] == 2.0);
      74        assert (b[i] == 2.0);
      75      }
      76  
      77    for (i = 0; i < N; i++)
      78      {
      79        a[i] = 3.0;
      80        b[i] = 0.0;
      81        c[i] = 0.0;
      82        d[i] = 0.0;
      83      }
      84  
      85  #pragma acc update device (a[0:N]) async (0)
      86  #pragma acc update device (b[0:N]) async (1)
      87  #pragma acc enter data copyin (c[0:N]) async (2)
      88  #pragma acc enter data copyin (d[0:N]) async (3)
      89  
      90  #pragma acc parallel present (a[0:N], b[0:N], N) wait (0) async (1)
      91  #pragma acc loop
      92    for (i = 0; i < N; i++)
      93      b[i] = (a[i] * a[i] * a[i]) / a[i];
      94  
      95  #pragma acc parallel present (a[0:N], c[0:N], N) wait (0) async (2)
      96  #pragma acc loop
      97    for (i = 0; i < N; i++)
      98      c[i] = (a[i] + a[i] + a[i] + a[i]) / a[i];
      99  
     100  #pragma acc parallel present (a[0:N], d[0:N], N) wait (0) async (3)
     101  #pragma acc loop
     102    for (i = 0; i < N; i++)
     103      d[i] = ((a[i] * a[i] + a[i]) / a[i]) - a[i];
     104  
     105  #pragma acc update self (a[0:N]) async (0)
     106  #pragma acc update self (b[0:N]) async (1)
     107  #pragma acc update self (c[0:N]) async (2)
     108  #pragma acc update self (d[0:N]) async (3)
     109  
     110  #pragma acc wait async (0)
     111  #pragma acc wait (0)
     112  
     113    for (i = 0; i < N; i++)
     114      {
     115        assert (a[i] == 3.0);
     116        assert (b[i] == 9.0);
     117        assert (c[i] == 4.0);
     118        assert (d[i] == 1.0);
     119      }
     120  
     121    for (i = 0; i < N; i++)
     122      {
     123        a[i] = 2.0;
     124        b[i] = 0.0;
     125        c[i] = 0.0;
     126        d[i] = 0.0;
     127        e[i] = 0.0;
     128      }
     129  
     130  #pragma acc update device (a[0:N]) async (10)
     131  #pragma acc update device (b[0:N]) async (11)
     132  #pragma acc update device (c[0:N]) async (12)
     133  #pragma acc update device (d[0:N]) async (13)
     134  #pragma acc enter data copyin (e[0:N]) async (14)
     135  
     136  #pragma acc parallel present (a[0:N], b[0:N], N) wait (10) async (11)
     137    for (int ii = 0; ii < N; ii++)
     138      b[ii] = (a[ii] * a[ii] * a[ii]) / a[ii];
     139  
     140  #pragma acc parallel present (a[0:N], c[0:N], N) wait (10) async (12)
     141    for (int ii = 0; ii < N; ii++)
     142      c[ii] = (a[ii] + a[ii] + a[ii] + a[ii]) / a[ii];
     143  
     144  #pragma acc parallel present (a[0:N], d[0:N], N) wait (10) async (13)
     145    for (int ii = 0; ii < N; ii++)
     146      d[ii] = ((a[ii] * a[ii] + a[ii]) / a[ii]) - a[ii];
     147  
     148  #pragma acc parallel present (a[0:N], b[0:N], c[0:N], d[0:N], e[0:N], N) wait (11) wait (12) wait (13) async (14)
     149    for (int ii = 0; ii < N; ii++)
     150      e[ii] = a[ii] + b[ii] + c[ii] + d[ii];
     151  
     152  #pragma acc exit data copyout (a[0:N]) async (10)
     153  #pragma acc exit data copyout (b[0:N]) async (11)
     154  #pragma acc exit data copyout (c[0:N]) async (12)
     155  #pragma acc exit data copyout (d[0:N]) async (13)
     156  #pragma acc exit data copyout (e[0:N]) async (14)
     157  #pragma acc exit data delete (N) async (15)
     158  #pragma acc wait
     159  
     160    for (i = 0; i < N; i++)
     161      {
     162        assert (a[i] == 2.0);
     163        assert (b[i] == 4.0);
     164        assert (c[i] == 4.0);
     165        assert (d[i] == 1.0);
     166        assert (e[i] == 11.0);
     167      }
     168  
     169    return 0;
     170  }