@@ -45,24 +45,7 @@ using namespace ompx;
4545
4646namespace {
4747
48- void numThreadsStrictError (int32_t nt_strict, int32_t nt_severity,
49- const char *nt_message, int32_t requested,
50- int32_t actual) {
51- if (nt_message)
52- printf (" %s\n " , nt_message);
53- else
54- printf (" The computed number of threads (%u) does not match the requested "
55- " number of threads (%d). Consider that it might not be supported "
56- " to select exactly %d threads on this target device.\n " ,
57- actual, requested, requested);
58- if (nt_severity == severity_fatal)
59- __builtin_trap ();
60- }
61-
62- uint32_t determineNumberOfThreads (int32_t NumThreadsClause,
63- int32_t nt_strict = false ,
64- int32_t nt_severity = severity_fatal,
65- const char *nt_message = nullptr ) {
48+ uint32_t determineNumberOfThreads (int32_t NumThreadsClause) {
6649 uint32_t NThreadsICV =
6750 NumThreadsClause != -1 ? NumThreadsClause : icv::NThreads;
6851 uint32_t NumThreads = mapping::getMaxTeamThreads ();
@@ -72,17 +55,13 @@ uint32_t determineNumberOfThreads(int32_t NumThreadsClause,
7255
7356 // SPMD mode allows any number of threads, for generic mode we round down to a
7457 // multiple of WARPSIZE since it is legal to do so in OpenMP.
75- if (!mapping::isSPMDMode ()) {
76- if (NumThreads < mapping::getWarpSize ())
77- NumThreads = 1 ;
78- else
79- NumThreads = (NumThreads & ~((uint32_t )mapping::getWarpSize () - 1 ));
80- }
58+ if (mapping::isSPMDMode ())
59+ return NumThreads;
8160
82- if (NumThreadsClause != - 1 && nt_strict &&
83- NumThreads != static_cast < uint32_t >(NumThreadsClause))
84- numThreadsStrictError (nt_strict, nt_severity, nt_message, NumThreadsClause,
85- NumThreads );
61+ if (NumThreads < mapping::getWarpSize ())
62+ NumThreads = 1 ;
63+ else
64+ NumThreads = (NumThreads & ~(( uint32_t ) mapping::getWarpSize () - 1 ) );
8665
8766 return NumThreads;
8867}
@@ -103,14 +82,12 @@ uint32_t determineNumberOfThreads(int32_t NumThreadsClause,
10382
10483extern " C" {
10584
106- [[clang::always_inline]] void
107- __kmpc_parallel_spmd (IdentTy *ident, int32_t num_threads, void *fn, void **args,
108- const int64_t nargs, int32_t nt_strict = false ,
109- int32_t nt_severity = severity_fatal,
110- const char *nt_message = nullptr ) {
85+ [[clang::always_inline]] void __kmpc_parallel_spmd (IdentTy *ident,
86+ int32_t num_threads,
87+ void *fn, void **args,
88+ const int64_t nargs) {
11189 uint32_t TId = mapping::getThreadIdInBlock ();
112- uint32_t NumThreads =
113- determineNumberOfThreads (num_threads, nt_strict, nt_severity, nt_message);
90+ uint32_t NumThreads = determineNumberOfThreads (num_threads);
11491 uint32_t PTeamSize =
11592 NumThreads == mapping::getMaxTeamThreads () ? 0 : NumThreads;
11693 // Avoid the race between the read of the `icv::Level` above and the write
@@ -163,11 +140,10 @@ __kmpc_parallel_spmd(IdentTy *ident, int32_t num_threads, void *fn, void **args,
163140 return ;
164141}
165142
166- [[clang::always_inline]] void __kmpc_parallel_51 (
167- IdentTy *ident, int32_t , int32_t if_expr, int32_t num_threads,
168- int proc_bind, void *fn, void *wrapper_fn, void **args, int64_t nargs,
169- int32_t nt_strict = false , int32_t nt_severity = severity_fatal,
170- const char *nt_message = nullptr ) {
143+ [[clang::always_inline]] void
144+ __kmpc_parallel_51 (IdentTy *ident, int32_t , int32_t if_expr,
145+ int32_t num_threads, int proc_bind, void *fn,
146+ void *wrapper_fn, void **args, int64_t nargs) {
171147 uint32_t TId = mapping::getThreadIdInBlock ();
172148
173149 // Assert the parallelism level is zero if disabled by the user.
@@ -180,11 +156,6 @@ __kmpc_parallel_spmd(IdentTy *ident, int32_t num_threads, void *fn, void **args,
180156 // 3) nested parallel regions
181157 if (OMP_UNLIKELY (!if_expr || state::HasThreadState ||
182158 (config::mayUseNestedParallelism () && icv::Level))) {
183- // OpenMP 6.0 12.1.2 requires the num_threads 'strict' modifier to also have
184- // effect when parallel execution is disabled by a corresponding if clause
185- // attached to the parallel directive.
186- if (nt_strict && num_threads > 1 )
187- numThreadsStrictError (nt_strict, nt_severity, nt_message, num_threads, 1 );
188159 state::DateEnvironmentRAII DERAII (ident);
189160 ++icv::Level;
190161 invokeMicrotask (TId, 0 , fn, args, nargs);
@@ -198,14 +169,12 @@ __kmpc_parallel_spmd(IdentTy *ident, int32_t num_threads, void *fn, void **args,
198169 // This was moved to its own routine so it could be called directly
199170 // in certain situations to avoid resource consumption of unused
200171 // logic in parallel_51.
201- __kmpc_parallel_spmd (ident, num_threads, fn, args, nargs, nt_strict,
202- nt_severity, nt_message);
172+ __kmpc_parallel_spmd (ident, num_threads, fn, args, nargs);
203173
204174 return ;
205175 }
206176
207- uint32_t NumThreads =
208- determineNumberOfThreads (num_threads, nt_strict, nt_severity, nt_message);
177+ uint32_t NumThreads = determineNumberOfThreads (num_threads);
209178 uint32_t MaxTeamThreads = mapping::getMaxTeamThreads ();
210179 uint32_t PTeamSize = NumThreads == MaxTeamThreads ? 0 : NumThreads;
211180
@@ -308,16 +277,6 @@ __kmpc_parallel_spmd(IdentTy *ident, int32_t num_threads, void *fn, void **args,
308277 __kmpc_end_sharing_variables ();
309278}
310279
311- [[clang::always_inline]] void __kmpc_parallel_60 (
312- IdentTy *ident, int32_t id, int32_t if_expr, int32_t num_threads,
313- int proc_bind, void *fn, void *wrapper_fn, void **args, int64_t nargs,
314- int32_t nt_strict = false , int32_t nt_severity = severity_fatal,
315- const char *nt_message = nullptr ) {
316- return __kmpc_parallel_51 (ident, id, if_expr, num_threads, proc_bind, fn,
317- wrapper_fn, args, nargs, nt_strict, nt_severity,
318- nt_message);
319- }
320-
321280[[clang::noinline]] bool __kmpc_kernel_parallel (ParallelRegionFnTy *WorkFn) {
322281 // Work function and arguments for L1 parallel region.
323282 *WorkFn = state::ParallelRegionFn;
0 commit comments