xref: /freebsd/contrib/llvm-project/openmp/runtime/src/kmp_sched.cpp (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
10b57cec5SDimitry Andric /*
20b57cec5SDimitry Andric  * kmp_sched.cpp -- static scheduling -- iteration initialization
30b57cec5SDimitry Andric  */
40b57cec5SDimitry Andric 
50b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
80b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
90b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric /* Static scheduling initialization.
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric   NOTE: team->t.t_nproc is a constant inside of any dispatch loop, however
160b57cec5SDimitry Andric         it may change values between parallel regions.  __kmp_max_nth
170b57cec5SDimitry Andric         is the largest value __kmp_nth may take, 1 is the smallest. */
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric #include "kmp.h"
200b57cec5SDimitry Andric #include "kmp_error.h"
210b57cec5SDimitry Andric #include "kmp_i18n.h"
220b57cec5SDimitry Andric #include "kmp_itt.h"
230b57cec5SDimitry Andric #include "kmp_stats.h"
240b57cec5SDimitry Andric #include "kmp_str.h"
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric #if OMPT_SUPPORT
270b57cec5SDimitry Andric #include "ompt-specific.h"
280b57cec5SDimitry Andric #endif
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric #ifdef KMP_DEBUG
310b57cec5SDimitry Andric //-------------------------------------------------------------------------
320b57cec5SDimitry Andric // template for debug prints specification ( d, u, lld, llu )
330b57cec5SDimitry Andric char const *traits_t<int>::spec = "d";
340b57cec5SDimitry Andric char const *traits_t<unsigned int>::spec = "u";
350b57cec5SDimitry Andric char const *traits_t<long long>::spec = "lld";
360b57cec5SDimitry Andric char const *traits_t<unsigned long long>::spec = "llu";
370b57cec5SDimitry Andric char const *traits_t<long>::spec = "ld";
380b57cec5SDimitry Andric //-------------------------------------------------------------------------
390b57cec5SDimitry Andric #endif
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric #if KMP_STATS_ENABLED
420b57cec5SDimitry Andric #define KMP_STATS_LOOP_END(stat)                                               \
430b57cec5SDimitry Andric   {                                                                            \
440b57cec5SDimitry Andric     kmp_int64 t;                                                               \
450b57cec5SDimitry Andric     kmp_int64 u = (kmp_int64)(*pupper);                                        \
460b57cec5SDimitry Andric     kmp_int64 l = (kmp_int64)(*plower);                                        \
470b57cec5SDimitry Andric     kmp_int64 i = (kmp_int64)incr;                                             \
480b57cec5SDimitry Andric     if (i == 1) {                                                              \
490b57cec5SDimitry Andric       t = u - l + 1;                                                           \
500b57cec5SDimitry Andric     } else if (i == -1) {                                                      \
510b57cec5SDimitry Andric       t = l - u + 1;                                                           \
520b57cec5SDimitry Andric     } else if (i > 0) {                                                        \
530b57cec5SDimitry Andric       t = (u - l) / i + 1;                                                     \
540b57cec5SDimitry Andric     } else {                                                                   \
550b57cec5SDimitry Andric       t = (l - u) / (-i) + 1;                                                  \
560b57cec5SDimitry Andric     }                                                                          \
570b57cec5SDimitry Andric     KMP_COUNT_VALUE(stat, t);                                                  \
580b57cec5SDimitry Andric     KMP_POP_PARTITIONED_TIMER();                                               \
590b57cec5SDimitry Andric   }
600b57cec5SDimitry Andric #else
610b57cec5SDimitry Andric #define KMP_STATS_LOOP_END(stat) /* Nothing */
620b57cec5SDimitry Andric #endif
630b57cec5SDimitry Andric 
64*e8d8bef9SDimitry Andric static ident_t loc_stub = {0, KMP_IDENT_KMPC, 0, 0, ";unknown;unknown;0;0;;"};
65*e8d8bef9SDimitry Andric static inline void check_loc(ident_t *&loc) {
66*e8d8bef9SDimitry Andric   if (loc == NULL)
67*e8d8bef9SDimitry Andric     loc = &loc_stub; // may need to report location info to ittnotify
68*e8d8bef9SDimitry Andric }
69*e8d8bef9SDimitry Andric 
700b57cec5SDimitry Andric template <typename T>
710b57cec5SDimitry Andric static void __kmp_for_static_init(ident_t *loc, kmp_int32 global_tid,
720b57cec5SDimitry Andric                                   kmp_int32 schedtype, kmp_int32 *plastiter,
730b57cec5SDimitry Andric                                   T *plower, T *pupper,
740b57cec5SDimitry Andric                                   typename traits_t<T>::signed_t *pstride,
750b57cec5SDimitry Andric                                   typename traits_t<T>::signed_t incr,
760b57cec5SDimitry Andric                                   typename traits_t<T>::signed_t chunk
770b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL
780b57cec5SDimitry Andric                                   ,
790b57cec5SDimitry Andric                                   void *codeptr
800b57cec5SDimitry Andric #endif
810b57cec5SDimitry Andric                                   ) {
820b57cec5SDimitry Andric   KMP_COUNT_BLOCK(OMP_LOOP_STATIC);
830b57cec5SDimitry Andric   KMP_PUSH_PARTITIONED_TIMER(OMP_loop_static);
840b57cec5SDimitry Andric   KMP_PUSH_PARTITIONED_TIMER(OMP_loop_static_scheduling);
850b57cec5SDimitry Andric 
860b57cec5SDimitry Andric   typedef typename traits_t<T>::unsigned_t UT;
870b57cec5SDimitry Andric   typedef typename traits_t<T>::signed_t ST;
880b57cec5SDimitry Andric   /*  this all has to be changed back to TID and such.. */
890b57cec5SDimitry Andric   kmp_int32 gtid = global_tid;
900b57cec5SDimitry Andric   kmp_uint32 tid;
910b57cec5SDimitry Andric   kmp_uint32 nth;
920b57cec5SDimitry Andric   UT trip_count;
930b57cec5SDimitry Andric   kmp_team_t *team;
94*e8d8bef9SDimitry Andric   __kmp_assert_valid_gtid(gtid);
950b57cec5SDimitry Andric   kmp_info_t *th = __kmp_threads[gtid];
960b57cec5SDimitry Andric 
970b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL
980b57cec5SDimitry Andric   ompt_team_info_t *team_info = NULL;
990b57cec5SDimitry Andric   ompt_task_info_t *task_info = NULL;
1000b57cec5SDimitry Andric   ompt_work_t ompt_work_type = ompt_work_loop;
1010b57cec5SDimitry Andric 
1020b57cec5SDimitry Andric   static kmp_int8 warn = 0;
1030b57cec5SDimitry Andric 
1040b57cec5SDimitry Andric   if (ompt_enabled.ompt_callback_work) {
1050b57cec5SDimitry Andric     // Only fully initialize variables needed by OMPT if OMPT is enabled.
1060b57cec5SDimitry Andric     team_info = __ompt_get_teaminfo(0, NULL);
1070b57cec5SDimitry Andric     task_info = __ompt_get_task_info_object(0);
1080b57cec5SDimitry Andric     // Determine workshare type
1090b57cec5SDimitry Andric     if (loc != NULL) {
1100b57cec5SDimitry Andric       if ((loc->flags & KMP_IDENT_WORK_LOOP) != 0) {
1110b57cec5SDimitry Andric         ompt_work_type = ompt_work_loop;
1120b57cec5SDimitry Andric       } else if ((loc->flags & KMP_IDENT_WORK_SECTIONS) != 0) {
1130b57cec5SDimitry Andric         ompt_work_type = ompt_work_sections;
1140b57cec5SDimitry Andric       } else if ((loc->flags & KMP_IDENT_WORK_DISTRIBUTE) != 0) {
1150b57cec5SDimitry Andric         ompt_work_type = ompt_work_distribute;
1160b57cec5SDimitry Andric       } else {
1170b57cec5SDimitry Andric         kmp_int8 bool_res =
1180b57cec5SDimitry Andric             KMP_COMPARE_AND_STORE_ACQ8(&warn, (kmp_int8)0, (kmp_int8)1);
1190b57cec5SDimitry Andric         if (bool_res)
1200b57cec5SDimitry Andric           KMP_WARNING(OmptOutdatedWorkshare);
1210b57cec5SDimitry Andric       }
1220b57cec5SDimitry Andric       KMP_DEBUG_ASSERT(ompt_work_type);
1230b57cec5SDimitry Andric     }
1240b57cec5SDimitry Andric   }
1250b57cec5SDimitry Andric #endif
1260b57cec5SDimitry Andric 
1270b57cec5SDimitry Andric   KMP_DEBUG_ASSERT(plastiter && plower && pupper && pstride);
1280b57cec5SDimitry Andric   KE_TRACE(10, ("__kmpc_for_static_init called (%d)\n", global_tid));
1290b57cec5SDimitry Andric #ifdef KMP_DEBUG
1300b57cec5SDimitry Andric   {
1310b57cec5SDimitry Andric     char *buff;
1320b57cec5SDimitry Andric     // create format specifiers before the debug output
1330b57cec5SDimitry Andric     buff = __kmp_str_format(
1340b57cec5SDimitry Andric         "__kmpc_for_static_init: T#%%d sched=%%d liter=%%d iter=(%%%s,"
1350b57cec5SDimitry Andric         " %%%s, %%%s) incr=%%%s chunk=%%%s signed?<%s>\n",
1360b57cec5SDimitry Andric         traits_t<T>::spec, traits_t<T>::spec, traits_t<ST>::spec,
1370b57cec5SDimitry Andric         traits_t<ST>::spec, traits_t<ST>::spec, traits_t<T>::spec);
1380b57cec5SDimitry Andric     KD_TRACE(100, (buff, global_tid, schedtype, *plastiter, *plower, *pupper,
1390b57cec5SDimitry Andric                    *pstride, incr, chunk));
1400b57cec5SDimitry Andric     __kmp_str_free(&buff);
1410b57cec5SDimitry Andric   }
1420b57cec5SDimitry Andric #endif
1430b57cec5SDimitry Andric 
1440b57cec5SDimitry Andric   if (__kmp_env_consistency_check) {
1450b57cec5SDimitry Andric     __kmp_push_workshare(global_tid, ct_pdo, loc);
1460b57cec5SDimitry Andric     if (incr == 0) {
1470b57cec5SDimitry Andric       __kmp_error_construct(kmp_i18n_msg_CnsLoopIncrZeroProhibited, ct_pdo,
1480b57cec5SDimitry Andric                             loc);
1490b57cec5SDimitry Andric     }
1500b57cec5SDimitry Andric   }
1510b57cec5SDimitry Andric   /* special handling for zero-trip loops */
1520b57cec5SDimitry Andric   if (incr > 0 ? (*pupper < *plower) : (*plower < *pupper)) {
1530b57cec5SDimitry Andric     if (plastiter != NULL)
1540b57cec5SDimitry Andric       *plastiter = FALSE;
1550b57cec5SDimitry Andric     /* leave pupper and plower set to entire iteration space */
1560b57cec5SDimitry Andric     *pstride = incr; /* value should never be used */
1570b57cec5SDimitry Andric // *plower = *pupper - incr;
1580b57cec5SDimitry Andric // let compiler bypass the illegal loop (like for(i=1;i<10;i--))
1590b57cec5SDimitry Andric // THE LINE COMMENTED ABOVE CAUSED shape2F/h_tests_1.f TO HAVE A FAILURE
1600b57cec5SDimitry Andric // ON A ZERO-TRIP LOOP (lower=1, upper=0,stride=1) - JPH June 23, 2009.
1610b57cec5SDimitry Andric #ifdef KMP_DEBUG
1620b57cec5SDimitry Andric     {
1630b57cec5SDimitry Andric       char *buff;
1640b57cec5SDimitry Andric       // create format specifiers before the debug output
1650b57cec5SDimitry Andric       buff = __kmp_str_format("__kmpc_for_static_init:(ZERO TRIP) liter=%%d "
1660b57cec5SDimitry Andric                               "lower=%%%s upper=%%%s stride = %%%s "
1670b57cec5SDimitry Andric                               "signed?<%s>, loc = %%s\n",
1680b57cec5SDimitry Andric                               traits_t<T>::spec, traits_t<T>::spec,
1690b57cec5SDimitry Andric                               traits_t<ST>::spec, traits_t<T>::spec);
1700b57cec5SDimitry Andric       KD_TRACE(100,
1710b57cec5SDimitry Andric                (buff, *plastiter, *plower, *pupper, *pstride, loc->psource));
1720b57cec5SDimitry Andric       __kmp_str_free(&buff);
1730b57cec5SDimitry Andric     }
1740b57cec5SDimitry Andric #endif
1750b57cec5SDimitry Andric     KE_TRACE(10, ("__kmpc_for_static_init: T#%d return\n", global_tid));
1760b57cec5SDimitry Andric 
1770b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL
1780b57cec5SDimitry Andric     if (ompt_enabled.ompt_callback_work) {
1790b57cec5SDimitry Andric       ompt_callbacks.ompt_callback(ompt_callback_work)(
1800b57cec5SDimitry Andric           ompt_work_type, ompt_scope_begin, &(team_info->parallel_data),
1810b57cec5SDimitry Andric           &(task_info->task_data), 0, codeptr);
1820b57cec5SDimitry Andric     }
1830b57cec5SDimitry Andric #endif
1840b57cec5SDimitry Andric     KMP_STATS_LOOP_END(OMP_loop_static_iterations);
1850b57cec5SDimitry Andric     return;
1860b57cec5SDimitry Andric   }
1870b57cec5SDimitry Andric 
1880b57cec5SDimitry Andric   // Although there are schedule enumerations above kmp_ord_upper which are not
1890b57cec5SDimitry Andric   // schedules for "distribute", the only ones which are useful are dynamic, so
1900b57cec5SDimitry Andric   // cannot be seen here, since this codepath is only executed for static
1910b57cec5SDimitry Andric   // schedules.
1920b57cec5SDimitry Andric   if (schedtype > kmp_ord_upper) {
1930b57cec5SDimitry Andric     // we are in DISTRIBUTE construct
1940b57cec5SDimitry Andric     schedtype += kmp_sch_static -
1950b57cec5SDimitry Andric                  kmp_distribute_static; // AC: convert to usual schedule type
1960b57cec5SDimitry Andric     tid = th->th.th_team->t.t_master_tid;
1970b57cec5SDimitry Andric     team = th->th.th_team->t.t_parent;
1980b57cec5SDimitry Andric   } else {
1990b57cec5SDimitry Andric     tid = __kmp_tid_from_gtid(global_tid);
2000b57cec5SDimitry Andric     team = th->th.th_team;
2010b57cec5SDimitry Andric   }
2020b57cec5SDimitry Andric 
2030b57cec5SDimitry Andric   /* determine if "for" loop is an active worksharing construct */
2040b57cec5SDimitry Andric   if (team->t.t_serialized) {
2050b57cec5SDimitry Andric     /* serialized parallel, each thread executes whole iteration space */
2060b57cec5SDimitry Andric     if (plastiter != NULL)
2070b57cec5SDimitry Andric       *plastiter = TRUE;
2080b57cec5SDimitry Andric     /* leave pupper and plower set to entire iteration space */
2090b57cec5SDimitry Andric     *pstride =
2100b57cec5SDimitry Andric         (incr > 0) ? (*pupper - *plower + 1) : (-(*plower - *pupper + 1));
2110b57cec5SDimitry Andric 
2120b57cec5SDimitry Andric #ifdef KMP_DEBUG
2130b57cec5SDimitry Andric     {
2140b57cec5SDimitry Andric       char *buff;
2150b57cec5SDimitry Andric       // create format specifiers before the debug output
2160b57cec5SDimitry Andric       buff = __kmp_str_format("__kmpc_for_static_init: (serial) liter=%%d "
2170b57cec5SDimitry Andric                               "lower=%%%s upper=%%%s stride = %%%s\n",
2180b57cec5SDimitry Andric                               traits_t<T>::spec, traits_t<T>::spec,
2190b57cec5SDimitry Andric                               traits_t<ST>::spec);
2200b57cec5SDimitry Andric       KD_TRACE(100, (buff, *plastiter, *plower, *pupper, *pstride));
2210b57cec5SDimitry Andric       __kmp_str_free(&buff);
2220b57cec5SDimitry Andric     }
2230b57cec5SDimitry Andric #endif
2240b57cec5SDimitry Andric     KE_TRACE(10, ("__kmpc_for_static_init: T#%d return\n", global_tid));
2250b57cec5SDimitry Andric 
2260b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL
2270b57cec5SDimitry Andric     if (ompt_enabled.ompt_callback_work) {
2280b57cec5SDimitry Andric       ompt_callbacks.ompt_callback(ompt_callback_work)(
2290b57cec5SDimitry Andric           ompt_work_type, ompt_scope_begin, &(team_info->parallel_data),
2300b57cec5SDimitry Andric           &(task_info->task_data), *pstride, codeptr);
2310b57cec5SDimitry Andric     }
2320b57cec5SDimitry Andric #endif
2330b57cec5SDimitry Andric     KMP_STATS_LOOP_END(OMP_loop_static_iterations);
2340b57cec5SDimitry Andric     return;
2350b57cec5SDimitry Andric   }
2360b57cec5SDimitry Andric   nth = team->t.t_nproc;
2370b57cec5SDimitry Andric   if (nth == 1) {
2380b57cec5SDimitry Andric     if (plastiter != NULL)
2390b57cec5SDimitry Andric       *plastiter = TRUE;
2400b57cec5SDimitry Andric     *pstride =
2410b57cec5SDimitry Andric         (incr > 0) ? (*pupper - *plower + 1) : (-(*plower - *pupper + 1));
2420b57cec5SDimitry Andric #ifdef KMP_DEBUG
2430b57cec5SDimitry Andric     {
2440b57cec5SDimitry Andric       char *buff;
2450b57cec5SDimitry Andric       // create format specifiers before the debug output
2460b57cec5SDimitry Andric       buff = __kmp_str_format("__kmpc_for_static_init: (serial) liter=%%d "
2470b57cec5SDimitry Andric                               "lower=%%%s upper=%%%s stride = %%%s\n",
2480b57cec5SDimitry Andric                               traits_t<T>::spec, traits_t<T>::spec,
2490b57cec5SDimitry Andric                               traits_t<ST>::spec);
2500b57cec5SDimitry Andric       KD_TRACE(100, (buff, *plastiter, *plower, *pupper, *pstride));
2510b57cec5SDimitry Andric       __kmp_str_free(&buff);
2520b57cec5SDimitry Andric     }
2530b57cec5SDimitry Andric #endif
2540b57cec5SDimitry Andric     KE_TRACE(10, ("__kmpc_for_static_init: T#%d return\n", global_tid));
2550b57cec5SDimitry Andric 
2560b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL
2570b57cec5SDimitry Andric     if (ompt_enabled.ompt_callback_work) {
2580b57cec5SDimitry Andric       ompt_callbacks.ompt_callback(ompt_callback_work)(
2590b57cec5SDimitry Andric           ompt_work_type, ompt_scope_begin, &(team_info->parallel_data),
2600b57cec5SDimitry Andric           &(task_info->task_data), *pstride, codeptr);
2610b57cec5SDimitry Andric     }
2620b57cec5SDimitry Andric #endif
2630b57cec5SDimitry Andric     KMP_STATS_LOOP_END(OMP_loop_static_iterations);
2640b57cec5SDimitry Andric     return;
2650b57cec5SDimitry Andric   }
2660b57cec5SDimitry Andric 
2670b57cec5SDimitry Andric   /* compute trip count */
2680b57cec5SDimitry Andric   if (incr == 1) {
2690b57cec5SDimitry Andric     trip_count = *pupper - *plower + 1;
2700b57cec5SDimitry Andric   } else if (incr == -1) {
2710b57cec5SDimitry Andric     trip_count = *plower - *pupper + 1;
2720b57cec5SDimitry Andric   } else if (incr > 0) {
2730b57cec5SDimitry Andric     // upper-lower can exceed the limit of signed type
2740b57cec5SDimitry Andric     trip_count = (UT)(*pupper - *plower) / incr + 1;
2750b57cec5SDimitry Andric   } else {
2760b57cec5SDimitry Andric     trip_count = (UT)(*plower - *pupper) / (-incr) + 1;
2770b57cec5SDimitry Andric   }
2780b57cec5SDimitry Andric 
2790b57cec5SDimitry Andric #if KMP_STATS_ENABLED
2800b57cec5SDimitry Andric   if (KMP_MASTER_GTID(gtid)) {
2810b57cec5SDimitry Andric     KMP_COUNT_VALUE(OMP_loop_static_total_iterations, trip_count);
2820b57cec5SDimitry Andric   }
2830b57cec5SDimitry Andric #endif
2840b57cec5SDimitry Andric 
2850b57cec5SDimitry Andric   if (__kmp_env_consistency_check) {
2860b57cec5SDimitry Andric     /* tripcount overflow? */
2870b57cec5SDimitry Andric     if (trip_count == 0 && *pupper != *plower) {
2880b57cec5SDimitry Andric       __kmp_error_construct(kmp_i18n_msg_CnsIterationRangeTooLarge, ct_pdo,
2890b57cec5SDimitry Andric                             loc);
2900b57cec5SDimitry Andric     }
2910b57cec5SDimitry Andric   }
2920b57cec5SDimitry Andric 
2930b57cec5SDimitry Andric   /* compute remaining parameters */
2940b57cec5SDimitry Andric   switch (schedtype) {
2950b57cec5SDimitry Andric   case kmp_sch_static: {
2960b57cec5SDimitry Andric     if (trip_count < nth) {
2970b57cec5SDimitry Andric       KMP_DEBUG_ASSERT(
2980b57cec5SDimitry Andric           __kmp_static == kmp_sch_static_greedy ||
2990b57cec5SDimitry Andric           __kmp_static ==
3000b57cec5SDimitry Andric               kmp_sch_static_balanced); // Unknown static scheduling type.
3010b57cec5SDimitry Andric       if (tid < trip_count) {
3020b57cec5SDimitry Andric         *pupper = *plower = *plower + tid * incr;
3030b57cec5SDimitry Andric       } else {
3040b57cec5SDimitry Andric         *plower = *pupper + incr;
3050b57cec5SDimitry Andric       }
3060b57cec5SDimitry Andric       if (plastiter != NULL)
3070b57cec5SDimitry Andric         *plastiter = (tid == trip_count - 1);
3080b57cec5SDimitry Andric     } else {
3090b57cec5SDimitry Andric       if (__kmp_static == kmp_sch_static_balanced) {
3100b57cec5SDimitry Andric         UT small_chunk = trip_count / nth;
3110b57cec5SDimitry Andric         UT extras = trip_count % nth;
3120b57cec5SDimitry Andric         *plower += incr * (tid * small_chunk + (tid < extras ? tid : extras));
3130b57cec5SDimitry Andric         *pupper = *plower + small_chunk * incr - (tid < extras ? 0 : incr);
3140b57cec5SDimitry Andric         if (plastiter != NULL)
3150b57cec5SDimitry Andric           *plastiter = (tid == nth - 1);
3160b57cec5SDimitry Andric       } else {
3170b57cec5SDimitry Andric         T big_chunk_inc_count =
3180b57cec5SDimitry Andric             (trip_count / nth + ((trip_count % nth) ? 1 : 0)) * incr;
3190b57cec5SDimitry Andric         T old_upper = *pupper;
3200b57cec5SDimitry Andric 
3210b57cec5SDimitry Andric         KMP_DEBUG_ASSERT(__kmp_static == kmp_sch_static_greedy);
3220b57cec5SDimitry Andric         // Unknown static scheduling type.
3230b57cec5SDimitry Andric 
3240b57cec5SDimitry Andric         *plower += tid * big_chunk_inc_count;
3250b57cec5SDimitry Andric         *pupper = *plower + big_chunk_inc_count - incr;
3260b57cec5SDimitry Andric         if (incr > 0) {
3270b57cec5SDimitry Andric           if (*pupper < *plower)
3280b57cec5SDimitry Andric             *pupper = traits_t<T>::max_value;
3290b57cec5SDimitry Andric           if (plastiter != NULL)
3300b57cec5SDimitry Andric             *plastiter = *plower <= old_upper && *pupper > old_upper - incr;
3310b57cec5SDimitry Andric           if (*pupper > old_upper)
3320b57cec5SDimitry Andric             *pupper = old_upper; // tracker C73258
3330b57cec5SDimitry Andric         } else {
3340b57cec5SDimitry Andric           if (*pupper > *plower)
3350b57cec5SDimitry Andric             *pupper = traits_t<T>::min_value;
3360b57cec5SDimitry Andric           if (plastiter != NULL)
3370b57cec5SDimitry Andric             *plastiter = *plower >= old_upper && *pupper < old_upper - incr;
3380b57cec5SDimitry Andric           if (*pupper < old_upper)
3390b57cec5SDimitry Andric             *pupper = old_upper; // tracker C73258
3400b57cec5SDimitry Andric         }
3410b57cec5SDimitry Andric       }
3420b57cec5SDimitry Andric     }
3430b57cec5SDimitry Andric     *pstride = trip_count;
3440b57cec5SDimitry Andric     break;
3450b57cec5SDimitry Andric   }
3460b57cec5SDimitry Andric   case kmp_sch_static_chunked: {
3470b57cec5SDimitry Andric     ST span;
3480b57cec5SDimitry Andric     if (chunk < 1) {
3490b57cec5SDimitry Andric       chunk = 1;
3500b57cec5SDimitry Andric     }
3510b57cec5SDimitry Andric     span = chunk * incr;
3520b57cec5SDimitry Andric     *pstride = span * nth;
3530b57cec5SDimitry Andric     *plower = *plower + (span * tid);
3540b57cec5SDimitry Andric     *pupper = *plower + span - incr;
3550b57cec5SDimitry Andric     if (plastiter != NULL)
3560b57cec5SDimitry Andric       *plastiter = (tid == ((trip_count - 1) / (UT)chunk) % nth);
3570b57cec5SDimitry Andric     break;
3580b57cec5SDimitry Andric   }
3590b57cec5SDimitry Andric   case kmp_sch_static_balanced_chunked: {
3600b57cec5SDimitry Andric     T old_upper = *pupper;
3610b57cec5SDimitry Andric     // round up to make sure the chunk is enough to cover all iterations
3620b57cec5SDimitry Andric     UT span = (trip_count + nth - 1) / nth;
3630b57cec5SDimitry Andric 
3640b57cec5SDimitry Andric     // perform chunk adjustment
3650b57cec5SDimitry Andric     chunk = (span + chunk - 1) & ~(chunk - 1);
3660b57cec5SDimitry Andric 
3670b57cec5SDimitry Andric     span = chunk * incr;
3680b57cec5SDimitry Andric     *plower = *plower + (span * tid);
3690b57cec5SDimitry Andric     *pupper = *plower + span - incr;
3700b57cec5SDimitry Andric     if (incr > 0) {
3710b57cec5SDimitry Andric       if (*pupper > old_upper)
3720b57cec5SDimitry Andric         *pupper = old_upper;
3730b57cec5SDimitry Andric     } else if (*pupper < old_upper)
3740b57cec5SDimitry Andric       *pupper = old_upper;
3750b57cec5SDimitry Andric 
3760b57cec5SDimitry Andric     if (plastiter != NULL)
3770b57cec5SDimitry Andric       *plastiter = (tid == ((trip_count - 1) / (UT)chunk));
3780b57cec5SDimitry Andric     break;
3790b57cec5SDimitry Andric   }
3800b57cec5SDimitry Andric   default:
3810b57cec5SDimitry Andric     KMP_ASSERT2(0, "__kmpc_for_static_init: unknown scheduling type");
3820b57cec5SDimitry Andric     break;
3830b57cec5SDimitry Andric   }
3840b57cec5SDimitry Andric 
3850b57cec5SDimitry Andric #if USE_ITT_BUILD
3860b57cec5SDimitry Andric   // Report loop metadata
3870b57cec5SDimitry Andric   if (KMP_MASTER_TID(tid) && __itt_metadata_add_ptr &&
3880b57cec5SDimitry Andric       __kmp_forkjoin_frames_mode == 3 && th->th.th_teams_microtask == NULL &&
3890b57cec5SDimitry Andric       team->t.t_active_level == 1) {
3900b57cec5SDimitry Andric     kmp_uint64 cur_chunk = chunk;
391*e8d8bef9SDimitry Andric     check_loc(loc);
3920b57cec5SDimitry Andric     // Calculate chunk in case it was not specified; it is specified for
3930b57cec5SDimitry Andric     // kmp_sch_static_chunked
3940b57cec5SDimitry Andric     if (schedtype == kmp_sch_static) {
3950b57cec5SDimitry Andric       cur_chunk = trip_count / nth + ((trip_count % nth) ? 1 : 0);
3960b57cec5SDimitry Andric     }
3970b57cec5SDimitry Andric     // 0 - "static" schedule
3980b57cec5SDimitry Andric     __kmp_itt_metadata_loop(loc, 0, trip_count, cur_chunk);
3990b57cec5SDimitry Andric   }
4000b57cec5SDimitry Andric #endif
4010b57cec5SDimitry Andric #ifdef KMP_DEBUG
4020b57cec5SDimitry Andric   {
4030b57cec5SDimitry Andric     char *buff;
4040b57cec5SDimitry Andric     // create format specifiers before the debug output
4050b57cec5SDimitry Andric     buff = __kmp_str_format("__kmpc_for_static_init: liter=%%d lower=%%%s "
4060b57cec5SDimitry Andric                             "upper=%%%s stride = %%%s signed?<%s>\n",
4070b57cec5SDimitry Andric                             traits_t<T>::spec, traits_t<T>::spec,
4080b57cec5SDimitry Andric                             traits_t<ST>::spec, traits_t<T>::spec);
4090b57cec5SDimitry Andric     KD_TRACE(100, (buff, *plastiter, *plower, *pupper, *pstride));
4100b57cec5SDimitry Andric     __kmp_str_free(&buff);
4110b57cec5SDimitry Andric   }
4120b57cec5SDimitry Andric #endif
4130b57cec5SDimitry Andric   KE_TRACE(10, ("__kmpc_for_static_init: T#%d return\n", global_tid));
4140b57cec5SDimitry Andric 
4150b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL
4160b57cec5SDimitry Andric   if (ompt_enabled.ompt_callback_work) {
4170b57cec5SDimitry Andric     ompt_callbacks.ompt_callback(ompt_callback_work)(
4180b57cec5SDimitry Andric         ompt_work_type, ompt_scope_begin, &(team_info->parallel_data),
4190b57cec5SDimitry Andric         &(task_info->task_data), trip_count, codeptr);
4200b57cec5SDimitry Andric   }
4210b57cec5SDimitry Andric #endif
4220b57cec5SDimitry Andric 
4230b57cec5SDimitry Andric   KMP_STATS_LOOP_END(OMP_loop_static_iterations);
4240b57cec5SDimitry Andric   return;
4250b57cec5SDimitry Andric }
4260b57cec5SDimitry Andric 
4270b57cec5SDimitry Andric template <typename T>
4280b57cec5SDimitry Andric static void __kmp_dist_for_static_init(ident_t *loc, kmp_int32 gtid,
4290b57cec5SDimitry Andric                                        kmp_int32 schedule, kmp_int32 *plastiter,
4300b57cec5SDimitry Andric                                        T *plower, T *pupper, T *pupperDist,
4310b57cec5SDimitry Andric                                        typename traits_t<T>::signed_t *pstride,
4320b57cec5SDimitry Andric                                        typename traits_t<T>::signed_t incr,
4330b57cec5SDimitry Andric                                        typename traits_t<T>::signed_t chunk) {
4340b57cec5SDimitry Andric   KMP_COUNT_BLOCK(OMP_DISTRIBUTE);
4350b57cec5SDimitry Andric   KMP_PUSH_PARTITIONED_TIMER(OMP_distribute);
4360b57cec5SDimitry Andric   KMP_PUSH_PARTITIONED_TIMER(OMP_distribute_scheduling);
4370b57cec5SDimitry Andric   typedef typename traits_t<T>::unsigned_t UT;
4380b57cec5SDimitry Andric   typedef typename traits_t<T>::signed_t ST;
4390b57cec5SDimitry Andric   kmp_uint32 tid;
4400b57cec5SDimitry Andric   kmp_uint32 nth;
4410b57cec5SDimitry Andric   kmp_uint32 team_id;
4420b57cec5SDimitry Andric   kmp_uint32 nteams;
4430b57cec5SDimitry Andric   UT trip_count;
4440b57cec5SDimitry Andric   kmp_team_t *team;
4450b57cec5SDimitry Andric   kmp_info_t *th;
4460b57cec5SDimitry Andric 
4470b57cec5SDimitry Andric   KMP_DEBUG_ASSERT(plastiter && plower && pupper && pupperDist && pstride);
4480b57cec5SDimitry Andric   KE_TRACE(10, ("__kmpc_dist_for_static_init called (%d)\n", gtid));
449*e8d8bef9SDimitry Andric   __kmp_assert_valid_gtid(gtid);
4500b57cec5SDimitry Andric #ifdef KMP_DEBUG
4510b57cec5SDimitry Andric   {
4520b57cec5SDimitry Andric     char *buff;
4530b57cec5SDimitry Andric     // create format specifiers before the debug output
4540b57cec5SDimitry Andric     buff = __kmp_str_format(
4550b57cec5SDimitry Andric         "__kmpc_dist_for_static_init: T#%%d schedLoop=%%d liter=%%d "
4560b57cec5SDimitry Andric         "iter=(%%%s, %%%s, %%%s) chunk=%%%s signed?<%s>\n",
4570b57cec5SDimitry Andric         traits_t<T>::spec, traits_t<T>::spec, traits_t<ST>::spec,
4580b57cec5SDimitry Andric         traits_t<ST>::spec, traits_t<T>::spec);
4590b57cec5SDimitry Andric     KD_TRACE(100,
4600b57cec5SDimitry Andric              (buff, gtid, schedule, *plastiter, *plower, *pupper, incr, chunk));
4610b57cec5SDimitry Andric     __kmp_str_free(&buff);
4620b57cec5SDimitry Andric   }
4630b57cec5SDimitry Andric #endif
4640b57cec5SDimitry Andric 
4650b57cec5SDimitry Andric   if (__kmp_env_consistency_check) {
4660b57cec5SDimitry Andric     __kmp_push_workshare(gtid, ct_pdo, loc);
4670b57cec5SDimitry Andric     if (incr == 0) {
4680b57cec5SDimitry Andric       __kmp_error_construct(kmp_i18n_msg_CnsLoopIncrZeroProhibited, ct_pdo,
4690b57cec5SDimitry Andric                             loc);
4700b57cec5SDimitry Andric     }
4710b57cec5SDimitry Andric     if (incr > 0 ? (*pupper < *plower) : (*plower < *pupper)) {
4720b57cec5SDimitry Andric       // The loop is illegal.
4730b57cec5SDimitry Andric       // Some zero-trip loops maintained by compiler, e.g.:
4740b57cec5SDimitry Andric       //   for(i=10;i<0;++i) // lower >= upper - run-time check
4750b57cec5SDimitry Andric       //   for(i=0;i>10;--i) // lower <= upper - run-time check
4760b57cec5SDimitry Andric       //   for(i=0;i>10;++i) // incr > 0       - compile-time check
4770b57cec5SDimitry Andric       //   for(i=10;i<0;--i) // incr < 0       - compile-time check
4780b57cec5SDimitry Andric       // Compiler does not check the following illegal loops:
4790b57cec5SDimitry Andric       //   for(i=0;i<10;i+=incr) // where incr<0
4800b57cec5SDimitry Andric       //   for(i=10;i>0;i-=incr) // where incr<0
4810b57cec5SDimitry Andric       __kmp_error_construct(kmp_i18n_msg_CnsLoopIncrIllegal, ct_pdo, loc);
4820b57cec5SDimitry Andric     }
4830b57cec5SDimitry Andric   }
4840b57cec5SDimitry Andric   tid = __kmp_tid_from_gtid(gtid);
4850b57cec5SDimitry Andric   th = __kmp_threads[gtid];
4860b57cec5SDimitry Andric   nth = th->th.th_team_nproc;
4870b57cec5SDimitry Andric   team = th->th.th_team;
4880b57cec5SDimitry Andric   KMP_DEBUG_ASSERT(th->th.th_teams_microtask); // we are in the teams construct
4890b57cec5SDimitry Andric   nteams = th->th.th_teams_size.nteams;
4900b57cec5SDimitry Andric   team_id = team->t.t_master_tid;
4910b57cec5SDimitry Andric   KMP_DEBUG_ASSERT(nteams == (kmp_uint32)team->t.t_parent->t.t_nproc);
4920b57cec5SDimitry Andric 
4930b57cec5SDimitry Andric   // compute global trip count
4940b57cec5SDimitry Andric   if (incr == 1) {
4950b57cec5SDimitry Andric     trip_count = *pupper - *plower + 1;
4960b57cec5SDimitry Andric   } else if (incr == -1) {
4970b57cec5SDimitry Andric     trip_count = *plower - *pupper + 1;
4980b57cec5SDimitry Andric   } else if (incr > 0) {
4990b57cec5SDimitry Andric     // upper-lower can exceed the limit of signed type
5000b57cec5SDimitry Andric     trip_count = (UT)(*pupper - *plower) / incr + 1;
5010b57cec5SDimitry Andric   } else {
5020b57cec5SDimitry Andric     trip_count = (UT)(*plower - *pupper) / (-incr) + 1;
5030b57cec5SDimitry Andric   }
5040b57cec5SDimitry Andric 
5050b57cec5SDimitry Andric   *pstride = *pupper - *plower; // just in case (can be unused)
5060b57cec5SDimitry Andric   if (trip_count <= nteams) {
5070b57cec5SDimitry Andric     KMP_DEBUG_ASSERT(
5080b57cec5SDimitry Andric         __kmp_static == kmp_sch_static_greedy ||
5090b57cec5SDimitry Andric         __kmp_static ==
5100b57cec5SDimitry Andric             kmp_sch_static_balanced); // Unknown static scheduling type.
5110b57cec5SDimitry Andric     // only masters of some teams get single iteration, other threads get
5120b57cec5SDimitry Andric     // nothing
5130b57cec5SDimitry Andric     if (team_id < trip_count && tid == 0) {
5140b57cec5SDimitry Andric       *pupper = *pupperDist = *plower = *plower + team_id * incr;
5150b57cec5SDimitry Andric     } else {
5160b57cec5SDimitry Andric       *pupperDist = *pupper;
5170b57cec5SDimitry Andric       *plower = *pupper + incr; // compiler should skip loop body
5180b57cec5SDimitry Andric     }
5190b57cec5SDimitry Andric     if (plastiter != NULL)
5200b57cec5SDimitry Andric       *plastiter = (tid == 0 && team_id == trip_count - 1);
5210b57cec5SDimitry Andric   } else {
5220b57cec5SDimitry Andric     // Get the team's chunk first (each team gets at most one chunk)
5230b57cec5SDimitry Andric     if (__kmp_static == kmp_sch_static_balanced) {
5240b57cec5SDimitry Andric       UT chunkD = trip_count / nteams;
5250b57cec5SDimitry Andric       UT extras = trip_count % nteams;
5260b57cec5SDimitry Andric       *plower +=
5270b57cec5SDimitry Andric           incr * (team_id * chunkD + (team_id < extras ? team_id : extras));
5280b57cec5SDimitry Andric       *pupperDist = *plower + chunkD * incr - (team_id < extras ? 0 : incr);
5290b57cec5SDimitry Andric       if (plastiter != NULL)
5300b57cec5SDimitry Andric         *plastiter = (team_id == nteams - 1);
5310b57cec5SDimitry Andric     } else {
5320b57cec5SDimitry Andric       T chunk_inc_count =
5330b57cec5SDimitry Andric           (trip_count / nteams + ((trip_count % nteams) ? 1 : 0)) * incr;
5340b57cec5SDimitry Andric       T upper = *pupper;
5350b57cec5SDimitry Andric       KMP_DEBUG_ASSERT(__kmp_static == kmp_sch_static_greedy);
5360b57cec5SDimitry Andric       // Unknown static scheduling type.
5370b57cec5SDimitry Andric       *plower += team_id * chunk_inc_count;
5380b57cec5SDimitry Andric       *pupperDist = *plower + chunk_inc_count - incr;
5390b57cec5SDimitry Andric       // Check/correct bounds if needed
5400b57cec5SDimitry Andric       if (incr > 0) {
5410b57cec5SDimitry Andric         if (*pupperDist < *plower)
5420b57cec5SDimitry Andric           *pupperDist = traits_t<T>::max_value;
5430b57cec5SDimitry Andric         if (plastiter != NULL)
5440b57cec5SDimitry Andric           *plastiter = *plower <= upper && *pupperDist > upper - incr;
5450b57cec5SDimitry Andric         if (*pupperDist > upper)
5460b57cec5SDimitry Andric           *pupperDist = upper; // tracker C73258
5470b57cec5SDimitry Andric         if (*plower > *pupperDist) {
5480b57cec5SDimitry Andric           *pupper = *pupperDist; // no iterations available for the team
5490b57cec5SDimitry Andric           goto end;
5500b57cec5SDimitry Andric         }
5510b57cec5SDimitry Andric       } else {
5520b57cec5SDimitry Andric         if (*pupperDist > *plower)
5530b57cec5SDimitry Andric           *pupperDist = traits_t<T>::min_value;
5540b57cec5SDimitry Andric         if (plastiter != NULL)
5550b57cec5SDimitry Andric           *plastiter = *plower >= upper && *pupperDist < upper - incr;
5560b57cec5SDimitry Andric         if (*pupperDist < upper)
5570b57cec5SDimitry Andric           *pupperDist = upper; // tracker C73258
5580b57cec5SDimitry Andric         if (*plower < *pupperDist) {
5590b57cec5SDimitry Andric           *pupper = *pupperDist; // no iterations available for the team
5600b57cec5SDimitry Andric           goto end;
5610b57cec5SDimitry Andric         }
5620b57cec5SDimitry Andric       }
5630b57cec5SDimitry Andric     }
5640b57cec5SDimitry Andric     // Get the parallel loop chunk now (for thread)
5650b57cec5SDimitry Andric     // compute trip count for team's chunk
5660b57cec5SDimitry Andric     if (incr == 1) {
5670b57cec5SDimitry Andric       trip_count = *pupperDist - *plower + 1;
5680b57cec5SDimitry Andric     } else if (incr == -1) {
5690b57cec5SDimitry Andric       trip_count = *plower - *pupperDist + 1;
5700b57cec5SDimitry Andric     } else if (incr > 1) {
5710b57cec5SDimitry Andric       // upper-lower can exceed the limit of signed type
5720b57cec5SDimitry Andric       trip_count = (UT)(*pupperDist - *plower) / incr + 1;
5730b57cec5SDimitry Andric     } else {
5740b57cec5SDimitry Andric       trip_count = (UT)(*plower - *pupperDist) / (-incr) + 1;
5750b57cec5SDimitry Andric     }
5760b57cec5SDimitry Andric     KMP_DEBUG_ASSERT(trip_count);
5770b57cec5SDimitry Andric     switch (schedule) {
5780b57cec5SDimitry Andric     case kmp_sch_static: {
5790b57cec5SDimitry Andric       if (trip_count <= nth) {
5800b57cec5SDimitry Andric         KMP_DEBUG_ASSERT(
5810b57cec5SDimitry Andric             __kmp_static == kmp_sch_static_greedy ||
5820b57cec5SDimitry Andric             __kmp_static ==
5830b57cec5SDimitry Andric                 kmp_sch_static_balanced); // Unknown static scheduling type.
5840b57cec5SDimitry Andric         if (tid < trip_count)
5850b57cec5SDimitry Andric           *pupper = *plower = *plower + tid * incr;
5860b57cec5SDimitry Andric         else
5870b57cec5SDimitry Andric           *plower = *pupper + incr; // no iterations available
5880b57cec5SDimitry Andric         if (plastiter != NULL)
5890b57cec5SDimitry Andric           if (*plastiter != 0 && !(tid == trip_count - 1))
5900b57cec5SDimitry Andric             *plastiter = 0;
5910b57cec5SDimitry Andric       } else {
5920b57cec5SDimitry Andric         if (__kmp_static == kmp_sch_static_balanced) {
5930b57cec5SDimitry Andric           UT chunkL = trip_count / nth;
5940b57cec5SDimitry Andric           UT extras = trip_count % nth;
5950b57cec5SDimitry Andric           *plower += incr * (tid * chunkL + (tid < extras ? tid : extras));
5960b57cec5SDimitry Andric           *pupper = *plower + chunkL * incr - (tid < extras ? 0 : incr);
5970b57cec5SDimitry Andric           if (plastiter != NULL)
5980b57cec5SDimitry Andric             if (*plastiter != 0 && !(tid == nth - 1))
5990b57cec5SDimitry Andric               *plastiter = 0;
6000b57cec5SDimitry Andric         } else {
6010b57cec5SDimitry Andric           T chunk_inc_count =
6020b57cec5SDimitry Andric               (trip_count / nth + ((trip_count % nth) ? 1 : 0)) * incr;
6030b57cec5SDimitry Andric           T upper = *pupperDist;
6040b57cec5SDimitry Andric           KMP_DEBUG_ASSERT(__kmp_static == kmp_sch_static_greedy);
6050b57cec5SDimitry Andric           // Unknown static scheduling type.
6060b57cec5SDimitry Andric           *plower += tid * chunk_inc_count;
6070b57cec5SDimitry Andric           *pupper = *plower + chunk_inc_count - incr;
6080b57cec5SDimitry Andric           if (incr > 0) {
6090b57cec5SDimitry Andric             if (*pupper < *plower)
6100b57cec5SDimitry Andric               *pupper = traits_t<T>::max_value;
6110b57cec5SDimitry Andric             if (plastiter != NULL)
6120b57cec5SDimitry Andric               if (*plastiter != 0 &&
6130b57cec5SDimitry Andric                   !(*plower <= upper && *pupper > upper - incr))
6140b57cec5SDimitry Andric                 *plastiter = 0;
6150b57cec5SDimitry Andric             if (*pupper > upper)
6160b57cec5SDimitry Andric               *pupper = upper; // tracker C73258
6170b57cec5SDimitry Andric           } else {
6180b57cec5SDimitry Andric             if (*pupper > *plower)
6190b57cec5SDimitry Andric               *pupper = traits_t<T>::min_value;
6200b57cec5SDimitry Andric             if (plastiter != NULL)
6210b57cec5SDimitry Andric               if (*plastiter != 0 &&
6220b57cec5SDimitry Andric                   !(*plower >= upper && *pupper < upper - incr))
6230b57cec5SDimitry Andric                 *plastiter = 0;
6240b57cec5SDimitry Andric             if (*pupper < upper)
6250b57cec5SDimitry Andric               *pupper = upper; // tracker C73258
6260b57cec5SDimitry Andric           }
6270b57cec5SDimitry Andric         }
6280b57cec5SDimitry Andric       }
6290b57cec5SDimitry Andric       break;
6300b57cec5SDimitry Andric     }
6310b57cec5SDimitry Andric     case kmp_sch_static_chunked: {
6320b57cec5SDimitry Andric       ST span;
6330b57cec5SDimitry Andric       if (chunk < 1)
6340b57cec5SDimitry Andric         chunk = 1;
6350b57cec5SDimitry Andric       span = chunk * incr;
6360b57cec5SDimitry Andric       *pstride = span * nth;
6370b57cec5SDimitry Andric       *plower = *plower + (span * tid);
6380b57cec5SDimitry Andric       *pupper = *plower + span - incr;
6390b57cec5SDimitry Andric       if (plastiter != NULL)
6400b57cec5SDimitry Andric         if (*plastiter != 0 && !(tid == ((trip_count - 1) / (UT)chunk) % nth))
6410b57cec5SDimitry Andric           *plastiter = 0;
6420b57cec5SDimitry Andric       break;
6430b57cec5SDimitry Andric     }
6440b57cec5SDimitry Andric     default:
6450b57cec5SDimitry Andric       KMP_ASSERT2(0,
6460b57cec5SDimitry Andric                   "__kmpc_dist_for_static_init: unknown loop scheduling type");
6470b57cec5SDimitry Andric       break;
6480b57cec5SDimitry Andric     }
6490b57cec5SDimitry Andric   }
6500b57cec5SDimitry Andric end:;
6510b57cec5SDimitry Andric #ifdef KMP_DEBUG
6520b57cec5SDimitry Andric   {
6530b57cec5SDimitry Andric     char *buff;
6540b57cec5SDimitry Andric     // create format specifiers before the debug output
6550b57cec5SDimitry Andric     buff = __kmp_str_format(
6560b57cec5SDimitry Andric         "__kmpc_dist_for_static_init: last=%%d lo=%%%s up=%%%s upDist=%%%s "
6570b57cec5SDimitry Andric         "stride=%%%s signed?<%s>\n",
6580b57cec5SDimitry Andric         traits_t<T>::spec, traits_t<T>::spec, traits_t<T>::spec,
6590b57cec5SDimitry Andric         traits_t<ST>::spec, traits_t<T>::spec);
6600b57cec5SDimitry Andric     KD_TRACE(100, (buff, *plastiter, *plower, *pupper, *pupperDist, *pstride));
6610b57cec5SDimitry Andric     __kmp_str_free(&buff);
6620b57cec5SDimitry Andric   }
6630b57cec5SDimitry Andric #endif
6640b57cec5SDimitry Andric   KE_TRACE(10, ("__kmpc_dist_for_static_init: T#%d return\n", gtid));
6650b57cec5SDimitry Andric   KMP_STATS_LOOP_END(OMP_distribute_iterations);
6660b57cec5SDimitry Andric   return;
6670b57cec5SDimitry Andric }
6680b57cec5SDimitry Andric 
6690b57cec5SDimitry Andric template <typename T>
6700b57cec5SDimitry Andric static void __kmp_team_static_init(ident_t *loc, kmp_int32 gtid,
6710b57cec5SDimitry Andric                                    kmp_int32 *p_last, T *p_lb, T *p_ub,
6720b57cec5SDimitry Andric                                    typename traits_t<T>::signed_t *p_st,
6730b57cec5SDimitry Andric                                    typename traits_t<T>::signed_t incr,
6740b57cec5SDimitry Andric                                    typename traits_t<T>::signed_t chunk) {
6750b57cec5SDimitry Andric   // The routine returns the first chunk distributed to the team and
6760b57cec5SDimitry Andric   // stride for next chunks calculation.
6770b57cec5SDimitry Andric   // Last iteration flag set for the team that will execute
6780b57cec5SDimitry Andric   // the last iteration of the loop.
6795ffd83dbSDimitry Andric   // The routine is called for dist_schedule(static,chunk) only.
6800b57cec5SDimitry Andric   typedef typename traits_t<T>::unsigned_t UT;
6810b57cec5SDimitry Andric   typedef typename traits_t<T>::signed_t ST;
6820b57cec5SDimitry Andric   kmp_uint32 team_id;
6830b57cec5SDimitry Andric   kmp_uint32 nteams;
6840b57cec5SDimitry Andric   UT trip_count;
6850b57cec5SDimitry Andric   T lower;
6860b57cec5SDimitry Andric   T upper;
6870b57cec5SDimitry Andric   ST span;
6880b57cec5SDimitry Andric   kmp_team_t *team;
6890b57cec5SDimitry Andric   kmp_info_t *th;
6900b57cec5SDimitry Andric 
6910b57cec5SDimitry Andric   KMP_DEBUG_ASSERT(p_last && p_lb && p_ub && p_st);
6920b57cec5SDimitry Andric   KE_TRACE(10, ("__kmp_team_static_init called (%d)\n", gtid));
693*e8d8bef9SDimitry Andric   __kmp_assert_valid_gtid(gtid);
6940b57cec5SDimitry Andric #ifdef KMP_DEBUG
6950b57cec5SDimitry Andric   {
6960b57cec5SDimitry Andric     char *buff;
6970b57cec5SDimitry Andric     // create format specifiers before the debug output
6980b57cec5SDimitry Andric     buff = __kmp_str_format("__kmp_team_static_init enter: T#%%d liter=%%d "
6990b57cec5SDimitry Andric                             "iter=(%%%s, %%%s, %%%s) chunk %%%s; signed?<%s>\n",
7000b57cec5SDimitry Andric                             traits_t<T>::spec, traits_t<T>::spec,
7010b57cec5SDimitry Andric                             traits_t<ST>::spec, traits_t<ST>::spec,
7020b57cec5SDimitry Andric                             traits_t<T>::spec);
7030b57cec5SDimitry Andric     KD_TRACE(100, (buff, gtid, *p_last, *p_lb, *p_ub, *p_st, chunk));
7040b57cec5SDimitry Andric     __kmp_str_free(&buff);
7050b57cec5SDimitry Andric   }
7060b57cec5SDimitry Andric #endif
7070b57cec5SDimitry Andric 
7080b57cec5SDimitry Andric   lower = *p_lb;
7090b57cec5SDimitry Andric   upper = *p_ub;
7100b57cec5SDimitry Andric   if (__kmp_env_consistency_check) {
7110b57cec5SDimitry Andric     if (incr == 0) {
7120b57cec5SDimitry Andric       __kmp_error_construct(kmp_i18n_msg_CnsLoopIncrZeroProhibited, ct_pdo,
7130b57cec5SDimitry Andric                             loc);
7140b57cec5SDimitry Andric     }
7150b57cec5SDimitry Andric     if (incr > 0 ? (upper < lower) : (lower < upper)) {
7160b57cec5SDimitry Andric       // The loop is illegal.
7170b57cec5SDimitry Andric       // Some zero-trip loops maintained by compiler, e.g.:
7180b57cec5SDimitry Andric       //   for(i=10;i<0;++i) // lower >= upper - run-time check
7190b57cec5SDimitry Andric       //   for(i=0;i>10;--i) // lower <= upper - run-time check
7200b57cec5SDimitry Andric       //   for(i=0;i>10;++i) // incr > 0       - compile-time check
7210b57cec5SDimitry Andric       //   for(i=10;i<0;--i) // incr < 0       - compile-time check
7220b57cec5SDimitry Andric       // Compiler does not check the following illegal loops:
7230b57cec5SDimitry Andric       //   for(i=0;i<10;i+=incr) // where incr<0
7240b57cec5SDimitry Andric       //   for(i=10;i>0;i-=incr) // where incr<0
7250b57cec5SDimitry Andric       __kmp_error_construct(kmp_i18n_msg_CnsLoopIncrIllegal, ct_pdo, loc);
7260b57cec5SDimitry Andric     }
7270b57cec5SDimitry Andric   }
7280b57cec5SDimitry Andric   th = __kmp_threads[gtid];
7290b57cec5SDimitry Andric   team = th->th.th_team;
7300b57cec5SDimitry Andric   KMP_DEBUG_ASSERT(th->th.th_teams_microtask); // we are in the teams construct
7310b57cec5SDimitry Andric   nteams = th->th.th_teams_size.nteams;
7320b57cec5SDimitry Andric   team_id = team->t.t_master_tid;
7330b57cec5SDimitry Andric   KMP_DEBUG_ASSERT(nteams == (kmp_uint32)team->t.t_parent->t.t_nproc);
7340b57cec5SDimitry Andric 
7350b57cec5SDimitry Andric   // compute trip count
7360b57cec5SDimitry Andric   if (incr == 1) {
7370b57cec5SDimitry Andric     trip_count = upper - lower + 1;
7380b57cec5SDimitry Andric   } else if (incr == -1) {
7390b57cec5SDimitry Andric     trip_count = lower - upper + 1;
7400b57cec5SDimitry Andric   } else if (incr > 0) {
7410b57cec5SDimitry Andric     // upper-lower can exceed the limit of signed type
7420b57cec5SDimitry Andric     trip_count = (UT)(upper - lower) / incr + 1;
7430b57cec5SDimitry Andric   } else {
7440b57cec5SDimitry Andric     trip_count = (UT)(lower - upper) / (-incr) + 1;
7450b57cec5SDimitry Andric   }
7460b57cec5SDimitry Andric   if (chunk < 1)
7470b57cec5SDimitry Andric     chunk = 1;
7480b57cec5SDimitry Andric   span = chunk * incr;
7490b57cec5SDimitry Andric   *p_st = span * nteams;
7500b57cec5SDimitry Andric   *p_lb = lower + (span * team_id);
7510b57cec5SDimitry Andric   *p_ub = *p_lb + span - incr;
7520b57cec5SDimitry Andric   if (p_last != NULL)
7530b57cec5SDimitry Andric     *p_last = (team_id == ((trip_count - 1) / (UT)chunk) % nteams);
7540b57cec5SDimitry Andric   // Correct upper bound if needed
7550b57cec5SDimitry Andric   if (incr > 0) {
7560b57cec5SDimitry Andric     if (*p_ub < *p_lb) // overflow?
7570b57cec5SDimitry Andric       *p_ub = traits_t<T>::max_value;
7580b57cec5SDimitry Andric     if (*p_ub > upper)
7590b57cec5SDimitry Andric       *p_ub = upper; // tracker C73258
7600b57cec5SDimitry Andric   } else { // incr < 0
7610b57cec5SDimitry Andric     if (*p_ub > *p_lb)
7620b57cec5SDimitry Andric       *p_ub = traits_t<T>::min_value;
7630b57cec5SDimitry Andric     if (*p_ub < upper)
7640b57cec5SDimitry Andric       *p_ub = upper; // tracker C73258
7650b57cec5SDimitry Andric   }
7660b57cec5SDimitry Andric #ifdef KMP_DEBUG
7670b57cec5SDimitry Andric   {
7680b57cec5SDimitry Andric     char *buff;
7690b57cec5SDimitry Andric     // create format specifiers before the debug output
7700b57cec5SDimitry Andric     buff =
7710b57cec5SDimitry Andric         __kmp_str_format("__kmp_team_static_init exit: T#%%d team%%u liter=%%d "
7720b57cec5SDimitry Andric                          "iter=(%%%s, %%%s, %%%s) chunk %%%s\n",
7730b57cec5SDimitry Andric                          traits_t<T>::spec, traits_t<T>::spec,
7740b57cec5SDimitry Andric                          traits_t<ST>::spec, traits_t<ST>::spec);
7750b57cec5SDimitry Andric     KD_TRACE(100, (buff, gtid, team_id, *p_last, *p_lb, *p_ub, *p_st, chunk));
7760b57cec5SDimitry Andric     __kmp_str_free(&buff);
7770b57cec5SDimitry Andric   }
7780b57cec5SDimitry Andric #endif
7790b57cec5SDimitry Andric }
7800b57cec5SDimitry Andric 
7810b57cec5SDimitry Andric //------------------------------------------------------------------------------
7820b57cec5SDimitry Andric extern "C" {
7830b57cec5SDimitry Andric /*!
7840b57cec5SDimitry Andric @ingroup WORK_SHARING
7850b57cec5SDimitry Andric @param    loc       Source code location
7860b57cec5SDimitry Andric @param    gtid      Global thread id of this thread
7870b57cec5SDimitry Andric @param    schedtype  Scheduling type
7880b57cec5SDimitry Andric @param    plastiter Pointer to the "last iteration" flag
7890b57cec5SDimitry Andric @param    plower    Pointer to the lower bound
7900b57cec5SDimitry Andric @param    pupper    Pointer to the upper bound
7910b57cec5SDimitry Andric @param    pstride   Pointer to the stride
7920b57cec5SDimitry Andric @param    incr      Loop increment
7930b57cec5SDimitry Andric @param    chunk     The chunk size
7940b57cec5SDimitry Andric 
7950b57cec5SDimitry Andric Each of the four functions here are identical apart from the argument types.
7960b57cec5SDimitry Andric 
7970b57cec5SDimitry Andric The functions compute the upper and lower bounds and stride to be used for the
7980b57cec5SDimitry Andric set of iterations to be executed by the current thread from the statically
7990b57cec5SDimitry Andric scheduled loop that is described by the initial values of the bounds, stride,
8000b57cec5SDimitry Andric increment and chunk size.
8010b57cec5SDimitry Andric 
8020b57cec5SDimitry Andric @{
8030b57cec5SDimitry Andric */
8040b57cec5SDimitry Andric void __kmpc_for_static_init_4(ident_t *loc, kmp_int32 gtid, kmp_int32 schedtype,
8050b57cec5SDimitry Andric                               kmp_int32 *plastiter, kmp_int32 *plower,
8060b57cec5SDimitry Andric                               kmp_int32 *pupper, kmp_int32 *pstride,
8070b57cec5SDimitry Andric                               kmp_int32 incr, kmp_int32 chunk) {
8080b57cec5SDimitry Andric   __kmp_for_static_init<kmp_int32>(loc, gtid, schedtype, plastiter, plower,
8090b57cec5SDimitry Andric                                    pupper, pstride, incr, chunk
8100b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL
8110b57cec5SDimitry Andric                                    ,
8120b57cec5SDimitry Andric                                    OMPT_GET_RETURN_ADDRESS(0)
8130b57cec5SDimitry Andric #endif
8140b57cec5SDimitry Andric                                        );
8150b57cec5SDimitry Andric }
8160b57cec5SDimitry Andric 
8170b57cec5SDimitry Andric /*!
8180b57cec5SDimitry Andric  See @ref __kmpc_for_static_init_4
8190b57cec5SDimitry Andric  */
8200b57cec5SDimitry Andric void __kmpc_for_static_init_4u(ident_t *loc, kmp_int32 gtid,
8210b57cec5SDimitry Andric                                kmp_int32 schedtype, kmp_int32 *plastiter,
8220b57cec5SDimitry Andric                                kmp_uint32 *plower, kmp_uint32 *pupper,
8230b57cec5SDimitry Andric                                kmp_int32 *pstride, kmp_int32 incr,
8240b57cec5SDimitry Andric                                kmp_int32 chunk) {
8250b57cec5SDimitry Andric   __kmp_for_static_init<kmp_uint32>(loc, gtid, schedtype, plastiter, plower,
8260b57cec5SDimitry Andric                                     pupper, pstride, incr, chunk
8270b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL
8280b57cec5SDimitry Andric                                     ,
8290b57cec5SDimitry Andric                                     OMPT_GET_RETURN_ADDRESS(0)
8300b57cec5SDimitry Andric #endif
8310b57cec5SDimitry Andric                                         );
8320b57cec5SDimitry Andric }
8330b57cec5SDimitry Andric 
8340b57cec5SDimitry Andric /*!
8350b57cec5SDimitry Andric  See @ref __kmpc_for_static_init_4
8360b57cec5SDimitry Andric  */
8370b57cec5SDimitry Andric void __kmpc_for_static_init_8(ident_t *loc, kmp_int32 gtid, kmp_int32 schedtype,
8380b57cec5SDimitry Andric                               kmp_int32 *plastiter, kmp_int64 *plower,
8390b57cec5SDimitry Andric                               kmp_int64 *pupper, kmp_int64 *pstride,
8400b57cec5SDimitry Andric                               kmp_int64 incr, kmp_int64 chunk) {
8410b57cec5SDimitry Andric   __kmp_for_static_init<kmp_int64>(loc, gtid, schedtype, plastiter, plower,
8420b57cec5SDimitry Andric                                    pupper, pstride, incr, chunk
8430b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL
8440b57cec5SDimitry Andric                                    ,
8450b57cec5SDimitry Andric                                    OMPT_GET_RETURN_ADDRESS(0)
8460b57cec5SDimitry Andric #endif
8470b57cec5SDimitry Andric                                        );
8480b57cec5SDimitry Andric }
8490b57cec5SDimitry Andric 
8500b57cec5SDimitry Andric /*!
8510b57cec5SDimitry Andric  See @ref __kmpc_for_static_init_4
8520b57cec5SDimitry Andric  */
8530b57cec5SDimitry Andric void __kmpc_for_static_init_8u(ident_t *loc, kmp_int32 gtid,
8540b57cec5SDimitry Andric                                kmp_int32 schedtype, kmp_int32 *plastiter,
8550b57cec5SDimitry Andric                                kmp_uint64 *plower, kmp_uint64 *pupper,
8560b57cec5SDimitry Andric                                kmp_int64 *pstride, kmp_int64 incr,
8570b57cec5SDimitry Andric                                kmp_int64 chunk) {
8580b57cec5SDimitry Andric   __kmp_for_static_init<kmp_uint64>(loc, gtid, schedtype, plastiter, plower,
8590b57cec5SDimitry Andric                                     pupper, pstride, incr, chunk
8600b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL
8610b57cec5SDimitry Andric                                     ,
8620b57cec5SDimitry Andric                                     OMPT_GET_RETURN_ADDRESS(0)
8630b57cec5SDimitry Andric #endif
8640b57cec5SDimitry Andric                                         );
8650b57cec5SDimitry Andric }
8660b57cec5SDimitry Andric /*!
8670b57cec5SDimitry Andric @}
8680b57cec5SDimitry Andric */
8690b57cec5SDimitry Andric 
8700b57cec5SDimitry Andric /*!
8710b57cec5SDimitry Andric @ingroup WORK_SHARING
8720b57cec5SDimitry Andric @param    loc       Source code location
8730b57cec5SDimitry Andric @param    gtid      Global thread id of this thread
8740b57cec5SDimitry Andric @param    schedule  Scheduling type for the parallel loop
8750b57cec5SDimitry Andric @param    plastiter Pointer to the "last iteration" flag
8760b57cec5SDimitry Andric @param    plower    Pointer to the lower bound
8770b57cec5SDimitry Andric @param    pupper    Pointer to the upper bound of loop chunk
8780b57cec5SDimitry Andric @param    pupperD   Pointer to the upper bound of dist_chunk
8790b57cec5SDimitry Andric @param    pstride   Pointer to the stride for parallel loop
8800b57cec5SDimitry Andric @param    incr      Loop increment
8810b57cec5SDimitry Andric @param    chunk     The chunk size for the parallel loop
8820b57cec5SDimitry Andric 
8830b57cec5SDimitry Andric Each of the four functions here are identical apart from the argument types.
8840b57cec5SDimitry Andric 
8850b57cec5SDimitry Andric The functions compute the upper and lower bounds and strides to be used for the
8860b57cec5SDimitry Andric set of iterations to be executed by the current thread from the statically
8870b57cec5SDimitry Andric scheduled loop that is described by the initial values of the bounds, strides,
8880b57cec5SDimitry Andric increment and chunks for parallel loop and distribute constructs.
8890b57cec5SDimitry Andric 
8900b57cec5SDimitry Andric @{
8910b57cec5SDimitry Andric */
8920b57cec5SDimitry Andric void __kmpc_dist_for_static_init_4(ident_t *loc, kmp_int32 gtid,
8930b57cec5SDimitry Andric                                    kmp_int32 schedule, kmp_int32 *plastiter,
8940b57cec5SDimitry Andric                                    kmp_int32 *plower, kmp_int32 *pupper,
8950b57cec5SDimitry Andric                                    kmp_int32 *pupperD, kmp_int32 *pstride,
8960b57cec5SDimitry Andric                                    kmp_int32 incr, kmp_int32 chunk) {
8970b57cec5SDimitry Andric   __kmp_dist_for_static_init<kmp_int32>(loc, gtid, schedule, plastiter, plower,
8980b57cec5SDimitry Andric                                         pupper, pupperD, pstride, incr, chunk);
8990b57cec5SDimitry Andric }
9000b57cec5SDimitry Andric 
9010b57cec5SDimitry Andric /*!
9020b57cec5SDimitry Andric  See @ref __kmpc_dist_for_static_init_4
9030b57cec5SDimitry Andric  */
9040b57cec5SDimitry Andric void __kmpc_dist_for_static_init_4u(ident_t *loc, kmp_int32 gtid,
9050b57cec5SDimitry Andric                                     kmp_int32 schedule, kmp_int32 *plastiter,
9060b57cec5SDimitry Andric                                     kmp_uint32 *plower, kmp_uint32 *pupper,
9070b57cec5SDimitry Andric                                     kmp_uint32 *pupperD, kmp_int32 *pstride,
9080b57cec5SDimitry Andric                                     kmp_int32 incr, kmp_int32 chunk) {
9090b57cec5SDimitry Andric   __kmp_dist_for_static_init<kmp_uint32>(loc, gtid, schedule, plastiter, plower,
9100b57cec5SDimitry Andric                                          pupper, pupperD, pstride, incr, chunk);
9110b57cec5SDimitry Andric }
9120b57cec5SDimitry Andric 
9130b57cec5SDimitry Andric /*!
9140b57cec5SDimitry Andric  See @ref __kmpc_dist_for_static_init_4
9150b57cec5SDimitry Andric  */
9160b57cec5SDimitry Andric void __kmpc_dist_for_static_init_8(ident_t *loc, kmp_int32 gtid,
9170b57cec5SDimitry Andric                                    kmp_int32 schedule, kmp_int32 *plastiter,
9180b57cec5SDimitry Andric                                    kmp_int64 *plower, kmp_int64 *pupper,
9190b57cec5SDimitry Andric                                    kmp_int64 *pupperD, kmp_int64 *pstride,
9200b57cec5SDimitry Andric                                    kmp_int64 incr, kmp_int64 chunk) {
9210b57cec5SDimitry Andric   __kmp_dist_for_static_init<kmp_int64>(loc, gtid, schedule, plastiter, plower,
9220b57cec5SDimitry Andric                                         pupper, pupperD, pstride, incr, chunk);
9230b57cec5SDimitry Andric }
9240b57cec5SDimitry Andric 
9250b57cec5SDimitry Andric /*!
9260b57cec5SDimitry Andric  See @ref __kmpc_dist_for_static_init_4
9270b57cec5SDimitry Andric  */
9280b57cec5SDimitry Andric void __kmpc_dist_for_static_init_8u(ident_t *loc, kmp_int32 gtid,
9290b57cec5SDimitry Andric                                     kmp_int32 schedule, kmp_int32 *plastiter,
9300b57cec5SDimitry Andric                                     kmp_uint64 *plower, kmp_uint64 *pupper,
9310b57cec5SDimitry Andric                                     kmp_uint64 *pupperD, kmp_int64 *pstride,
9320b57cec5SDimitry Andric                                     kmp_int64 incr, kmp_int64 chunk) {
9330b57cec5SDimitry Andric   __kmp_dist_for_static_init<kmp_uint64>(loc, gtid, schedule, plastiter, plower,
9340b57cec5SDimitry Andric                                          pupper, pupperD, pstride, incr, chunk);
9350b57cec5SDimitry Andric }
9360b57cec5SDimitry Andric /*!
9370b57cec5SDimitry Andric @}
9380b57cec5SDimitry Andric */
9390b57cec5SDimitry Andric 
9400b57cec5SDimitry Andric //------------------------------------------------------------------------------
9410b57cec5SDimitry Andric // Auxiliary routines for Distribute Parallel Loop construct implementation
9420b57cec5SDimitry Andric //    Transfer call to template< type T >
9430b57cec5SDimitry Andric //    __kmp_team_static_init( ident_t *loc, int gtid,
9440b57cec5SDimitry Andric //        int *p_last, T *lb, T *ub, ST *st, ST incr, ST chunk )
9450b57cec5SDimitry Andric 
9460b57cec5SDimitry Andric /*!
9470b57cec5SDimitry Andric @ingroup WORK_SHARING
9480b57cec5SDimitry Andric @{
9490b57cec5SDimitry Andric @param loc Source location
9500b57cec5SDimitry Andric @param gtid Global thread id
9510b57cec5SDimitry Andric @param p_last pointer to last iteration flag
9520b57cec5SDimitry Andric @param p_lb  pointer to Lower bound
9530b57cec5SDimitry Andric @param p_ub  pointer to Upper bound
9540b57cec5SDimitry Andric @param p_st  Step (or increment if you prefer)
9550b57cec5SDimitry Andric @param incr  Loop increment
9560b57cec5SDimitry Andric @param chunk The chunk size to block with
9570b57cec5SDimitry Andric 
9580b57cec5SDimitry Andric The functions compute the upper and lower bounds and stride to be used for the
9590b57cec5SDimitry Andric set of iterations to be executed by the current team from the statically
9600b57cec5SDimitry Andric scheduled loop that is described by the initial values of the bounds, stride,
9610b57cec5SDimitry Andric increment and chunk for the distribute construct as part of composite distribute
9620b57cec5SDimitry Andric parallel loop construct. These functions are all identical apart from the types
9630b57cec5SDimitry Andric of the arguments.
9640b57cec5SDimitry Andric */
9650b57cec5SDimitry Andric 
9660b57cec5SDimitry Andric void __kmpc_team_static_init_4(ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last,
9670b57cec5SDimitry Andric                                kmp_int32 *p_lb, kmp_int32 *p_ub,
9680b57cec5SDimitry Andric                                kmp_int32 *p_st, kmp_int32 incr,
9690b57cec5SDimitry Andric                                kmp_int32 chunk) {
9700b57cec5SDimitry Andric   KMP_DEBUG_ASSERT(__kmp_init_serial);
9710b57cec5SDimitry Andric   __kmp_team_static_init<kmp_int32>(loc, gtid, p_last, p_lb, p_ub, p_st, incr,
9720b57cec5SDimitry Andric                                     chunk);
9730b57cec5SDimitry Andric }
9740b57cec5SDimitry Andric 
9750b57cec5SDimitry Andric /*!
9760b57cec5SDimitry Andric  See @ref __kmpc_team_static_init_4
9770b57cec5SDimitry Andric  */
9780b57cec5SDimitry Andric void __kmpc_team_static_init_4u(ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last,
9790b57cec5SDimitry Andric                                 kmp_uint32 *p_lb, kmp_uint32 *p_ub,
9800b57cec5SDimitry Andric                                 kmp_int32 *p_st, kmp_int32 incr,
9810b57cec5SDimitry Andric                                 kmp_int32 chunk) {
9820b57cec5SDimitry Andric   KMP_DEBUG_ASSERT(__kmp_init_serial);
9830b57cec5SDimitry Andric   __kmp_team_static_init<kmp_uint32>(loc, gtid, p_last, p_lb, p_ub, p_st, incr,
9840b57cec5SDimitry Andric                                      chunk);
9850b57cec5SDimitry Andric }
9860b57cec5SDimitry Andric 
9870b57cec5SDimitry Andric /*!
9880b57cec5SDimitry Andric  See @ref __kmpc_team_static_init_4
9890b57cec5SDimitry Andric  */
9900b57cec5SDimitry Andric void __kmpc_team_static_init_8(ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last,
9910b57cec5SDimitry Andric                                kmp_int64 *p_lb, kmp_int64 *p_ub,
9920b57cec5SDimitry Andric                                kmp_int64 *p_st, kmp_int64 incr,
9930b57cec5SDimitry Andric                                kmp_int64 chunk) {
9940b57cec5SDimitry Andric   KMP_DEBUG_ASSERT(__kmp_init_serial);
9950b57cec5SDimitry Andric   __kmp_team_static_init<kmp_int64>(loc, gtid, p_last, p_lb, p_ub, p_st, incr,
9960b57cec5SDimitry Andric                                     chunk);
9970b57cec5SDimitry Andric }
9980b57cec5SDimitry Andric 
9990b57cec5SDimitry Andric /*!
10000b57cec5SDimitry Andric  See @ref __kmpc_team_static_init_4
10010b57cec5SDimitry Andric  */
10020b57cec5SDimitry Andric void __kmpc_team_static_init_8u(ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last,
10030b57cec5SDimitry Andric                                 kmp_uint64 *p_lb, kmp_uint64 *p_ub,
10040b57cec5SDimitry Andric                                 kmp_int64 *p_st, kmp_int64 incr,
10050b57cec5SDimitry Andric                                 kmp_int64 chunk) {
10060b57cec5SDimitry Andric   KMP_DEBUG_ASSERT(__kmp_init_serial);
10070b57cec5SDimitry Andric   __kmp_team_static_init<kmp_uint64>(loc, gtid, p_last, p_lb, p_ub, p_st, incr,
10080b57cec5SDimitry Andric                                      chunk);
10090b57cec5SDimitry Andric }
10100b57cec5SDimitry Andric /*!
10110b57cec5SDimitry Andric @}
10120b57cec5SDimitry Andric */
10130b57cec5SDimitry Andric 
10140b57cec5SDimitry Andric } // extern "C"
1015