(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.oacc-c-c++-common/
declare-1.c
       1  #include <openacc.h>
       2  #include <stdlib.h>
       3  
       4  #define N 8
       5  
       6  void
       7  subr2 (int *a)
       8  {
       9    int i;
      10    int f[N];
      11  #pragma acc declare copyout (f)
      12  
      13  #pragma acc parallel copy (a[0:N])
      14    {
      15      for (i = 0; i < N; i++)
      16        {
      17  	f[i] = a[i];
      18  	a[i] = f[i] + f[i] + f[i];
      19        }
      20    }
      21  }
      22  
      23  void
      24  subr1 (int *a)
      25  {
      26    int f[N];
      27  #pragma acc declare copy (f)
      28  
      29  #pragma acc parallel copy (a[0:N])
      30    {
      31      int i;
      32  
      33      for (i = 0; i < N; i++)
      34        {
      35  	f[i] = a[i];
      36  	a[i] = f[i] + f[i];
      37        }
      38    }
      39  }
      40  
      41  int b[N];
      42  #pragma acc declare create (b)
      43  
      44  int d[N] = { 1, 2, 3, 4, 5, 6, 7, 8 };
      45  #pragma acc declare copyin (d)
      46  
      47  static void
      48  f (void)
      49  {
      50    int a[N];
      51    int e[N];
      52  #pragma acc declare create (e)
      53    int i;
      54  
      55    for (i = 0; i < N; i++)
      56      a[i] = i + 1;
      57  
      58    if (!acc_is_present (&b, sizeof (b)))
      59      abort ();
      60  
      61    if (!acc_is_present (&d, sizeof (d)))
      62      abort ();
      63  
      64    if (!acc_is_present (&e, sizeof (e)))
      65      abort ();
      66  
      67  #pragma acc parallel copyin (a[0:N])
      68    {
      69      for (i = 0; i < N; i++)
      70        {
      71  	b[i] = a[i];
      72  	a[i] = b[i];
      73        }
      74    }
      75  
      76    for (i = 0; i < N; i++)
      77      {
      78        if (a[i] != i + 1)
      79  	abort ();
      80      }
      81  
      82  #pragma acc parallel copy (a[0:N])
      83    {
      84      for (i = 0; i < N; i++)
      85        {
      86  	e[i] = a[i] + d[i];
      87  	a[i] = e[i];
      88        }
      89    }
      90  
      91    for (i = 0; i < N; i++)
      92      {
      93        if (a[i] != (i + 1) * 2)
      94  	abort ();
      95      }
      96  
      97    for (i = 0; i < N; i++)
      98      {
      99        a[i] = 1234;
     100      }
     101  
     102    subr1 (&a[0]);
     103  
     104    for (i = 0; i < N; i++)
     105      {
     106        if (a[i] != 1234 * 2)
     107  	abort ();
     108      }
     109  
     110    subr2 (&a[0]);
     111  
     112    for (i = 0; i < N; i++)
     113      {
     114        if (a[i] != 1234 * 6)
     115  	abort ();
     116      }
     117  }
     118  
     119  
     120  /* The same as 'f' but everything contained in an OpenACC 'data' construct.  */
     121  
     122  static void
     123  f_data (void)
     124  {
     125  #pragma acc data
     126    {
     127      int a[N];
     128      int e[N];
     129  # pragma acc declare create (e)
     130      int i;
     131  
     132      for (i = 0; i < N; i++)
     133        a[i] = i + 1;
     134  
     135      if (!acc_is_present (&b, sizeof (b)))
     136        abort ();
     137  
     138      if (!acc_is_present (&d, sizeof (d)))
     139        abort ();
     140  
     141      if (!acc_is_present (&e, sizeof (e)))
     142        abort ();
     143  
     144  # pragma acc parallel copyin (a[0:N])
     145      {
     146        for (i = 0; i < N; i++)
     147  	{
     148  	  b[i] = a[i];
     149  	  a[i] = b[i];
     150  	}
     151      }
     152  
     153      for (i = 0; i < N; i++)
     154        {
     155  	if (a[i] != i + 1)
     156  	  abort ();
     157        }
     158  
     159  # pragma acc parallel copy (a[0:N])
     160      {
     161        for (i = 0; i < N; i++)
     162  	{
     163  	  e[i] = a[i] + d[i];
     164  	  a[i] = e[i];
     165  	}
     166      }
     167  
     168      for (i = 0; i < N; i++)
     169        {
     170  	if (a[i] != (i + 1) * 2)
     171  	  abort ();
     172        }
     173  
     174      for (i = 0; i < N; i++)
     175        {
     176  	a[i] = 1234;
     177        }
     178  
     179      subr1 (&a[0]);
     180  
     181      for (i = 0; i < N; i++)
     182        {
     183  	if (a[i] != 1234 * 2)
     184  	  abort ();
     185        }
     186  
     187      subr2 (&a[0]);
     188  
     189      for (i = 0; i < N; i++)
     190        {
     191  	if (a[i] != 1234 * 6)
     192  	  abort ();
     193        }
     194    }
     195  }
     196  
     197  
     198  int
     199  main (int argc, char **argv)
     200  {
     201    f ();
     202  
     203    f_data ();
     204  
     205    return 0;
     206  }