(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
target-memcpy-rect-async-2.c
       1  /* Test for omp_target_memcpy_rect_async considering dependence objects.  */
       2  
       3  #include <omp.h>
       4  #include <stdlib.h>
       5  
       6  #define NUM_DIMS 3
       7  
       8  int
       9  main ()
      10  {
      11    int d = omp_get_default_device ();
      12    int id = omp_get_initial_device ();
      13    int a[128], b[64], c[128], e[16], q[128], i;
      14    void *p;
      15  
      16    if (d < 0 || d >= omp_get_num_devices ())
      17      d = id;
      18  
      19    p = omp_target_alloc (130 * sizeof (int), d);
      20    if (p == NULL)
      21      return 0;
      22  
      23    for (i = 0; i < 128; i++)
      24      q[i] = 0;
      25    if (omp_target_memcpy (p, q, 128 * sizeof (int), 0, 0, d, id) != 0)
      26      abort ();
      27  
      28    size_t volume[NUM_DIMS] = { 2, 2, 3 };
      29    size_t dst_offsets[NUM_DIMS] = { 0, 0, 0 };
      30    size_t src_offsets[NUM_DIMS] = { 0, 0, 0 };
      31    size_t dst_dimensions[NUM_DIMS] = { 3, 4, 5 };
      32    size_t src_dimensions[NUM_DIMS] = { 2, 3, 4 };
      33  
      34    for (i = 0; i < 128; i++)
      35      a[i] = 42;
      36    for (i = 0; i < 64; i++)
      37      b[i] = 24;
      38    for (i = 0; i < 128; i++)
      39      c[i] = 0;
      40    for (i = 0; i < 16; i++)
      41      e[i] = 77;
      42  
      43    omp_depend_t obj[2];
      44  
      45    #pragma omp parallel num_threads(5)
      46    #pragma omp single
      47    {
      48      #pragma omp task depend (out: p)
      49      omp_target_memcpy (p, a, 128 * sizeof (int), 0, 0, d, id);
      50  
      51      #pragma omp task depend(inout: p)
      52      omp_target_memcpy (p, b, 64 * sizeof (int), 0, 0, d, id);
      53  
      54      #pragma omp task depend(out: c)
      55      for (i = 0; i < 128; i++)
      56        c[i] = i + 1;
      57  
      58      #pragma omp depobj(obj[0]) depend(inout: p)
      59      #pragma omp depobj(obj[1]) depend(in: c)
      60  
      61      /*  This produces: 1 2 3 - - 5 6 7 - - at positions 0..9 and
      62  		       13 14 15 - - 17 18 19 - - at positions 20..29.  */
      63      omp_target_memcpy_rect_async (p, c, sizeof (int), NUM_DIMS, volume,
      64  				  dst_offsets, src_offsets, dst_dimensions,
      65  				  src_dimensions, d, id, 2, obj);
      66  
      67      #pragma omp task depend(in: p)
      68      omp_target_memcpy (p, e, 16 * sizeof (int), 0, 0, d, id);
      69    }
      70  
      71    #pragma omp taskwait
      72  
      73    if (omp_target_memcpy (q, p, 128 * sizeof(int), 0, 0, id, d) != 0)
      74      abort ();
      75  
      76    for (i = 0; i < 16; ++i)
      77      if (q[i] != 77)
      78        abort ();
      79    if (q[20] != 13 || q[21] != 14 || q[22] != 15 || q[25] != 17 || q[26] != 18
      80        || q[27] != 19)
      81      abort ();
      82    for (i = 28; i < 64; ++i)
      83      if (q[i] != 24)
      84        abort ();
      85    for (i = 64; i < 128; ++i)
      86      if (q[i] != 42)
      87        abort ();
      88  
      89    omp_target_free (p, d);
      90    return 0;
      91  }