(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.oacc-c-c++-common/
pr92843-1.c
       1  /* Verify that 'acc_copyout' etc. is a no-op if there's still a structured
       2     reference count.  */
       3  
       4  /* { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=0" } } */
       5  
       6  #include <assert.h>
       7  #include <stdlib.h>
       8  #include <openacc.h>
       9  
      10  
      11  const int c0 = 58;
      12  const int c1 = 81;
      13  
      14  static void
      15  assign_array (char *array, size_t size, char value)
      16  {
      17    for (size_t i = 0; i < size; ++i)
      18      array[i] = value;
      19  }
      20  
      21  static void
      22  verify_array (const char *array, size_t size, char value)
      23  {
      24    for (size_t i = 0; i < size; ++i)
      25      assert (array[i] == value);
      26  }
      27  
      28  
      29  float global_var;
      30  #pragma acc declare create (global_var)
      31  
      32  static void
      33  test_acc_declare ()
      34  {
      35    assert (acc_is_present (&global_var, sizeof global_var));
      36  
      37    global_var = c0;
      38  #pragma acc update device (global_var)
      39  
      40    global_var = c1;
      41    acc_copyout (&global_var, sizeof global_var);
      42    assert (acc_is_present (&global_var, sizeof global_var));
      43    assert (global_var == c1);
      44  
      45    global_var = c1;
      46    acc_copyout_finalize (&global_var, sizeof global_var);
      47    assert (acc_is_present (&global_var, sizeof global_var));
      48    assert (global_var == c1);
      49  
      50    void *global_var_d_p = acc_deviceptr (&global_var);
      51    assert (global_var_d_p);
      52  
      53    void *d_p = acc_copyin (&global_var, sizeof global_var);
      54    assert (d_p == global_var_d_p);
      55  
      56    acc_copyout (&global_var, sizeof global_var);
      57    assert (acc_is_present (&global_var, sizeof global_var));
      58  
      59    d_p = acc_copyin (&global_var, sizeof global_var);
      60    assert (d_p == global_var_d_p);
      61  
      62    d_p = acc_copyin (&global_var, sizeof global_var);
      63    assert (d_p == global_var_d_p);
      64  
      65    global_var = c1;
      66    acc_copyout_finalize (&global_var, sizeof global_var);
      67    assert (acc_is_present (&global_var, sizeof global_var));
      68    assert (global_var == c1);
      69  
      70    global_var = c1;
      71    acc_copyout (&global_var, sizeof global_var);
      72    assert (acc_is_present (&global_var, sizeof global_var));
      73    assert (global_var == c1);
      74  }
      75  
      76  
      77  static void
      78  test_acc_map_data ()
      79  {
      80    const int N = 801;
      81  
      82    char *h = (char *) malloc (N);
      83    assert (h);
      84    void *d = acc_malloc (N);
      85    assert (d);
      86    acc_map_data (h, d, N);
      87    assert (acc_is_present (h, N));
      88  
      89    assign_array (h, N, c0);
      90  #pragma acc update device (h[0:N])
      91  
      92    assign_array (h, N, c1);
      93  #pragma acc exit data copyout (h[0:N])
      94    assert (acc_is_present (h, N));
      95    verify_array (h, N, c1);
      96  
      97    assign_array (h, N, c1);
      98  #pragma acc exit data copyout (h[0:N]) finalize
      99    assert (acc_is_present (h, N));
     100    verify_array (h, N, c1);
     101  
     102  #pragma acc enter data copyin (h[0:N])
     103  
     104    assign_array (h, N, c1);
     105  #pragma acc exit data copyout (h[0:N])
     106    assert (acc_is_present (h, N));
     107    verify_array (h, N, c1);
     108  
     109  #pragma acc enter data copyin (h[0:N])
     110  
     111  #pragma acc enter data copyin (h[0:N])
     112  
     113    assign_array (h, N, c1);
     114  #pragma acc exit data copyout (h[0:N]) finalize
     115    assert (acc_is_present (h, N));
     116    verify_array (h, N, c1);
     117  
     118    assign_array (h, N, c1);
     119  #pragma acc exit data copyout (h[0:N])
     120    assert (acc_is_present (h, N));
     121    verify_array (h, N, c1);
     122  }
     123  
     124  
     125  static void
     126  test_acc_data ()
     127  {
     128  #define N 23
     129    char h[N];
     130  
     131    assign_array (h, N, c0);
     132  #pragma acc data copyin (h)
     133    {
     134      assert (acc_is_present (h, sizeof h));
     135  
     136      assign_array (h, N, c1);
     137      acc_copyout_finalize (h, sizeof h);
     138      assert (acc_is_present (h, sizeof h));
     139      verify_array (h, N, c1);
     140  
     141      assign_array (h, N, c1);
     142      acc_copyout (h, sizeof h);
     143      assert (acc_is_present (h, sizeof h));
     144      verify_array (h, N, c1);
     145  
     146      acc_copyin (h, sizeof h);
     147  
     148      assign_array (h, N, c1);
     149      acc_copyout (h, sizeof h);
     150      assert (acc_is_present (h, sizeof h));
     151      verify_array (h, N, c1);
     152  
     153      acc_copyin (h, sizeof h);
     154  
     155      acc_copyin (h, sizeof h);
     156  
     157      assign_array (h, N, c1);
     158      acc_copyout_finalize (h, sizeof h);
     159      assert (acc_is_present (h, sizeof h));
     160      verify_array (h, N, c1);
     161  
     162      assign_array (h, N, c1);
     163      acc_copyout (h, sizeof h);
     164      assert (acc_is_present (h, sizeof h));
     165      verify_array (h, N, c1);
     166    }
     167  #undef N
     168  }
     169  
     170  
     171  int
     172  main ()
     173  {
     174    test_acc_declare ();
     175    test_acc_map_data ();
     176    test_acc_data ();
     177  
     178    return 0;
     179  }