(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c/
target-35.c
       1  #include <omp.h>
       2  #include <stdlib.h>
       3  
       4  #pragma omp declare target
       5  __attribute__((noinline))
       6  void
       7  foo (int x, int y, int z, int *a, int *b)
       8  {
       9    if (x == 0)
      10      {
      11        int i, j;
      12        for (i = 0; i < 64; i++)
      13  	#pragma omp parallel for shared (a, b)
      14  	for (j = 0; j < 32; j++)
      15  	  foo (3, i, j, a, b);
      16      }
      17    else if (x == 1)
      18      {
      19        int i, j;
      20        #pragma omp distribute dist_schedule (static, 1)
      21        for (i = 0; i < 64; i++)
      22  	#pragma omp parallel for shared (a, b)
      23  	for (j = 0; j < 32; j++)
      24  	  foo (3, i, j, a, b);
      25      }
      26    else if (x == 2)
      27      {
      28        int j;
      29        #pragma omp parallel for shared (a, b)
      30        for (j = 0; j < 32; j++)
      31  	foo (3, y, j, a, b);
      32      }
      33    else
      34      {
      35        #pragma omp atomic
      36        b[y] += z;
      37        #pragma omp atomic
      38        *a += 1;
      39      }
      40  }
      41  
      42  __attribute__((noinline))
      43  int
      44  bar (int x, int y, int z)
      45  {
      46    int a, b[64], i;
      47    a = 8;
      48    for (i = 0; i < 64; i++)
      49      b[i] = i;
      50    foo (x, y, z, &a, b);
      51    if (x == 0)
      52      {
      53        if (a != 8 + 64 * 32)
      54  	return 1;
      55        for (i = 0; i < 64; i++)
      56  	if (b[i] != i + 31 * 32 / 2)
      57  	  return 1;
      58      }
      59    else if (x == 1)
      60      {
      61        int c = omp_get_num_teams ();
      62        int d = omp_get_team_num ();
      63        int e = d;
      64        int f = 0;
      65        for (i = 0; i < 64; i++)
      66  	if (i == e)
      67  	  {
      68  	    if (b[i] != i + 31 * 32 / 2)
      69  	      return 1;
      70  	    f++;
      71  	    e = e + c;
      72  	  }
      73  	else if (b[i] != i)
      74  	  return 1;
      75        if (a < 8 || a > 8 + f * 32)
      76  	return 1;
      77      }
      78    else if (x == 2)
      79      {
      80        if (a != 8 + 32)
      81  	return 1;
      82        for (i = 0; i < 64; i++)
      83  	if (b[i] != i + (i == y ? 31 * 32 / 2 : 0))
      84  	  return 1;
      85      }
      86    else if (x == 3)
      87      {
      88        if (a != 8 + 1)
      89  	return 1;
      90        for (i = 0; i < 64; i++)
      91  	if (b[i] != i + (i == y ? z : 0))
      92  	  return 1;
      93      }
      94    return 0;
      95  }
      96  #pragma omp end declare target
      97  
      98  int
      99  main ()
     100  {
     101    int i, j, err = 0;
     102    #pragma omp target map(tofrom:err)
     103    #pragma omp teams reduction(+:err)
     104    err += bar (0, 0, 0);
     105    if (err)
     106      abort ();
     107    #pragma omp target map(tofrom:err)
     108    #pragma omp teams reduction(+:err)
     109    err += bar (1, 0, 0);
     110    if (err)
     111      abort ();
     112    #pragma omp target map(tofrom:err)
     113    #pragma omp teams reduction(+:err)
     114    #pragma omp distribute
     115    for (i = 0; i < 64; i++)
     116      err += bar (2, i, 0);
     117    if (err)
     118      abort ();
     119    #pragma omp target map(tofrom:err)
     120    #pragma omp teams reduction(+:err)
     121    #pragma omp distribute
     122    for (i = 0; i < 64; i++)
     123    #pragma omp parallel for reduction(+:err)
     124      for (j = 0; j < 32; j++)
     125        err += bar (3, i, j);
     126    if (err)
     127      abort ();
     128    return 0;
     129  }