Bug Summary

File:projects/openmp/runtime/src/kmp_sched.cpp
Warning:line 284, column 25
Division by zero

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name kmp_sched.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-eagerly-assume -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -mrelocation-model pic -pic-level 2 -mthread-model posix -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -momit-leaf-frame-pointer -ffunction-sections -fdata-sections -resource-dir /usr/lib/llvm-7/lib/clang/7.0.0 -D _DEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -D omp_EXPORTS -I /build/llvm-toolchain-snapshot-7~svn338205/build-llvm/projects/openmp/runtime/src -I /build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src -I /build/llvm-toolchain-snapshot-7~svn338205/build-llvm/include -I /build/llvm-toolchain-snapshot-7~svn338205/include -I /build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/i18n -I /build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/include/50 -I /build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/thirdparty/ittnotify -U NDEBUG -D _GNU_SOURCE -D _REENTRANT -D _FORTIFY_SOURCE=2 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/8/../../../../include/x86_64-linux-gnu/c++/8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/8/../../../../include/x86_64-linux-gnu/c++/8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/backward -internal-isystem /usr/include/clang/7.0.0/include/ -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-7/lib/clang/7.0.0/include -internal-externc-isystem /usr/lib/gcc/x86_64-linux-gnu/8/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-comment -Wno-sign-compare -Wno-unused-function -Wno-unused-value -Wno-unused-variable -Wno-switch -Wno-unknown-pragmas -Wno-missing-field-initializers -Wno-missing-braces -Wno-comment -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /build/llvm-toolchain-snapshot-7~svn338205/build-llvm/projects/openmp/runtime/src -ferror-limit 19 -fmessage-length 0 -fvisibility-inlines-hidden -fno-rtti -fobjc-runtime=gcc -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -o /tmp/scan-build-2018-07-29-043837-17923-1 -x c++ /build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp -faddrsig
1/*
2 * kmp_sched.cpp -- static scheduling -- iteration initialization
3 */
4
5//===----------------------------------------------------------------------===//
6//
7// The LLVM Compiler Infrastructure
8//
9// This file is dual licensed under the MIT and the University of Illinois Open
10// Source Licenses. See LICENSE.txt for details.
11//
12//===----------------------------------------------------------------------===//
13
14/* Static scheduling initialization.
15
16 NOTE: team->t.t_nproc is a constant inside of any dispatch loop, however
17 it may change values between parallel regions. __kmp_max_nth
18 is the largest value __kmp_nth may take, 1 is the smallest. */
19
20#include "kmp.h"
21#include "kmp_error.h"
22#include "kmp_i18n.h"
23#include "kmp_itt.h"
24#include "kmp_stats.h"
25#include "kmp_str.h"
26
27#if OMPT_SUPPORT1
28#include "ompt-specific.h"
29#endif
30
31#ifdef KMP_DEBUG1
32//-------------------------------------------------------------------------
33// template for debug prints specification ( d, u, lld, llu )
34char const *traits_t<int>::spec = "d";
35char const *traits_t<unsigned int>::spec = "u";
36char const *traits_t<long long>::spec = "lld";
37char const *traits_t<unsigned long long>::spec = "llu";
38char const *traits_t<long>::spec = "ld";
39//-------------------------------------------------------------------------
40#endif
41
42template <typename T>
43static void __kmp_for_static_init(ident_t *loc, kmp_int32 global_tid,
44 kmp_int32 schedtype, kmp_int32 *plastiter,
45 T *plower, T *pupper,
46 typename traits_t<T>::signed_t *pstride,
47 typename traits_t<T>::signed_t incr,
48 typename traits_t<T>::signed_t chunk
49#if OMPT_SUPPORT1 && OMPT_OPTIONAL1
50 ,
51 void *codeptr
52#endif
53 ) {
54 KMP_COUNT_BLOCK(OMP_FOR_static)((void)0);
55 KMP_TIME_PARTITIONED_BLOCK(FOR_static_scheduling)((void)0);
56
57 typedef typename traits_t<T>::unsigned_t UT;
58 typedef typename traits_t<T>::signed_t ST;
59 /* this all has to be changed back to TID and such.. */
60 kmp_int32 gtid = global_tid;
61 kmp_uint32 tid;
62 kmp_uint32 nth;
63 UT trip_count;
64 kmp_team_t *team;
65 kmp_info_t *th = __kmp_threads[gtid];
66
67#if OMPT_SUPPORT1 && OMPT_OPTIONAL1
68 ompt_team_info_t *team_info = NULL__null;
69 ompt_task_info_t *task_info = NULL__null;
70 ompt_work_type_t ompt_work_type = ompt_work_loop;
71
72 static kmp_int8 warn = 0;
73
74 if (ompt_enabled.ompt_callback_work) {
1
Assuming the condition is false
2
Taking false branch
75 // Only fully initialize variables needed by OMPT if OMPT is enabled.
76 team_info = __ompt_get_teaminfo(0, NULL__null);
77 task_info = __ompt_get_task_info_object(0);
78 // Determine workshare type
79 if (loc != NULL__null) {
80 if ((loc->flags & KMP_IDENT_WORK_LOOP0x200) != 0) {
81 ompt_work_type = ompt_work_loop;
82 } else if ((loc->flags & KMP_IDENT_WORK_SECTIONS0x400) != 0) {
83 ompt_work_type = ompt_work_sections;
84 } else if ((loc->flags & KMP_IDENT_WORK_DISTRIBUTE0x800) != 0) {
85 ompt_work_type = ompt_work_distribute;
86 } else {
87 kmp_int8 bool_res =
88 KMP_COMPARE_AND_STORE_ACQ8(&warn, (kmp_int8)0, (kmp_int8)1)__sync_bool_compare_and_swap((volatile kmp_uint8 *)(&warn
), (kmp_uint8)((kmp_int8)0), (kmp_uint8)((kmp_int8)1))
;
89 if (bool_res)
90 KMP_WARNING(OmptOutdatedWorkshare)__kmp_msg(kmp_ms_warning, __kmp_msg_format(kmp_i18n_msg_OmptOutdatedWorkshare
), __kmp_msg_null)
;
91 }
92 KMP_DEBUG_ASSERT(ompt_work_type)((ompt_work_type) ? 0 : __kmp_debug_assert("ompt_work_type", "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 92))
;
93 }
94 }
95#endif
96
97 KMP_DEBUG_ASSERT(plastiter && plower && pupper && pstride)((plastiter && plower && pupper && pstride
) ? 0 : __kmp_debug_assert("plastiter && plower && pupper && pstride"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 97))
;
98 KE_TRACE(10, ("__kmpc_for_static_init called (%d)\n", global_tid))if (kmp_e_debug >= 10) { __kmp_debug_printf ("__kmpc_for_static_init called (%d)\n"
, global_tid); }
;
99#ifdef KMP_DEBUG1
100 {
101 char *buff;
102 // create format specifiers before the debug output
103 buff = __kmp_str_format(
104 "__kmpc_for_static_init: T#%%d sched=%%d liter=%%d iter=(%%%s,"
105 " %%%s, %%%s) incr=%%%s chunk=%%%s signed?<%s>\n",
106 traits_t<T>::spec, traits_t<T>::spec, traits_t<ST>::spec,
107 traits_t<ST>::spec, traits_t<ST>::spec, traits_t<T>::spec);
108 KD_TRACE(100, (buff, global_tid, schedtype, *plastiter, *plower, *pupper,if (kmp_d_debug >= 100) { __kmp_debug_printf (buff, global_tid
, schedtype, *plastiter, *plower, *pupper, *pstride, incr, chunk
); }
109 *pstride, incr, chunk))if (kmp_d_debug >= 100) { __kmp_debug_printf (buff, global_tid
, schedtype, *plastiter, *plower, *pupper, *pstride, incr, chunk
); }
;
110 __kmp_str_free(&buff);
111 }
112#endif
113
114 if (__kmp_env_consistency_check) {
3
Assuming '__kmp_env_consistency_check' is 0
4
Taking false branch
115 __kmp_push_workshare(global_tid, ct_pdo, loc);
116 if (incr == 0) {
117 __kmp_error_construct(kmp_i18n_msg_CnsLoopIncrZeroProhibited, ct_pdo,
118 loc);
119 }
120 }
121 /* special handling for zero-trip loops */
122 if (incr > 0 ? (*pupper < *plower) : (*plower < *pupper)) {
5
Assuming 'incr' is <= 0
6
'?' condition is false
7
Assuming the condition is false
8
Taking false branch
123 if (plastiter != NULL__null)
124 *plastiter = FALSE0;
125 /* leave pupper and plower set to entire iteration space */
126 *pstride = incr; /* value should never be used */
127// *plower = *pupper - incr;
128// let compiler bypass the illegal loop (like for(i=1;i<10;i--))
129// THE LINE COMMENTED ABOVE CAUSED shape2F/h_tests_1.f TO HAVE A FAILURE
130// ON A ZERO-TRIP LOOP (lower=1, upper=0,stride=1) - JPH June 23, 2009.
131#ifdef KMP_DEBUG1
132 {
133 char *buff;
134 // create format specifiers before the debug output
135 buff = __kmp_str_format("__kmpc_for_static_init:(ZERO TRIP) liter=%%d "
136 "lower=%%%s upper=%%%s stride = %%%s "
137 "signed?<%s>, loc = %%s\n",
138 traits_t<T>::spec, traits_t<T>::spec,
139 traits_t<ST>::spec, traits_t<T>::spec);
140 KD_TRACE(100,if (kmp_d_debug >= 100) { __kmp_debug_printf (buff, *plastiter
, *plower, *pupper, *pstride, loc->psource); }
141 (buff, *plastiter, *plower, *pupper, *pstride, loc->psource))if (kmp_d_debug >= 100) { __kmp_debug_printf (buff, *plastiter
, *plower, *pupper, *pstride, loc->psource); }
;
142 __kmp_str_free(&buff);
143 }
144#endif
145 KE_TRACE(10, ("__kmpc_for_static_init: T#%d return\n", global_tid))if (kmp_e_debug >= 10) { __kmp_debug_printf ("__kmpc_for_static_init: T#%d return\n"
, global_tid); }
;
146
147#if OMPT_SUPPORT1 && OMPT_OPTIONAL1
148 if (ompt_enabled.ompt_callback_work) {
149 ompt_callbacks.ompt_callback(ompt_callback_work)ompt_callback_work_callback(
150 ompt_work_type, ompt_scope_begin, &(team_info->parallel_data),
151 &(task_info->task_data), 0, codeptr);
152 }
153#endif
154 KMP_COUNT_VALUE(FOR_static_iterations, 0)((void)0);
155 return;
156 }
157
158#if OMP_40_ENABLED(50 >= 40)
159 // Although there are schedule enumerations above kmp_ord_upper which are not
160 // schedules for "distribute", the only ones which are useful are dynamic, so
161 // cannot be seen here, since this codepath is only executed for static
162 // schedules.
163 if (schedtype > kmp_ord_upper) {
9
Assuming 'schedtype' is <= kmp_ord_upper
10
Taking false branch
164 // we are in DISTRIBUTE construct
165 schedtype += kmp_sch_static -
166 kmp_distribute_static; // AC: convert to usual schedule type
167 tid = th->th.th_team->t.t_master_tid;
168 team = th->th.th_team->t.t_parent;
169 } else
170#endif
171 {
172 tid = __kmp_tid_from_gtid(global_tid)((((global_tid) >= 0) ? 0 : __kmp_debug_assert("(global_tid) >= 0"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 172)), __kmp_threads[(global_tid)]->th.th_info.ds.ds_tid
)
;
173 team = th->th.th_team;
174 }
175
176 /* determine if "for" loop is an active worksharing construct */
177 if (team->t.t_serialized) {
11
Assuming the condition is false
12
Taking false branch
178 /* serialized parallel, each thread executes whole iteration space */
179 if (plastiter != NULL__null)
180 *plastiter = TRUE(!0);
181 /* leave pupper and plower set to entire iteration space */
182 *pstride =
183 (incr > 0) ? (*pupper - *plower + 1) : (-(*plower - *pupper + 1));
184
185#ifdef KMP_DEBUG1
186 {
187 char *buff;
188 // create format specifiers before the debug output
189 buff = __kmp_str_format("__kmpc_for_static_init: (serial) liter=%%d "
190 "lower=%%%s upper=%%%s stride = %%%s\n",
191 traits_t<T>::spec, traits_t<T>::spec,
192 traits_t<ST>::spec);
193 KD_TRACE(100, (buff, *plastiter, *plower, *pupper, *pstride))if (kmp_d_debug >= 100) { __kmp_debug_printf (buff, *plastiter
, *plower, *pupper, *pstride); }
;
194 __kmp_str_free(&buff);
195 }
196#endif
197 KE_TRACE(10, ("__kmpc_for_static_init: T#%d return\n", global_tid))if (kmp_e_debug >= 10) { __kmp_debug_printf ("__kmpc_for_static_init: T#%d return\n"
, global_tid); }
;
198
199#if OMPT_SUPPORT1 && OMPT_OPTIONAL1
200 if (ompt_enabled.ompt_callback_work) {
201 ompt_callbacks.ompt_callback(ompt_callback_work)ompt_callback_work_callback(
202 ompt_work_type, ompt_scope_begin, &(team_info->parallel_data),
203 &(task_info->task_data), *pstride, codeptr);
204 }
205#endif
206 return;
207 }
208 nth = team->t.t_nproc;
13
Value assigned to 'nth'
209 if (nth == 1) {
14
Assuming 'nth' is not equal to 1
15
Taking false branch
210 if (plastiter != NULL__null)
211 *plastiter = TRUE(!0);
212 *pstride =
213 (incr > 0) ? (*pupper - *plower + 1) : (-(*plower - *pupper + 1));
214#ifdef KMP_DEBUG1
215 {
216 char *buff;
217 // create format specifiers before the debug output
218 buff = __kmp_str_format("__kmpc_for_static_init: (serial) liter=%%d "
219 "lower=%%%s upper=%%%s stride = %%%s\n",
220 traits_t<T>::spec, traits_t<T>::spec,
221 traits_t<ST>::spec);
222 KD_TRACE(100, (buff, *plastiter, *plower, *pupper, *pstride))if (kmp_d_debug >= 100) { __kmp_debug_printf (buff, *plastiter
, *plower, *pupper, *pstride); }
;
223 __kmp_str_free(&buff);
224 }
225#endif
226 KE_TRACE(10, ("__kmpc_for_static_init: T#%d return\n", global_tid))if (kmp_e_debug >= 10) { __kmp_debug_printf ("__kmpc_for_static_init: T#%d return\n"
, global_tid); }
;
227
228#if OMPT_SUPPORT1 && OMPT_OPTIONAL1
229 if (ompt_enabled.ompt_callback_work) {
230 ompt_callbacks.ompt_callback(ompt_callback_work)ompt_callback_work_callback(
231 ompt_work_type, ompt_scope_begin, &(team_info->parallel_data),
232 &(task_info->task_data), *pstride, codeptr);
233 }
234#endif
235 return;
236 }
237
238 /* compute trip count */
239 if (incr == 1) {
16
Taking false branch
240 trip_count = *pupper - *plower + 1;
241 } else if (incr == -1) {
17
Assuming the condition is false
18
Taking false branch
242 trip_count = *plower - *pupper + 1;
243 } else if (incr > 0) {
19
Taking false branch
244 // upper-lower can exceed the limit of signed type
245 trip_count = (UT)(*pupper - *plower) / incr + 1;
246 } else {
247 trip_count = (UT)(*plower - *pupper) / (-incr) + 1;
248 }
249
250 if (__kmp_env_consistency_check) {
20
Assuming '__kmp_env_consistency_check' is not equal to 0
21
Taking true branch
251 /* tripcount overflow? */
252 if (trip_count == 0 && *pupper != *plower) {
22
Assuming 'trip_count' is equal to 0
23
Assuming the condition is false
24
Taking false branch
253 __kmp_error_construct(kmp_i18n_msg_CnsIterationRangeTooLarge, ct_pdo,
254 loc);
255 }
256 }
257 KMP_COUNT_VALUE(FOR_static_iterations, trip_count)((void)0);
258
259 /* compute remaining parameters */
260 switch (schedtype) {
25
Control jumps to 'case kmp_sch_static:' at line 261
261 case kmp_sch_static: {
262 if (trip_count < nth) {
26
Assuming 'trip_count' is >= 'nth'
27
Taking false branch
263 KMP_DEBUG_ASSERT(((__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced
) ? 0 : __kmp_debug_assert("__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 266))
264 __kmp_static == kmp_sch_static_greedy ||((__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced
) ? 0 : __kmp_debug_assert("__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 266))
265 __kmp_static ==((__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced
) ? 0 : __kmp_debug_assert("__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 266))
266 kmp_sch_static_balanced)((__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced
) ? 0 : __kmp_debug_assert("__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 266))
; // Unknown static scheduling type.
267 if (tid < trip_count) {
268 *pupper = *plower = *plower + tid * incr;
269 } else {
270 *plower = *pupper + incr;
271 }
272 if (plastiter != NULL__null)
273 *plastiter = (tid == trip_count - 1);
274 } else {
275 if (__kmp_static == kmp_sch_static_balanced) {
28
Assuming '__kmp_static' is not equal to kmp_sch_static_balanced
29
Taking false branch
276 UT small_chunk = trip_count / nth;
277 UT extras = trip_count % nth;
278 *plower += incr * (tid * small_chunk + (tid < extras ? tid : extras));
279 *pupper = *plower + small_chunk * incr - (tid < extras ? 0 : incr);
280 if (plastiter != NULL__null)
281 *plastiter = (tid == nth - 1);
282 } else {
283 T big_chunk_inc_count =
284 (trip_count / nth + ((trip_count % nth) ? 1 : 0)) * incr;
30
Division by zero
285 T old_upper = *pupper;
286
287 KMP_DEBUG_ASSERT(__kmp_static == kmp_sch_static_greedy)((__kmp_static == kmp_sch_static_greedy) ? 0 : __kmp_debug_assert
("__kmp_static == kmp_sch_static_greedy", "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 287))
;
288 // Unknown static scheduling type.
289
290 *plower += tid * big_chunk_inc_count;
291 *pupper = *plower + big_chunk_inc_count - incr;
292 if (incr > 0) {
293 if (*pupper < *plower)
294 *pupper = traits_t<T>::max_value;
295 if (plastiter != NULL__null)
296 *plastiter = *plower <= old_upper && *pupper > old_upper - incr;
297 if (*pupper > old_upper)
298 *pupper = old_upper; // tracker C73258
299 } else {
300 if (*pupper > *plower)
301 *pupper = traits_t<T>::min_value;
302 if (plastiter != NULL__null)
303 *plastiter = *plower >= old_upper && *pupper < old_upper - incr;
304 if (*pupper < old_upper)
305 *pupper = old_upper; // tracker C73258
306 }
307 }
308 }
309 *pstride = trip_count;
310 break;
311 }
312 case kmp_sch_static_chunked: {
313 ST span;
314 if (chunk < 1) {
315 chunk = 1;
316 }
317 span = chunk * incr;
318 *pstride = span * nth;
319 *plower = *plower + (span * tid);
320 *pupper = *plower + span - incr;
321 if (plastiter != NULL__null)
322 *plastiter = (tid == ((trip_count - 1) / (UT)chunk) % nth);
323 break;
324 }
325#if OMP_45_ENABLED(50 >= 45)
326 case kmp_sch_static_balanced_chunked: {
327 T old_upper = *pupper;
328 // round up to make sure the chunk is enough to cover all iterations
329 UT span = (trip_count + nth - 1) / nth;
330
331 // perform chunk adjustment
332 chunk = (span + chunk - 1) & ~(chunk - 1);
333
334 span = chunk * incr;
335 *plower = *plower + (span * tid);
336 *pupper = *plower + span - incr;
337 if (incr > 0) {
338 if (*pupper > old_upper)
339 *pupper = old_upper;
340 } else if (*pupper < old_upper)
341 *pupper = old_upper;
342
343 if (plastiter != NULL__null)
344 *plastiter = (tid == ((trip_count - 1) / (UT)chunk));
345 break;
346 }
347#endif
348 default:
349 KMP_ASSERT2(0, "__kmpc_for_static_init: unknown scheduling type")((0) ? 0 : __kmp_debug_assert(("__kmpc_for_static_init: unknown scheduling type"
), "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 349))
;
350 break;
351 }
352
353#if USE_ITT_BUILD1
354 // Report loop metadata
355 if (KMP_MASTER_TID(tid)((tid) == 0) && __itt_metadata_add_ptr__kmp_itt_metadata_add_ptr__3_0 &&
356 __kmp_forkjoin_frames_mode == 3 &&
357#if OMP_40_ENABLED(50 >= 40)
358 th->th.th_teams_microtask == NULL__null &&
359#endif
360 team->t.t_active_level == 1) {
361 kmp_uint64 cur_chunk = chunk;
362 // Calculate chunk in case it was not specified; it is specified for
363 // kmp_sch_static_chunked
364 if (schedtype == kmp_sch_static) {
365 cur_chunk = trip_count / nth + ((trip_count % nth) ? 1 : 0);
366 }
367 // 0 - "static" schedule
368 __kmp_itt_metadata_loop(loc, 0, trip_count, cur_chunk);
369 }
370#endif
371#ifdef KMP_DEBUG1
372 {
373 char *buff;
374 // create format specifiers before the debug output
375 buff = __kmp_str_format("__kmpc_for_static_init: liter=%%d lower=%%%s "
376 "upper=%%%s stride = %%%s signed?<%s>\n",
377 traits_t<T>::spec, traits_t<T>::spec,
378 traits_t<ST>::spec, traits_t<T>::spec);
379 KD_TRACE(100, (buff, *plastiter, *plower, *pupper, *pstride))if (kmp_d_debug >= 100) { __kmp_debug_printf (buff, *plastiter
, *plower, *pupper, *pstride); }
;
380 __kmp_str_free(&buff);
381 }
382#endif
383 KE_TRACE(10, ("__kmpc_for_static_init: T#%d return\n", global_tid))if (kmp_e_debug >= 10) { __kmp_debug_printf ("__kmpc_for_static_init: T#%d return\n"
, global_tid); }
;
384
385#if OMPT_SUPPORT1 && OMPT_OPTIONAL1
386 if (ompt_enabled.ompt_callback_work) {
387 ompt_callbacks.ompt_callback(ompt_callback_work)ompt_callback_work_callback(
388 ompt_work_type, ompt_scope_begin, &(team_info->parallel_data),
389 &(task_info->task_data), trip_count, codeptr);
390 }
391#endif
392
393 return;
394}
395
396template <typename T>
397static void __kmp_dist_for_static_init(ident_t *loc, kmp_int32 gtid,
398 kmp_int32 schedule, kmp_int32 *plastiter,
399 T *plower, T *pupper, T *pupperDist,
400 typename traits_t<T>::signed_t *pstride,
401 typename traits_t<T>::signed_t incr,
402 typename traits_t<T>::signed_t chunk) {
403 KMP_COUNT_BLOCK(OMP_DISTRIBUTE)((void)0);
404 typedef typename traits_t<T>::unsigned_t UT;
405 typedef typename traits_t<T>::signed_t ST;
406 kmp_uint32 tid;
407 kmp_uint32 nth;
408 kmp_uint32 team_id;
409 kmp_uint32 nteams;
410 UT trip_count;
411 kmp_team_t *team;
412 kmp_info_t *th;
413
414 KMP_DEBUG_ASSERT(plastiter && plower && pupper && pupperDist && pstride)((plastiter && plower && pupper && pupperDist
&& pstride) ? 0 : __kmp_debug_assert("plastiter && plower && pupper && pupperDist && pstride"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 414))
;
415 KE_TRACE(10, ("__kmpc_dist_for_static_init called (%d)\n", gtid))if (kmp_e_debug >= 10) { __kmp_debug_printf ("__kmpc_dist_for_static_init called (%d)\n"
, gtid); }
;
416#ifdef KMP_DEBUG1
417 {
418 char *buff;
419 // create format specifiers before the debug output
420 buff = __kmp_str_format(
421 "__kmpc_dist_for_static_init: T#%%d schedLoop=%%d liter=%%d "
422 "iter=(%%%s, %%%s, %%%s) chunk=%%%s signed?<%s>\n",
423 traits_t<T>::spec, traits_t<T>::spec, traits_t<ST>::spec,
424 traits_t<ST>::spec, traits_t<T>::spec);
425 KD_TRACE(100,if (kmp_d_debug >= 100) { __kmp_debug_printf (buff, gtid, schedule
, *plastiter, *plower, *pupper, incr, chunk); }
426 (buff, gtid, schedule, *plastiter, *plower, *pupper, incr, chunk))if (kmp_d_debug >= 100) { __kmp_debug_printf (buff, gtid, schedule
, *plastiter, *plower, *pupper, incr, chunk); }
;
427 __kmp_str_free(&buff);
428 }
429#endif
430
431 if (__kmp_env_consistency_check) {
432 __kmp_push_workshare(gtid, ct_pdo, loc);
433 if (incr == 0) {
434 __kmp_error_construct(kmp_i18n_msg_CnsLoopIncrZeroProhibited, ct_pdo,
435 loc);
436 }
437 if (incr > 0 ? (*pupper < *plower) : (*plower < *pupper)) {
438 // The loop is illegal.
439 // Some zero-trip loops maintained by compiler, e.g.:
440 // for(i=10;i<0;++i) // lower >= upper - run-time check
441 // for(i=0;i>10;--i) // lower <= upper - run-time check
442 // for(i=0;i>10;++i) // incr > 0 - compile-time check
443 // for(i=10;i<0;--i) // incr < 0 - compile-time check
444 // Compiler does not check the following illegal loops:
445 // for(i=0;i<10;i+=incr) // where incr<0
446 // for(i=10;i>0;i-=incr) // where incr<0
447 __kmp_error_construct(kmp_i18n_msg_CnsLoopIncrIllegal, ct_pdo, loc);
448 }
449 }
450 tid = __kmp_tid_from_gtid(gtid)((((gtid) >= 0) ? 0 : __kmp_debug_assert("(gtid) >= 0",
"/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 450)), __kmp_threads[(gtid)]->th.th_info.ds.ds_tid)
;
451 th = __kmp_threads[gtid];
452 nth = th->th.th_team_nproc;
453 team = th->th.th_team;
454#if OMP_40_ENABLED(50 >= 40)
455 KMP_DEBUG_ASSERT(th->th.th_teams_microtask)((th->th.th_teams_microtask) ? 0 : __kmp_debug_assert("th->th.th_teams_microtask"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 455))
; // we are in the teams construct
456 nteams = th->th.th_teams_size.nteams;
457#endif
458 team_id = team->t.t_master_tid;
459 KMP_DEBUG_ASSERT(nteams == team->t.t_parent->t.t_nproc)((nteams == team->t.t_parent->t.t_nproc) ? 0 : __kmp_debug_assert
("nteams == team->t.t_parent->t.t_nproc", "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 459))
;
460
461 // compute global trip count
462 if (incr == 1) {
463 trip_count = *pupper - *plower + 1;
464 } else if (incr == -1) {
465 trip_count = *plower - *pupper + 1;
466 } else if (incr > 0) {
467 // upper-lower can exceed the limit of signed type
468 trip_count = (UT)(*pupper - *plower) / incr + 1;
469 } else {
470 trip_count = (UT)(*plower - *pupper) / (-incr) + 1;
471 }
472
473 *pstride = *pupper - *plower; // just in case (can be unused)
474 if (trip_count <= nteams) {
475 KMP_DEBUG_ASSERT(((__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced
) ? 0 : __kmp_debug_assert("__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 478))
476 __kmp_static == kmp_sch_static_greedy ||((__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced
) ? 0 : __kmp_debug_assert("__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 478))
477 __kmp_static ==((__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced
) ? 0 : __kmp_debug_assert("__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 478))
478 kmp_sch_static_balanced)((__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced
) ? 0 : __kmp_debug_assert("__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 478))
; // Unknown static scheduling type.
479 // only masters of some teams get single iteration, other threads get
480 // nothing
481 if (team_id < trip_count && tid == 0) {
482 *pupper = *pupperDist = *plower = *plower + team_id * incr;
483 } else {
484 *pupperDist = *pupper;
485 *plower = *pupper + incr; // compiler should skip loop body
486 }
487 if (plastiter != NULL__null)
488 *plastiter = (tid == 0 && team_id == trip_count - 1);
489 } else {
490 // Get the team's chunk first (each team gets at most one chunk)
491 if (__kmp_static == kmp_sch_static_balanced) {
492 UT chunkD = trip_count / nteams;
493 UT extras = trip_count % nteams;
494 *plower +=
495 incr * (team_id * chunkD + (team_id < extras ? team_id : extras));
496 *pupperDist = *plower + chunkD * incr - (team_id < extras ? 0 : incr);
497 if (plastiter != NULL__null)
498 *plastiter = (team_id == nteams - 1);
499 } else {
500 T chunk_inc_count =
501 (trip_count / nteams + ((trip_count % nteams) ? 1 : 0)) * incr;
502 T upper = *pupper;
503 KMP_DEBUG_ASSERT(__kmp_static == kmp_sch_static_greedy)((__kmp_static == kmp_sch_static_greedy) ? 0 : __kmp_debug_assert
("__kmp_static == kmp_sch_static_greedy", "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 503))
;
504 // Unknown static scheduling type.
505 *plower += team_id * chunk_inc_count;
506 *pupperDist = *plower + chunk_inc_count - incr;
507 // Check/correct bounds if needed
508 if (incr > 0) {
509 if (*pupperDist < *plower)
510 *pupperDist = traits_t<T>::max_value;
511 if (plastiter != NULL__null)
512 *plastiter = *plower <= upper && *pupperDist > upper - incr;
513 if (*pupperDist > upper)
514 *pupperDist = upper; // tracker C73258
515 if (*plower > *pupperDist) {
516 *pupper = *pupperDist; // no iterations available for the team
517 goto end;
518 }
519 } else {
520 if (*pupperDist > *plower)
521 *pupperDist = traits_t<T>::min_value;
522 if (plastiter != NULL__null)
523 *plastiter = *plower >= upper && *pupperDist < upper - incr;
524 if (*pupperDist < upper)
525 *pupperDist = upper; // tracker C73258
526 if (*plower < *pupperDist) {
527 *pupper = *pupperDist; // no iterations available for the team
528 goto end;
529 }
530 }
531 }
532 // Get the parallel loop chunk now (for thread)
533 // compute trip count for team's chunk
534 if (incr == 1) {
535 trip_count = *pupperDist - *plower + 1;
536 } else if (incr == -1) {
537 trip_count = *plower - *pupperDist + 1;
538 } else if (incr > 1) {
539 // upper-lower can exceed the limit of signed type
540 trip_count = (UT)(*pupperDist - *plower) / incr + 1;
541 } else {
542 trip_count = (UT)(*plower - *pupperDist) / (-incr) + 1;
543 }
544 KMP_DEBUG_ASSERT(trip_count)((trip_count) ? 0 : __kmp_debug_assert("trip_count", "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 544))
;
545 switch (schedule) {
546 case kmp_sch_static: {
547 if (trip_count <= nth) {
548 KMP_DEBUG_ASSERT(((__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced
) ? 0 : __kmp_debug_assert("__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 551))
549 __kmp_static == kmp_sch_static_greedy ||((__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced
) ? 0 : __kmp_debug_assert("__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 551))
550 __kmp_static ==((__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced
) ? 0 : __kmp_debug_assert("__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 551))
551 kmp_sch_static_balanced)((__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced
) ? 0 : __kmp_debug_assert("__kmp_static == kmp_sch_static_greedy || __kmp_static == kmp_sch_static_balanced"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 551))
; // Unknown static scheduling type.
552 if (tid < trip_count)
553 *pupper = *plower = *plower + tid * incr;
554 else
555 *plower = *pupper + incr; // no iterations available
556 if (plastiter != NULL__null)
557 if (*plastiter != 0 && !(tid == trip_count - 1))
558 *plastiter = 0;
559 } else {
560 if (__kmp_static == kmp_sch_static_balanced) {
561 UT chunkL = trip_count / nth;
562 UT extras = trip_count % nth;
563 *plower += incr * (tid * chunkL + (tid < extras ? tid : extras));
564 *pupper = *plower + chunkL * incr - (tid < extras ? 0 : incr);
565 if (plastiter != NULL__null)
566 if (*plastiter != 0 && !(tid == nth - 1))
567 *plastiter = 0;
568 } else {
569 T chunk_inc_count =
570 (trip_count / nth + ((trip_count % nth) ? 1 : 0)) * incr;
571 T upper = *pupperDist;
572 KMP_DEBUG_ASSERT(__kmp_static == kmp_sch_static_greedy)((__kmp_static == kmp_sch_static_greedy) ? 0 : __kmp_debug_assert
("__kmp_static == kmp_sch_static_greedy", "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 572))
;
573 // Unknown static scheduling type.
574 *plower += tid * chunk_inc_count;
575 *pupper = *plower + chunk_inc_count - incr;
576 if (incr > 0) {
577 if (*pupper < *plower)
578 *pupper = traits_t<T>::max_value;
579 if (plastiter != NULL__null)
580 if (*plastiter != 0 &&
581 !(*plower <= upper && *pupper > upper - incr))
582 *plastiter = 0;
583 if (*pupper > upper)
584 *pupper = upper; // tracker C73258
585 } else {
586 if (*pupper > *plower)
587 *pupper = traits_t<T>::min_value;
588 if (plastiter != NULL__null)
589 if (*plastiter != 0 &&
590 !(*plower >= upper && *pupper < upper - incr))
591 *plastiter = 0;
592 if (*pupper < upper)
593 *pupper = upper; // tracker C73258
594 }
595 }
596 }
597 break;
598 }
599 case kmp_sch_static_chunked: {
600 ST span;
601 if (chunk < 1)
602 chunk = 1;
603 span = chunk * incr;
604 *pstride = span * nth;
605 *plower = *plower + (span * tid);
606 *pupper = *plower + span - incr;
607 if (plastiter != NULL__null)
608 if (*plastiter != 0 && !(tid == ((trip_count - 1) / (UT)chunk) % nth))
609 *plastiter = 0;
610 break;
611 }
612 default:
613 KMP_ASSERT2(0,((0) ? 0 : __kmp_debug_assert(("__kmpc_dist_for_static_init: unknown loop scheduling type"
), "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 614))
614 "__kmpc_dist_for_static_init: unknown loop scheduling type")((0) ? 0 : __kmp_debug_assert(("__kmpc_dist_for_static_init: unknown loop scheduling type"
), "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 614))
;
615 break;
616 }
617 }
618end:;
619#ifdef KMP_DEBUG1
620 {
621 char *buff;
622 // create format specifiers before the debug output
623 buff = __kmp_str_format(
624 "__kmpc_dist_for_static_init: last=%%d lo=%%%s up=%%%s upDist=%%%s "
625 "stride=%%%s signed?<%s>\n",
626 traits_t<T>::spec, traits_t<T>::spec, traits_t<T>::spec,
627 traits_t<ST>::spec, traits_t<T>::spec);
628 KD_TRACE(100, (buff, *plastiter, *plower, *pupper, *pupperDist, *pstride))if (kmp_d_debug >= 100) { __kmp_debug_printf (buff, *plastiter
, *plower, *pupper, *pupperDist, *pstride); }
;
629 __kmp_str_free(&buff);
630 }
631#endif
632 KE_TRACE(10, ("__kmpc_dist_for_static_init: T#%d return\n", gtid))if (kmp_e_debug >= 10) { __kmp_debug_printf ("__kmpc_dist_for_static_init: T#%d return\n"
, gtid); }
;
633 return;
634}
635
636template <typename T>
637static void __kmp_team_static_init(ident_t *loc, kmp_int32 gtid,
638 kmp_int32 *p_last, T *p_lb, T *p_ub,
639 typename traits_t<T>::signed_t *p_st,
640 typename traits_t<T>::signed_t incr,
641 typename traits_t<T>::signed_t chunk) {
642 // The routine returns the first chunk distributed to the team and
643 // stride for next chunks calculation.
644 // Last iteration flag set for the team that will execute
645 // the last iteration of the loop.
646 // The routine is called for dist_schedue(static,chunk) only.
647 typedef typename traits_t<T>::unsigned_t UT;
648 typedef typename traits_t<T>::signed_t ST;
649 kmp_uint32 team_id;
650 kmp_uint32 nteams;
651 UT trip_count;
652 T lower;
653 T upper;
654 ST span;
655 kmp_team_t *team;
656 kmp_info_t *th;
657
658 KMP_DEBUG_ASSERT(p_last && p_lb && p_ub && p_st)((p_last && p_lb && p_ub && p_st) ? 0
: __kmp_debug_assert("p_last && p_lb && p_ub && p_st"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 658))
;
659 KE_TRACE(10, ("__kmp_team_static_init called (%d)\n", gtid))if (kmp_e_debug >= 10) { __kmp_debug_printf ("__kmp_team_static_init called (%d)\n"
, gtid); }
;
660#ifdef KMP_DEBUG1
661 {
662 char *buff;
663 // create format specifiers before the debug output
664 buff = __kmp_str_format("__kmp_team_static_init enter: T#%%d liter=%%d "
665 "iter=(%%%s, %%%s, %%%s) chunk %%%s; signed?<%s>\n",
666 traits_t<T>::spec, traits_t<T>::spec,
667 traits_t<ST>::spec, traits_t<ST>::spec,
668 traits_t<T>::spec);
669 KD_TRACE(100, (buff, gtid, *p_last, *p_lb, *p_ub, *p_st, chunk))if (kmp_d_debug >= 100) { __kmp_debug_printf (buff, gtid, *
p_last, *p_lb, *p_ub, *p_st, chunk); }
;
670 __kmp_str_free(&buff);
671 }
672#endif
673
674 lower = *p_lb;
675 upper = *p_ub;
676 if (__kmp_env_consistency_check) {
677 if (incr == 0) {
678 __kmp_error_construct(kmp_i18n_msg_CnsLoopIncrZeroProhibited, ct_pdo,
679 loc);
680 }
681 if (incr > 0 ? (upper < lower) : (lower < upper)) {
682 // The loop is illegal.
683 // Some zero-trip loops maintained by compiler, e.g.:
684 // for(i=10;i<0;++i) // lower >= upper - run-time check
685 // for(i=0;i>10;--i) // lower <= upper - run-time check
686 // for(i=0;i>10;++i) // incr > 0 - compile-time check
687 // for(i=10;i<0;--i) // incr < 0 - compile-time check
688 // Compiler does not check the following illegal loops:
689 // for(i=0;i<10;i+=incr) // where incr<0
690 // for(i=10;i>0;i-=incr) // where incr<0
691 __kmp_error_construct(kmp_i18n_msg_CnsLoopIncrIllegal, ct_pdo, loc);
692 }
693 }
694 th = __kmp_threads[gtid];
695 team = th->th.th_team;
696#if OMP_40_ENABLED(50 >= 40)
697 KMP_DEBUG_ASSERT(th->th.th_teams_microtask)((th->th.th_teams_microtask) ? 0 : __kmp_debug_assert("th->th.th_teams_microtask"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 697))
; // we are in the teams construct
698 nteams = th->th.th_teams_size.nteams;
699#endif
700 team_id = team->t.t_master_tid;
701 KMP_DEBUG_ASSERT(nteams == team->t.t_parent->t.t_nproc)((nteams == team->t.t_parent->t.t_nproc) ? 0 : __kmp_debug_assert
("nteams == team->t.t_parent->t.t_nproc", "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 701))
;
702
703 // compute trip count
704 if (incr == 1) {
705 trip_count = upper - lower + 1;
706 } else if (incr == -1) {
707 trip_count = lower - upper + 1;
708 } else if (incr > 0) {
709 // upper-lower can exceed the limit of signed type
710 trip_count = (UT)(upper - lower) / incr + 1;
711 } else {
712 trip_count = (UT)(lower - upper) / (-incr) + 1;
713 }
714 if (chunk < 1)
715 chunk = 1;
716 span = chunk * incr;
717 *p_st = span * nteams;
718 *p_lb = lower + (span * team_id);
719 *p_ub = *p_lb + span - incr;
720 if (p_last != NULL__null)
721 *p_last = (team_id == ((trip_count - 1) / (UT)chunk) % nteams);
722 // Correct upper bound if needed
723 if (incr > 0) {
724 if (*p_ub < *p_lb) // overflow?
725 *p_ub = traits_t<T>::max_value;
726 if (*p_ub > upper)
727 *p_ub = upper; // tracker C73258
728 } else { // incr < 0
729 if (*p_ub > *p_lb)
730 *p_ub = traits_t<T>::min_value;
731 if (*p_ub < upper)
732 *p_ub = upper; // tracker C73258
733 }
734#ifdef KMP_DEBUG1
735 {
736 char *buff;
737 // create format specifiers before the debug output
738 buff =
739 __kmp_str_format("__kmp_team_static_init exit: T#%%d team%%u liter=%%d "
740 "iter=(%%%s, %%%s, %%%s) chunk %%%s\n",
741 traits_t<T>::spec, traits_t<T>::spec,
742 traits_t<ST>::spec, traits_t<ST>::spec);
743 KD_TRACE(100, (buff, gtid, team_id, *p_last, *p_lb, *p_ub, *p_st, chunk))if (kmp_d_debug >= 100) { __kmp_debug_printf (buff, gtid, team_id
, *p_last, *p_lb, *p_ub, *p_st, chunk); }
;
744 __kmp_str_free(&buff);
745 }
746#endif
747}
748
749//------------------------------------------------------------------------------
750extern "C" {
751/*!
752@ingroup WORK_SHARING
753@param loc Source code location
754@param gtid Global thread id of this thread
755@param schedtype Scheduling type
756@param plastiter Pointer to the "last iteration" flag
757@param plower Pointer to the lower bound
758@param pupper Pointer to the upper bound
759@param pstride Pointer to the stride
760@param incr Loop increment
761@param chunk The chunk size
762
763Each of the four functions here are identical apart from the argument types.
764
765The functions compute the upper and lower bounds and stride to be used for the
766set of iterations to be executed by the current thread from the statically
767scheduled loop that is described by the initial values of the bounds, stride,
768increment and chunk size.
769
770@{
771*/
772void __kmpc_for_static_init_4(ident_t *loc, kmp_int32 gtid, kmp_int32 schedtype,
773 kmp_int32 *plastiter, kmp_int32 *plower,
774 kmp_int32 *pupper, kmp_int32 *pstride,
775 kmp_int32 incr, kmp_int32 chunk) {
776 __kmp_for_static_init<kmp_int32>(loc, gtid, schedtype, plastiter, plower,
777 pupper, pstride, incr, chunk
778#if OMPT_SUPPORT1 && OMPT_OPTIONAL1
779 ,
780 OMPT_GET_RETURN_ADDRESS(0)__builtin_return_address(0)
781#endif
782 );
783}
784
785/*!
786 See @ref __kmpc_for_static_init_4
787 */
788void __kmpc_for_static_init_4u(ident_t *loc, kmp_int32 gtid,
789 kmp_int32 schedtype, kmp_int32 *plastiter,
790 kmp_uint32 *plower, kmp_uint32 *pupper,
791 kmp_int32 *pstride, kmp_int32 incr,
792 kmp_int32 chunk) {
793 __kmp_for_static_init<kmp_uint32>(loc, gtid, schedtype, plastiter, plower,
794 pupper, pstride, incr, chunk
795#if OMPT_SUPPORT1 && OMPT_OPTIONAL1
796 ,
797 OMPT_GET_RETURN_ADDRESS(0)__builtin_return_address(0)
798#endif
799 );
800}
801
802/*!
803 See @ref __kmpc_for_static_init_4
804 */
805void __kmpc_for_static_init_8(ident_t *loc, kmp_int32 gtid, kmp_int32 schedtype,
806 kmp_int32 *plastiter, kmp_int64 *plower,
807 kmp_int64 *pupper, kmp_int64 *pstride,
808 kmp_int64 incr, kmp_int64 chunk) {
809 __kmp_for_static_init<kmp_int64>(loc, gtid, schedtype, plastiter, plower,
810 pupper, pstride, incr, chunk
811#if OMPT_SUPPORT1 && OMPT_OPTIONAL1
812 ,
813 OMPT_GET_RETURN_ADDRESS(0)__builtin_return_address(0)
814#endif
815 );
816}
817
818/*!
819 See @ref __kmpc_for_static_init_4
820 */
821void __kmpc_for_static_init_8u(ident_t *loc, kmp_int32 gtid,
822 kmp_int32 schedtype, kmp_int32 *plastiter,
823 kmp_uint64 *plower, kmp_uint64 *pupper,
824 kmp_int64 *pstride, kmp_int64 incr,
825 kmp_int64 chunk) {
826 __kmp_for_static_init<kmp_uint64>(loc, gtid, schedtype, plastiter, plower,
827 pupper, pstride, incr, chunk
828#if OMPT_SUPPORT1 && OMPT_OPTIONAL1
829 ,
830 OMPT_GET_RETURN_ADDRESS(0)__builtin_return_address(0)
831#endif
832 );
833}
834/*!
835@}
836*/
837
838/*!
839@ingroup WORK_SHARING
840@param loc Source code location
841@param gtid Global thread id of this thread
842@param schedule Scheduling type for the parallel loop
843@param plastiter Pointer to the "last iteration" flag
844@param plower Pointer to the lower bound
845@param pupper Pointer to the upper bound of loop chunk
846@param pupperD Pointer to the upper bound of dist_chunk
847@param pstride Pointer to the stride for parallel loop
848@param incr Loop increment
849@param chunk The chunk size for the parallel loop
850
851Each of the four functions here are identical apart from the argument types.
852
853The functions compute the upper and lower bounds and strides to be used for the
854set of iterations to be executed by the current thread from the statically
855scheduled loop that is described by the initial values of the bounds, strides,
856increment and chunks for parallel loop and distribute constructs.
857
858@{
859*/
860void __kmpc_dist_for_static_init_4(ident_t *loc, kmp_int32 gtid,
861 kmp_int32 schedule, kmp_int32 *plastiter,
862 kmp_int32 *plower, kmp_int32 *pupper,
863 kmp_int32 *pupperD, kmp_int32 *pstride,
864 kmp_int32 incr, kmp_int32 chunk) {
865 __kmp_dist_for_static_init<kmp_int32>(loc, gtid, schedule, plastiter, plower,
866 pupper, pupperD, pstride, incr, chunk);
867}
868
869/*!
870 See @ref __kmpc_dist_for_static_init_4
871 */
872void __kmpc_dist_for_static_init_4u(ident_t *loc, kmp_int32 gtid,
873 kmp_int32 schedule, kmp_int32 *plastiter,
874 kmp_uint32 *plower, kmp_uint32 *pupper,
875 kmp_uint32 *pupperD, kmp_int32 *pstride,
876 kmp_int32 incr, kmp_int32 chunk) {
877 __kmp_dist_for_static_init<kmp_uint32>(loc, gtid, schedule, plastiter, plower,
878 pupper, pupperD, pstride, incr, chunk);
879}
880
881/*!
882 See @ref __kmpc_dist_for_static_init_4
883 */
884void __kmpc_dist_for_static_init_8(ident_t *loc, kmp_int32 gtid,
885 kmp_int32 schedule, kmp_int32 *plastiter,
886 kmp_int64 *plower, kmp_int64 *pupper,
887 kmp_int64 *pupperD, kmp_int64 *pstride,
888 kmp_int64 incr, kmp_int64 chunk) {
889 __kmp_dist_for_static_init<kmp_int64>(loc, gtid, schedule, plastiter, plower,
890 pupper, pupperD, pstride, incr, chunk);
891}
892
893/*!
894 See @ref __kmpc_dist_for_static_init_4
895 */
896void __kmpc_dist_for_static_init_8u(ident_t *loc, kmp_int32 gtid,
897 kmp_int32 schedule, kmp_int32 *plastiter,
898 kmp_uint64 *plower, kmp_uint64 *pupper,
899 kmp_uint64 *pupperD, kmp_int64 *pstride,
900 kmp_int64 incr, kmp_int64 chunk) {
901 __kmp_dist_for_static_init<kmp_uint64>(loc, gtid, schedule, plastiter, plower,
902 pupper, pupperD, pstride, incr, chunk);
903}
904/*!
905@}
906*/
907
908//------------------------------------------------------------------------------
909// Auxiliary routines for Distribute Parallel Loop construct implementation
910// Transfer call to template< type T >
911// __kmp_team_static_init( ident_t *loc, int gtid,
912// int *p_last, T *lb, T *ub, ST *st, ST incr, ST chunk )
913
914/*!
915@ingroup WORK_SHARING
916@{
917@param loc Source location
918@param gtid Global thread id
919@param p_last pointer to last iteration flag
920@param p_lb pointer to Lower bound
921@param p_ub pointer to Upper bound
922@param p_st Step (or increment if you prefer)
923@param incr Loop increment
924@param chunk The chunk size to block with
925
926The functions compute the upper and lower bounds and stride to be used for the
927set of iterations to be executed by the current team from the statically
928scheduled loop that is described by the initial values of the bounds, stride,
929increment and chunk for the distribute construct as part of composite distribute
930parallel loop construct. These functions are all identical apart from the types
931of the arguments.
932*/
933
934void __kmpc_team_static_init_4(ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last,
935 kmp_int32 *p_lb, kmp_int32 *p_ub,
936 kmp_int32 *p_st, kmp_int32 incr,
937 kmp_int32 chunk) {
938 KMP_DEBUG_ASSERT(__kmp_init_serial)((__kmp_init_serial) ? 0 : __kmp_debug_assert("__kmp_init_serial"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 938))
;
939 __kmp_team_static_init<kmp_int32>(loc, gtid, p_last, p_lb, p_ub, p_st, incr,
940 chunk);
941}
942
943/*!
944 See @ref __kmpc_team_static_init_4
945 */
946void __kmpc_team_static_init_4u(ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last,
947 kmp_uint32 *p_lb, kmp_uint32 *p_ub,
948 kmp_int32 *p_st, kmp_int32 incr,
949 kmp_int32 chunk) {
950 KMP_DEBUG_ASSERT(__kmp_init_serial)((__kmp_init_serial) ? 0 : __kmp_debug_assert("__kmp_init_serial"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 950))
;
951 __kmp_team_static_init<kmp_uint32>(loc, gtid, p_last, p_lb, p_ub, p_st, incr,
952 chunk);
953}
954
955/*!
956 See @ref __kmpc_team_static_init_4
957 */
958void __kmpc_team_static_init_8(ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last,
959 kmp_int64 *p_lb, kmp_int64 *p_ub,
960 kmp_int64 *p_st, kmp_int64 incr,
961 kmp_int64 chunk) {
962 KMP_DEBUG_ASSERT(__kmp_init_serial)((__kmp_init_serial) ? 0 : __kmp_debug_assert("__kmp_init_serial"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 962))
;
963 __kmp_team_static_init<kmp_int64>(loc, gtid, p_last, p_lb, p_ub, p_st, incr,
964 chunk);
965}
966
967/*!
968 See @ref __kmpc_team_static_init_4
969 */
970void __kmpc_team_static_init_8u(ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last,
971 kmp_uint64 *p_lb, kmp_uint64 *p_ub,
972 kmp_int64 *p_st, kmp_int64 incr,
973 kmp_int64 chunk) {
974 KMP_DEBUG_ASSERT(__kmp_init_serial)((__kmp_init_serial) ? 0 : __kmp_debug_assert("__kmp_init_serial"
, "/build/llvm-toolchain-snapshot-7~svn338205/projects/openmp/runtime/src/kmp_sched.cpp"
, 974))
;
975 __kmp_team_static_init<kmp_uint64>(loc, gtid, p_last, p_lb, p_ub, p_st, incr,
976 chunk);
977}
978/*!
979@}
980*/
981
982} // extern "C"