(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.oacc-c-c++-common/
structured-dynamic-lifetimes-3.c
       1  /* Test nested dynamic/structured data mappings (multiple blocks on data
       2     regions).  */
       3  
       4  /* { dg-skip-if "" { *-*-* } { "-DACC_MEM_SHARED=1" } } */
       5  
       6  #include <openacc.h>
       7  #include <assert.h>
       8  #include <stdlib.h>
       9  
      10  #define SIZE 1024
      11  
      12  void
      13  f1 (void)
      14  {
      15    char *block1 = (char *) malloc (SIZE);
      16    char *block2 = (char *) malloc (SIZE);
      17  
      18  #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
      19    {
      20  #ifdef OPENACC_API
      21      acc_copyin (block1, SIZE);
      22      acc_copyout (block1, SIZE);
      23  #else
      24  #pragma acc enter data copyin(block1[0:SIZE])
      25  #pragma acc exit data copyout(block1[0:SIZE])
      26  #endif
      27    }
      28  
      29    assert (!acc_is_present (block1, SIZE));
      30    assert (!acc_is_present (block2, SIZE));
      31  
      32    free (block1);
      33    free (block2);
      34  }
      35  
      36  void
      37  f2 (void)
      38  {
      39    char *block1 = (char *) malloc (SIZE);
      40    char *block2 = (char *) malloc (SIZE);
      41  
      42  #ifdef OPENACC_API
      43    acc_copyin (block1, SIZE);
      44  #else
      45  #pragma acc enter data copyin(block1[0:SIZE])
      46  #endif
      47  
      48  #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
      49    {
      50    }
      51  
      52  #ifdef OPENACC_API
      53    acc_copyout (block1, SIZE);
      54  #else
      55  #pragma acc exit data copyout(block1[0:SIZE])
      56  #endif
      57  
      58    assert (!acc_is_present (block1, SIZE));
      59    assert (!acc_is_present (block2, SIZE));
      60  
      61    free (block1);
      62    free (block2);
      63  }
      64  
      65  void
      66  f3 (void)
      67  {
      68    char *block1 = (char *) malloc (SIZE);
      69    char *block2 = (char *) malloc (SIZE);
      70  
      71  #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
      72    {
      73  #ifdef OPENACC_API
      74      acc_copyin (block1, SIZE);
      75      acc_copyin (block2, SIZE);
      76      acc_copyout (block2, SIZE);
      77      acc_copyout (block1, SIZE);
      78  #else
      79  #pragma acc enter data copyin(block1[0:SIZE])
      80  #pragma acc enter data copyin(block2[0:SIZE])
      81  #pragma acc exit data copyout(block2[0:SIZE])
      82  #pragma acc exit data copyout(block1[0:SIZE])
      83  #endif
      84    }
      85  
      86    assert (!acc_is_present (block1, SIZE));
      87    assert (!acc_is_present (block2, SIZE));
      88  
      89    free (block1);
      90    free (block2);
      91  }
      92  
      93  void
      94  f4 (void)
      95  {
      96    char *block1 = (char *) malloc (SIZE);
      97    char *block2 = (char *) malloc (SIZE);
      98  
      99  #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
     100    {
     101  #ifdef OPENACC_API
     102      acc_copyin (block1, SIZE);
     103  #else
     104  #pragma acc enter data copyin(block1[0:SIZE])
     105  #endif
     106  
     107  #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
     108      {
     109  #ifdef OPENACC_API
     110        acc_copyin (block2, SIZE);
     111        acc_copyout (block2, SIZE);
     112  #else
     113  #pragma acc enter data copyin(block2[0:SIZE])
     114  #pragma acc exit data copyout(block2[0:SIZE])
     115  #endif
     116      }
     117  #ifdef OPENACC_API
     118    acc_copyout (block1, SIZE);
     119  #else
     120  #pragma acc exit data copyout(block1[0:SIZE])
     121  #endif
     122    }
     123  
     124    assert (!acc_is_present (block1, SIZE));
     125    assert (!acc_is_present (block2, SIZE));
     126  
     127    free (block1);
     128    free (block2);
     129  }
     130  
     131  void
     132  f5 (void)
     133  {
     134    char *block1 = (char *) malloc (SIZE);
     135    char *block2 = (char *) malloc (SIZE);
     136  
     137  #ifdef OPENACC_API
     138    acc_copyin (block1, SIZE);
     139  #else
     140  #pragma acc enter data copyin(block1[0:SIZE])
     141  #endif
     142  
     143  #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
     144    {
     145  #ifdef OPENACC_API
     146      acc_copyin (block2, SIZE);
     147  #else
     148  #pragma acc enter data copyin(block2[0:SIZE])
     149  #endif
     150  
     151  #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
     152      {
     153      }
     154  #ifdef OPENACC_API
     155      acc_copyout (block2, SIZE);
     156  #else
     157  #pragma acc exit data copyout(block2[0:SIZE])
     158  #endif
     159    }
     160  
     161  #ifdef OPENACC_API
     162    acc_copyout (block1, SIZE);
     163  #else
     164  #pragma acc exit data copyout(block1[0:SIZE])
     165  #endif
     166  
     167    assert (!acc_is_present (block1, SIZE));
     168    assert (!acc_is_present (block2, SIZE));
     169  
     170    free (block1);
     171    free (block2);
     172  }
     173  
     174  int
     175  main (int argc, char *argv[])
     176  {
     177    f1 ();
     178    f2 ();
     179    f3 ();
     180    f4 ();
     181    f5 ();
     182    return 0;
     183  }