File: target-teams-1.c

package info (click to toggle)
gcc-arm-none-eabi 15%3A12.2.rel1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 959,712 kB
  • sloc: cpp: 3,275,382; ansic: 2,061,766; ada: 840,956; f90: 208,513; makefile: 76,132; asm: 73,433; xml: 50,448; exp: 34,146; sh: 32,436; objc: 15,637; fortran: 14,012; python: 11,991; pascal: 6,787; awk: 4,779; perl: 3,054; yacc: 338; ml: 285; lex: 201; haskell: 122
file content (85 lines) | stat: -rw-r--r-- 2,740 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/* { dg-do compile } */
/* { dg-additional-options "-fdump-tree-gimple" } */

int v = 6;
void bar (int);
void bar2 (int, long *, long *);
int baz (void);
#pragma omp declare target to (bar, baz, v)

void
foo (int a, int b, long c, long d)
{
  /* The OpenMP 4.5 spec says that these expressions are evaluated before
     target region on combined target teams, so those cases are always
     fine.  */
  #pragma omp target
  bar (0);
  #pragma omp target
  #pragma omp teams
  bar (1);
  #pragma omp target teams
  bar (2);
  #pragma omp target
  #pragma omp teams num_teams (4)
  bar (3);
  #pragma omp target teams num_teams (4)
  bar (4);
  #pragma omp target
  #pragma omp teams thread_limit (7)
  bar (5);
  #pragma omp target teams thread_limit (7)
  bar (6);
  #pragma omp target
  #pragma omp teams num_teams (4) thread_limit (8)
  {
    {
      bar (7);
    }
  }
  #pragma omp target teams num_teams (4) thread_limit (8)
  bar (8);
  #pragma omp target
  #pragma omp teams num_teams (a) thread_limit (b)
  bar (9);
  #pragma omp target teams num_teams (a) thread_limit (b)
  bar (10);
  #pragma omp target
  #pragma omp teams num_teams (c + 1) thread_limit (d - 1)
  bar (11);
  #pragma omp target teams num_teams (c + 1) thread_limit (d - 1)
  bar (12);
  #pragma omp target map (always, to: c, d)
  #pragma omp teams num_teams (c + 1) thread_limit (d - 1)
  bar (13);
  #pragma omp target data map (to: c, d)
  {
    #pragma omp target defaultmap (tofrom: scalar)
    bar2 (14, &c, &d);
    /* This is one of the cases which can't be generally optimized,
       the c and d are (or could be) already mapped and whether
       their device and original values match is unclear.  */
    #pragma omp target map (to: c, d)
    #pragma omp teams num_teams (c + 1) thread_limit (d - 1)
    bar (15);
  }
  /* This can't be optimized, there are function calls inside of
     target involved.  */
  #pragma omp target
  #pragma omp teams num_teams (baz () + 1) thread_limit (baz () - 1)
  bar (16);
  #pragma omp target teams num_teams (baz () + 1) thread_limit (baz () - 1)
  bar (17);
  /* This one can't be optimized, as v might have different value between
     host and target.  */
  #pragma omp target
  #pragma omp teams num_teams (v + 1) thread_limit (v - 1)
  bar (18);
}

/* { dg-final { scan-tree-dump-times "num_teams\\(-1\\)" 3 "gimple" } } */
/* { dg-final { scan-tree-dump-times "thread_limit\\(-1\\)" 3 "gimple" } } */
/* { dg-final { scan-tree-dump-times "num_teams\\(0\\)" 4 "gimple" } } */
/* { dg-final { scan-tree-dump-times "thread_limit\\(0\\)" 6 "gimple" } } */
/* { dg-final { scan-tree-dump-times "num_teams\\(1\\)" 2 "gimple" } } */
/* { dg-final { scan-tree-dump-times "thread_limit\\(1\\)" 0 "gimple" } } */