diff options
author | Jakub Jelinek <jakub@redhat.com> | 2021-11-15 13:20:53 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2021-11-15 13:20:53 +0100 |
commit | aea72386831c0c5672f55983034cc709b968daea (patch) | |
tree | ab7e82602a7dc1f8e6fefcc5ef16520eea238392 /gcc | |
parent | fcdf49a0ad3282761c7ac72103407ca4ec4d6968 (diff) | |
download | gcc-aea72386831c0c5672f55983034cc709b968daea.zip gcc-aea72386831c0c5672f55983034cc709b968daea.tar.gz gcc-aea72386831c0c5672f55983034cc709b968daea.tar.bz2 |
openmp: Add support for thread_limit clause on target
OpenMP 5.1 says that thread_limit clause can also appear on target,
and similarly to teams should affect the thread-limit-var ICV.
On combined target teams, the clause goes to both.
We actually passed thread_limit internally on target already before,
but only used it for gcn/ptx offloading to hint how many threads should be
created and for ptx didn't set thread_limit_var in that case.
Similarly for host fallback.
Also, I found that we weren't copying the args array that contains encoded
thread_limit and num_teams clause for target (etc.) for async target.
2021-11-15 Jakub Jelinek <jakub@redhat.com>
gcc/
* gimplify.c (optimize_target_teams): Only add OMP_CLAUSE_THREAD_LIMIT
to OMP_TARGET_CLAUSES if it isn't there already.
gcc/c-family/
* c-omp.c (c_omp_split_clauses) <case OMP_CLAUSE_THREAD_LIMIT>:
Duplicate to both OMP_TARGET and OMP_TEAMS.
gcc/c/
* c-parser.c (OMP_TARGET_CLAUSE_MASK): Add
PRAGMA_OMP_CLAUSE_THREAD_LIMIT.
gcc/cp/
* parser.c (OMP_TARGET_CLAUSE_MASK): Add
PRAGMA_OMP_CLAUSE_THREAD_LIMIT.
libgomp/
* task.c (gomp_create_target_task): Copy args array as well.
* target.c (gomp_target_fallback): Add args argument.
Set gomp_icv (true)->thread_limit_var if thread_limit is present.
(GOMP_target): Adjust gomp_target_fallback caller.
(GOMP_target_ext): Likewise.
(gomp_target_task_fn): Likewise.
* config/nvptx/team.c (gomp_nvptx_main): Set
gomp_global_icv.thread_limit_var.
* testsuite/libgomp.c-c++-common/thread-limit-1.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-family/c-omp.c | 25 | ||||
-rw-r--r-- | gcc/c/c-parser.c | 1 | ||||
-rw-r--r-- | gcc/cp/parser.c | 1 | ||||
-rw-r--r-- | gcc/gimplify.c | 11 |
4 files changed, 33 insertions, 5 deletions
diff --git a/gcc/c-family/c-omp.c b/gcc/c-family/c-omp.c index fad0606..3f84fd1 100644 --- a/gcc/c-family/c-omp.c +++ b/gcc/c-family/c-omp.c @@ -1867,7 +1867,6 @@ c_omp_split_clauses (location_t loc, enum tree_code code, s = C_OMP_CLAUSE_SPLIT_TARGET; break; case OMP_CLAUSE_NUM_TEAMS: - case OMP_CLAUSE_THREAD_LIMIT: s = C_OMP_CLAUSE_SPLIT_TEAMS; break; case OMP_CLAUSE_DIST_SCHEDULE: @@ -2531,6 +2530,30 @@ c_omp_split_clauses (location_t loc, enum tree_code code, else s = C_OMP_CLAUSE_SPLIT_FOR; break; + /* thread_limit is allowed on target and teams. Distribute it + to all. */ + case OMP_CLAUSE_THREAD_LIMIT: + if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)) + != 0) + { + if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_TEAMS)) + != 0) + { + c = build_omp_clause (OMP_CLAUSE_LOCATION (clauses), + OMP_CLAUSE_THREAD_LIMIT); + OMP_CLAUSE_THREAD_LIMIT_EXPR (c) + = OMP_CLAUSE_THREAD_LIMIT_EXPR (clauses); + OMP_CLAUSE_CHAIN (c) = cclauses[C_OMP_CLAUSE_SPLIT_TARGET]; + cclauses[C_OMP_CLAUSE_SPLIT_TARGET] = c; + } + else + { + s = C_OMP_CLAUSE_SPLIT_TARGET; + break; + } + } + s = C_OMP_CLAUSE_SPLIT_TEAMS; + break; /* Allocate clause is allowed on target, teams, distribute, parallel, for, sections and taskloop. Distribute it to all. */ case OMP_CLAUSE_ALLOCATE: diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 3c9f587..83e837c 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -20963,6 +20963,7 @@ c_parser_omp_target_exit_data (location_t loc, c_parser *parser, | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ALLOCATE) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULTMAP) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IN_REDUCTION) \ + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_THREAD_LIMIT) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IS_DEVICE_PTR)) static bool diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index adfd3c1..e86e2b5 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -44015,6 +44015,7 @@ cp_parser_omp_target_update (cp_parser *parser, cp_token *pragma_tok, | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULTMAP) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ALLOCATE) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IN_REDUCTION) \ + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_THREAD_LIMIT) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IS_DEVICE_PTR)) static bool diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 4e022d8..1602a62 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -13637,10 +13637,13 @@ optimize_target_teams (tree target, gimple_seq *pre_p) if (!DECL_P (expr) && TREE_CODE (expr) != TARGET_EXPR) OMP_CLAUSE_OPERAND (c, 0) = *p; } - c = build_omp_clause (thread_limit_loc, OMP_CLAUSE_THREAD_LIMIT); - OMP_CLAUSE_THREAD_LIMIT_EXPR (c) = thread_limit; - OMP_CLAUSE_CHAIN (c) = OMP_TARGET_CLAUSES (target); - OMP_TARGET_CLAUSES (target) = c; + if (!omp_find_clause (OMP_TARGET_CLAUSES (target), OMP_CLAUSE_THREAD_LIMIT)) + { + c = build_omp_clause (thread_limit_loc, OMP_CLAUSE_THREAD_LIMIT); + OMP_CLAUSE_THREAD_LIMIT_EXPR (c) = thread_limit; + OMP_CLAUSE_CHAIN (c) = OMP_TARGET_CLAUSES (target); + OMP_TARGET_CLAUSES (target) = c; + } c = build_omp_clause (num_teams_loc, OMP_CLAUSE_NUM_TEAMS); OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR (c) = num_teams_upper; OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (c) = num_teams_lower; |