(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
masked-1.c
       1  #include <omp.h>
       2  #include <stdlib.h>
       3  
       4  void
       5  foo (int x, int *a)
       6  {
       7    #pragma omp masked
       8    {
       9      if (omp_get_thread_num () != 0)
      10        abort ();
      11      a[128]++;
      12    }
      13    #pragma omp masked filter (0)
      14    {
      15      if (omp_get_thread_num () != 0)
      16        abort ();
      17      a[129]++;
      18    }
      19    #pragma omp masked filter (7)
      20    {
      21      if (omp_get_thread_num () != 7)
      22        abort ();
      23      a[130]++;
      24    }
      25    #pragma omp masked filter (x)
      26    {
      27      if (omp_get_thread_num () != x)
      28        abort ();
      29      a[131]++;
      30    }
      31    #pragma omp masked taskloop simd filter (x) grainsize (12) simdlen (4)
      32    for (int i = 0; i < 128; i++)
      33      a[i] += i;
      34  }
      35  
      36  int
      37  main ()
      38  {
      39    int a[136] = {};
      40    #pragma omp parallel num_threads (4)
      41    foo (4, a);
      42    for (int i = 0; i < 128; i++)
      43      if (a[i])
      44        abort ();
      45    if (a[128] != 1 || a[129] != 1 || a[130] || a[131])
      46      abort ();
      47    #pragma omp parallel num_threads (4)
      48    foo (3, a);
      49    for (int i = 0; i < 128; i++)
      50      if (a[i] != i)
      51        abort ();
      52    if (a[128] != 2 || a[129] != 2 || a[130] || a[131] != 1)
      53      abort ();
      54    #pragma omp parallel num_threads (8)
      55    foo (8, a);
      56    for (int i = 0; i < 128; i++)
      57      if (a[i] != i)
      58        abort ();
      59    if (a[128] != 3 || a[129] != 3 || a[130] != 1 || a[131] != 1)
      60      abort ();
      61    #pragma omp parallel num_threads (8)
      62    foo (6, a);
      63    for (int i = 0; i < 128; i++)
      64      if (a[i] != 2 * i)
      65        abort ();
      66    if (a[128] != 4 || a[129] != 4 || a[130] != 2 || a[131] != 2)
      67      abort ();
      68    for (int i = 0; i < 8; i++)
      69      a[i] = 0;
      70    /* The filter expression can evaluate to different values in different threads.  */
      71    #pragma omp parallel masked num_threads (8) filter (omp_get_thread_num () + 1)
      72    a[omp_get_thread_num ()]++;
      73    for (int i = 0; i < 8; i++)
      74      if (a[i])
      75        abort ();
      76    /* And multiple threads can be filtered.  */
      77    #pragma omp parallel masked num_threads (8) filter (omp_get_thread_num () & ~1)
      78    a[omp_get_thread_num ()]++;
      79    for (int i = 0; i < 8; i++)
      80      if (a[i] != !(i & 1))
      81        abort ();
      82    return 0;
      83  }