40 return (T(0) <
val) - (
val < T(0));
47 static const size_t allocaSize = 32;
49 char stackAlloc[allocaSize];
50 static constexpr size_t maxElemCount = allocaSize /
sizeof(T);
55 if (n > maxElemCount) {
60 if (pTAlloc !=
reinterpret_cast<pT
>(stackAlloc)) {
65 operator const pT() {
return pTAlloc; }
81 if (bounds->
step == 0) {
89 if (bounds->
step > 0) {
114 auto bounds = &(original_bounds_nest[ind]);
116 switch (bounds->loop_type) {
118 kmp_canonicalize_one_loop_XX<kmp_int32>(
123 kmp_canonicalize_one_loop_XX<kmp_uint32>(
128 kmp_canonicalize_one_loop_XX<kmp_int64>(
133 kmp_canonicalize_one_loop_XX<kmp_uint64>(
157 if (bounds->
ub0 < bounds->
lb0) {
170 if (bounds->
lb0 < bounds->
ub0) {
195 trip_count = kmp_calculate_trip_count_XX<kmp_int32>(
199 trip_count = kmp_calculate_trip_count_XX<kmp_uint32>(
203 trip_count = kmp_calculate_trip_count_XX<kmp_int64>(
207 trip_count = kmp_calculate_trip_count_XX<kmp_uint64>(
225 switch (loop_iv_type) {
236 res =
static_cast<kmp_uint64>(
static_cast<kmp_uint16
>(original_iv));
263 switch (loop_iv_type) {
266 static_cast<kmp_int8>(original_iv2);
277 res =
static_cast<kmp_uint16
>(original_iv1) ==
278 static_cast<kmp_uint16
>(original_iv2);
312 T iv =
static_cast<T
>(original_ivs[ind]);
313 T outer_iv =
static_cast<T
>(original_ivs[bounds->
outer_iv]);
316 (iv > (bounds->
ub0 + bounds->
ub1 * outer_iv))) ||
318 (iv < (bounds->
ub0 + bounds->
ub1 * outer_iv)))) {
333 bool start_with_lower_bound,
bool checkBounds) {
336 T outer_iv =
static_cast<T
>(original_ivs[bounds->
outer_iv]);
338 if (start_with_lower_bound) {
341 temp = bounds->
lb0 + bounds->
lb1 * outer_iv;
343 auto iteration = iterations[ind];
344 temp = bounds->
lb0 + bounds->
lb1 * outer_iv + iteration * bounds->
step;
360 bool start_with_lower_bound,
bool checkBounds) {
364 return kmp_calc_one_iv_XX<kmp_int32>(
366 original_ivs, iterations, ind, start_with_lower_bound,
370 return kmp_calc_one_iv_XX<kmp_uint32>(
372 original_ivs, iterations, ind, start_with_lower_bound,
376 return kmp_calc_one_iv_XX<kmp_int64>(
378 original_ivs, iterations, ind, start_with_lower_bound,
382 return kmp_calc_one_iv_XX<kmp_uint64>(
384 original_ivs, iterations, ind, start_with_lower_bound,
404 auto iteration = iterations[ind];
408 bounds->
lb1 *
static_cast<T
>(original_ivs[bounds->
outer_iv]) +
409 iteration * bounds->
step;
422 kmp_calc_one_iv_rectang_XX<kmp_int32>(
424 original_ivs, iterations, ind);
427 kmp_calc_one_iv_rectang_XX<kmp_uint32>(
429 original_ivs, iterations, ind);
432 kmp_calc_one_iv_rectang_XX<kmp_int64>(
434 original_ivs, iterations, ind);
437 kmp_calc_one_iv_rectang_XX<kmp_uint64>(
439 original_ivs, iterations, ind);
469 auto bounds = &(original_bounds_nest[ind]);
498 auto bounds = &(original_bounds_nest[ind]);
501 auto temp = new_iv / bounds->trip_count;
502 auto iteration = new_iv % bounds->trip_count;
505 iterations[ind] = iteration;
510 auto bounds = &(original_bounds_nest[ind]);
532 typedef typename traits_t<T>::unsigned_t UT;
538 auto &bbounds = bounds->
b;
540 if ((bbounds.lb1 != 0) || (bbounds.ub1 != 0)) {
545 &(bounds_nest[bbounds.outer_iv]));
551 span_t bound_candidate1 =
553 span_t bound_candidate2 =
555 if (bound_candidate1 < bound_candidate2) {
566 span_t bound_candidate1 =
568 span_t bound_candidate2 =
570 if (bound_candidate1 < bound_candidate2) {
586 (
static_cast<UT
>(bbounds.ub0 - bbounds.lb0)) % bbounds.step;
596 typedef typename traits_t<T>::unsigned_t UT;
602 auto &bbounds = bounds->
b;
604 if ((bbounds.lb1 != 0) || (bbounds.ub1 != 0)) {
609 &(bounds_nest[bbounds.outer_iv]));
615 span_t bound_candidate1 =
617 span_t bound_candidate2 =
619 if (bound_candidate1 >= bound_candidate2) {
630 span_t bound_candidate1 =
632 span_t bound_candidate2 =
634 if (bound_candidate1 >= bound_candidate2) {
651 (
static_cast<UT
>(bbounds.ub0 - bbounds.lb0)) % bbounds.step;
680 auto &bbounds = bounds->
b;
682 if (bbounds.lb1 == bbounds.ub1) {
688 T old_lb1 = bbounds.lb1;
689 T old_ub1 = bbounds.ub1;
699 if (((old_lb1 < 0) && (old_lb1 < old_ub1)) ||
700 ((old_lb1 > 0) && (old_lb1 > old_ub1))) {
701 bbounds.lb1 = old_ub1;
703 bbounds.ub1 = old_lb1;
712 &bounds_nest[bbounds.outer_iv]);
715 if (old_lb1 < bbounds.lb1) {
723 }
else if (old_lb1 > bbounds.lb1) {
729 if (old_ub1 > bbounds.ub1) {
736 }
else if (old_ub1 < bbounds.ub1) {
743 if (old_lb1 < bbounds.lb1) {
747 }
else if (old_lb1 > bbounds.lb1) {
752 if (old_ub1 > bbounds.ub1) {
756 }
else if (old_ub1 < bbounds.ub1) {
787 auto bounds = &(bounds_nest[ind]);
790 switch (bounds->b.loop_type) {
792 trip_count = kmp_process_one_loop_XX<kmp_int32>(
797 trip_count = kmp_process_one_loop_XX<kmp_uint32>(
802 trip_count = kmp_process_one_loop_XX<kmp_int64>(
807 trip_count = kmp_process_one_loop_XX<kmp_uint64>(
835 (
static_cast<T
>(original_ivs[ind]) - bounds->
lb0 -
836 bounds->
lb1 *
static_cast<T
>(original_ivs[bounds->
outer_iv])) /
840 iterations = (bounds->
lb0 +
841 bounds->
lb1 *
static_cast<T
>(original_ivs[bounds->
outer_iv]) -
842 static_cast<T
>(original_ivs[ind])) /
857 return kmp_calc_number_of_iterations_XX<kmp_int32>(
861 return kmp_calc_number_of_iterations_XX<kmp_uint32>(
865 return kmp_calc_number_of_iterations_XX<kmp_int64>(
869 return kmp_calc_number_of_iterations_XX<kmp_uint64>(
893 auto bounds = &(bounds_nest[ind].
b);
895 new_iv = new_iv * bounds->trip_count +
915 auto bounds = &(original_bounds_nest[ind]);
917 ind, (lengthened_ind < ind),
true);
928 lengthened_ind = ind;
976 auto bounds = &(original_bounds_nest[ind]);
981 next_original_ivs[ind] = original_ivs[ind];
990 original_bounds_nest, n, next_original_ivs, iterations, ind);
1001template <
typename T>
1006 kmp_index_t ind,
bool start_with_lower_bound,
bool compare_with_start,
1015 T outer_iv =
static_cast<T
>(original_ivs[bounds->
outer_iv]);
1017 if (start_with_lower_bound) {
1020 temp = bounds->
lb0 + bounds->
lb1 * outer_iv;
1030 auto iteration = iterations[ind];
1032 auto step = bounds->
step;
1035 auto accountForStep =
1036 ((bounds->
lb0 + bounds->
lb1 * outer_iv) -
1037 (updated_bounds->
lb0 + updated_bounds->
lb1 * outer_iv)) %
1040 temp = updated_bounds->
lb0 + updated_bounds->
lb1 * outer_iv +
1041 accountForStep + iteration * step;
1044 (temp < (bounds->
lb0 + bounds->
lb1 * outer_iv))) ||
1046 (temp > (bounds->
lb0 + bounds->
lb1 * outer_iv)))) {
1049 temp = bounds->
lb0 + bounds->
lb1 * outer_iv + iteration / 2 * step;
1052 if (compare_with_start) {
1054 T start =
static_cast<T
>(original_ivs_start[ind]);
1066 temp = start + iteration / 4 * step;
1074 (temp > (bounds->
ub0 + bounds->
ub1 * outer_iv))) ||
1076 (temp < (bounds->
ub0 + bounds->
ub1 * outer_iv)))) {
1091 bool compare_with_start,
1096 return kmp_calc_one_iv_for_chunk_end_XX<kmp_int32>(
1100 original_ivs, iterations, ind, start_with_lower_bound,
1101 compare_with_start, original_ivs_start);
1104 return kmp_calc_one_iv_for_chunk_end_XX<kmp_uint32>(
1108 original_ivs, iterations, ind, start_with_lower_bound,
1109 compare_with_start, original_ivs_start);
1112 return kmp_calc_one_iv_for_chunk_end_XX<kmp_int64>(
1116 original_ivs, iterations, ind, start_with_lower_bound,
1117 compare_with_start, original_ivs_start);
1120 return kmp_calc_one_iv_for_chunk_end_XX<kmp_uint64>(
1124 original_ivs, iterations, ind, start_with_lower_bound,
1125 compare_with_start, original_ivs_start);
1158 auto &updated_bounds = updated_bounds_nest[ind];
1161 auto new_ind = new_iv / updated_bounds.
b.
trip_count;
1162 auto iteration = new_iv % updated_bounds.b.trip_count;
1165 iterations[ind] = iteration;
1174 auto bounds = &(original_bounds_nest[ind]);
1175 auto updated_bounds = &(updated_bounds_nest[ind].
b);
1178 bounds, updated_bounds,
1179 original_ivs, iterations, ind, (lengthened_ind < ind),
1180 (equal_ind >= ind - 1), original_ivs_start);
1190 ++(iterations[ind]);
1191 lengthened_ind = ind;
1192 if (equal_ind >= lengthened_ind) {
1195 equal_ind = lengthened_ind - 1;
1204 if ((equal_ind == ind - 1) &&
1205 (
kmp_ivs_eq(bounds->loop_iv_type, original_ivs[ind],
1206 original_ivs_start[ind]))) {
1208 }
else if ((equal_ind > ind - 1) &&
1209 !(
kmp_ivs_eq(bounds->loop_iv_type, original_ivs[ind],
1210 original_ivs_start[ind]))) {
1211 equal_ind = ind - 1;
1222template <
typename T>
1227 T temp = bounds->
ub0 +
1228 bounds->
ub1 *
static_cast<T
>(original_ivs[bounds->
outer_iv]);
1241 kmp_calc_one_iv_end_XX<kmp_int32>(
1246 kmp_calc_one_iv_end_XX<kmp_uint32>(
1251 kmp_calc_one_iv_end_XX<kmp_int64>(
1256 kmp_calc_one_iv_end_XX<kmp_uint64>(
1270 auto bounds = &(original_bounds_nest[ind]);
1296 original_bounds_nest[0].lb0_u64);
1298 original_bounds_nest[0].ub0_u64);
1300 original_bounds_nest[0].lb1_u64);
1302 original_bounds_nest[0].ub1_u64);
1303 if (outer_lb0_u64 != 0 || outer_lb1_u64 != 0 || outer_ub1_u64 != 0) {
1308 original_bounds_nest[1].lb0_u64);
1310 original_bounds_nest[1].ub0_u64);
1312 original_bounds_nest[1].lb1_u64);
1314 original_bounds_nest[1].ub1_u64);
1316 if (inner_lb0_u64 == 0 && inner_lb1_u64 == 0 &&
1317 (inner_ub0_u64 == 0 || inner_ub0_u64 == -1) && inner_ub1_u64 == 1) {
1321 if (inner_lb0_u64 == 0 && inner_lb1_u64 == 1 &&
1322 inner_ub0_u64 == outer_ub0_u64 && inner_ub1_u64 == 0) {
1333#define level_of_precision 0.1
1335 double sqrt_old = 0.;
1336 double sqrt_new = (
double)x;
1338 sqrt_old = sqrt_new;
1339 sqrt_new = (sqrt_old + x / sqrt_old) / 2;
1358 chunk_bounds_nest[
i] = original_bounds_nest[
i];
1362 original_bounds_nest[0].ub0_u64);
1364 original_bounds_nest[0].lb0_u64);
1366 original_bounds_nest[1].ub0_u64);
1373 kmp_uint64 outer_iters = (outer_ub0 - outer_lb0 + 1) + inner_ub0;
1374 kmp_uint64 iter_total = outer_iters * (outer_iters + 1) / 2;
1381 iter_total / nth + ((tid < (iter_total % nth)) ? 1 : 0);
1394 tid * iter_current + ((tid < iter_total % nth) ? 0 : (iter_total % nth));
1397 kmp_uint64 iter_with_current = iter_before_current + iter_current;
1407 kmp_int64 inner_adjustment = 1 + 2 * inner_ub0;
1410 8 * iter_before_current) +
1418 iter_before_current -
1419 ((lower_bound_outer + inner_adjustment) * lower_bound_outer) / 2;
1425 8 * iter_with_current) +
1434 ((upper_bound_outer + inner_adjustment) * upper_bound_outer) / 2;
1437 if (upper_bound_inner == 0) {
1439 upper_bound_outer -= 1;
1440 upper_bound_inner = upper_bound_outer;
1443 upper_bound_inner -= 1;
1448 chunk_bounds_nest[0].
lb0_u64 = lower_bound_outer;
1449 chunk_bounds_nest[1].
lb0_u64 = lower_bound_inner;
1450 chunk_bounds_nest[0].
ub0_u64 = upper_bound_outer;
1451 chunk_bounds_nest[1].
ub0_u64 = upper_bound_inner;
1452 chunk_bounds_nest[0].
lb1_u64 = 0;
1453 chunk_bounds_nest[0].
ub1_u64 = 0;
1454 chunk_bounds_nest[1].
lb1_u64 = 0;
1455 chunk_bounds_nest[1].
ub1_u64 = 0;
1458 printf(
"tid/nth = %d/%d : From [%llu, %llu] To [%llu, %llu] : Chunks %llu/%llu\n",
1459 tid, nth, chunk_bounds_nest[0].lb0_u64, chunk_bounds_nest[1].lb0_u64,
1460 chunk_bounds_nest[0].ub0_u64, chunk_bounds_nest[1].ub0_u64, iter_current, iter_total);
1478 chunk_bounds_nest[
i] = original_bounds_nest[
i];
1482 original_bounds_nest[0].ub0_u64);
1484 original_bounds_nest[0].lb0_u64);
1486 original_bounds_nest[1].loop_iv_type, original_bounds_nest[1].ub0_u64);
1493 kmp_uint64 outer_iters = (outer_ub0 - outer_lb0 + 1);
1494 kmp_uint64 iter_total = outer_iters * (outer_iters + 1) / 2;
1501 iter_total / nth + ((tid < (iter_total % nth)) ? 1 : 0);
1514 tid * iter_current + ((tid < iter_total % nth) ? 0 : (iter_total % nth));
1517 kmp_uint64 iter_with_current = iter_before_current + iter_current;
1529 iter_before_current - ((lower_bound_outer + 1) * lower_bound_outer) / 2;
1539 iter_with_current - ((upper_bound_outer + 1) * upper_bound_outer) / 2;
1542 if (upper_bound_inner == 0) {
1544 upper_bound_outer -= 1;
1545 upper_bound_inner = upper_bound_outer;
1548 upper_bound_inner -= 1;
1553 chunk_bounds_nest[0].
lb0_u64 = (outer_iters - 1) - upper_bound_outer;
1554 chunk_bounds_nest[1].
lb0_u64 = (outer_iters - 1) - upper_bound_inner;
1555 chunk_bounds_nest[0].
ub0_u64 = (outer_iters - 1) - lower_bound_outer;
1556 chunk_bounds_nest[1].
ub0_u64 = (outer_iters - 1) - lower_bound_inner;
1557 chunk_bounds_nest[0].
lb1_u64 = 0;
1558 chunk_bounds_nest[0].
ub1_u64 = 0;
1559 chunk_bounds_nest[1].
lb1_u64 = 0;
1560 chunk_bounds_nest[1].
ub1_u64 = 0;
1563 printf(
"tid/nth = %d/%d : From [%llu, %llu] To [%llu, %llu] : Chunks %llu/%llu\n",
1564 tid, nth, chunk_bounds_nest[0].lb0_u64, chunk_bounds_nest[1].lb0_u64,
1565 chunk_bounds_nest[0].ub0_u64, chunk_bounds_nest[1].ub0_u64, iter_current, iter_total);
1594 KE_TRACE(10, (
"__kmpc_for_collapsed_init called (%d)\n", gtid));
1605 updated_bounds_nest[
i].b = original_bounds_nest[
i];
1611 if (plastiter != NULL) {
1646 original_ivs_start)) {
1670 updated_bounds_nest, original_ivs_start, n);
1672 bool last_iter =
false;
1686 if (remainder > 0) {
1691#if defined(KMP_DEBUG)
1695 if (curr_chunk_size > 1) {
1696 new_iv += curr_chunk_size - 1;
1700 if ((nth == 1) || (new_iv >= total - 1)) {
1710 updated_bounds_nest,
1711 original_ivs_start, new_iv,
1712 original_ivs_end)) {
1721#if defined(KMP_DEBUG)
1723 updated_bounds_nest, original_ivs_end, n);
1727 if (last_iter && (tid != 0)) {
1740 original_ivs_next_start)) {
1743 if (plastiter != NULL) {
1750 chunk_bounds_nest[
i] =
1751 original_bounds_nest[
i];
1752 chunk_bounds_nest[
i].
lb0_u64 = original_ivs_start[
i];
1755 chunk_bounds_nest[
i].
ub0_u64 = original_ivs_end[
i];
1766 original_bounds_nest, n, original_ivs_end, original_ivs_start);
1777 original_ivs_start, n);
T & operator[](int index)
CollapseAllocator(size_t n)
static int __kmp_tid_from_gtid(int gtid)
kmp_info_t ** __kmp_threads
#define __kmp_allocate(size)
int __kmp_env_consistency_check
static void __kmp_assert_valid_gtid(kmp_int32 gtid)
union KMP_ALIGN_CACHE kmp_info kmp_info_t
KMP_ARCH_X86 KMP_ARCH_X86 long double
KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 kmp_int16
KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 kmp_int8
KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 add
void kmp_handle_lower_triangle_matrix(kmp_uint32 nth, kmp_uint32 tid, kmp_index_t n, bounds_info_t *original_bounds_nest, bounds_info_t *chunk_bounds_nest)
void kmp_calc_span_greateroreq_XX(bounds_info_internalXX_template< T > *bounds, bounds_info_internal_t *bounds_nest)
kmp_loop_nest_iv_t kmp_process_loop_nest(bounds_info_internal_t *bounds_nest, kmp_index_t n)
bool kmp_calc_original_ivs_from_iterations(const bounds_info_t *original_bounds_nest, kmp_index_t n, kmp_point_t original_ivs, kmp_iterations_t iterations, kmp_index_t ind)
void kmp_calc_span_XX(bounds_info_internalXX_template< T > *bounds, bounds_info_internal_t *bounds_nest)
void kmp_calc_one_iv_rectang(const bounds_info_t *bounds, kmp_uint64 *original_ivs, const kmp_iterations_t iterations, kmp_index_t ind)
void kmp_calc_span_lessoreq_XX(bounds_info_internalXX_template< T > *bounds, bounds_info_internal_t *bounds_nest)
bool kmp_calc_next_original_ivs(const bounds_info_t *original_bounds_nest, kmp_index_t n, const kmp_point_t original_ivs, kmp_point_t next_original_ivs)
bool kmp_calc_one_iv_for_chunk_end(const bounds_info_t *bounds, const bounds_info_t *updated_bounds, kmp_point_t original_ivs, const kmp_iterations_t iterations, kmp_index_t ind, bool start_with_lower_bound, bool compare_with_start, const kmp_point_t original_ivs_start)
void kmp_canonicalize_loop_nest(ident_t *loc, bounds_info_t *original_bounds_nest, kmp_index_t n)
kmp_loop_nest_iv_t kmp_calc_number_of_iterations_XX(const bounds_infoXX_template< T > *bounds, const kmp_point_t original_ivs, kmp_index_t ind)
bool kmp_calc_one_iv_for_chunk_end_XX(const bounds_infoXX_template< T > *bounds, const bounds_infoXX_template< T > *updated_bounds, kmp_point_t original_ivs, const kmp_iterations_t iterations, kmp_index_t ind, bool start_with_lower_bound, bool compare_with_start, const kmp_point_t original_ivs_start)
bool kmp_iv_is_in_upper_bound_XX(const bounds_infoXX_template< T > *bounds, const kmp_point_t original_ivs, kmp_index_t ind)
bool kmp_calc_original_ivs_for_start(const bounds_info_t *original_bounds_nest, kmp_index_t n, kmp_point_t original_ivs)
kmp_int32 __kmpc_for_collapsed_init(ident_t *loc, kmp_int32 gtid, bounds_info_t *original_bounds_nest, bounds_info_t *chunk_bounds_nest, kmp_index_t n, kmp_int32 *plastiter)
kmp_uint64 kmp_fix_iv(loop_type_t loop_iv_type, kmp_uint64 original_iv)
double sqrt_newton_approx(kmp_uint64 x)
void kmp_calc_one_iv_end_XX(const bounds_infoXX_template< T > *bounds, kmp_point_t original_ivs, kmp_index_t ind)
bool kmp_calc_one_iv_XX(const bounds_infoXX_template< T > *bounds, kmp_point_t original_ivs, const kmp_iterations_t iterations, kmp_index_t ind, bool start_with_lower_bound, bool checkBounds)
void kmp_calc_one_iv_rectang_XX(const bounds_infoXX_template< T > *bounds, kmp_uint64 *original_ivs, const kmp_iterations_t iterations, kmp_index_t ind)
void kmp_calc_original_ivs_for_end(const bounds_info_t *const original_bounds_nest, kmp_index_t n, kmp_point_t original_ivs)
bool kmp_ivs_eq(loop_type_t loop_iv_type, kmp_uint64 original_iv1, kmp_uint64 original_iv2)
void __kmpc_calc_original_ivs_rectang(ident_t *loc, kmp_loop_nest_iv_t new_iv, const bounds_info_t *original_bounds_nest, kmp_uint64 *original_ivs, kmp_index_t n)
kmp_loop_nest_iv_t kmp_calc_number_of_iterations(const bounds_info_t *bounds, const kmp_point_t original_ivs, kmp_index_t ind)
void kmp_handle_upper_triangle_matrix(kmp_uint32 nth, kmp_uint32 tid, kmp_index_t n, bounds_info_t *original_bounds_nest, bounds_info_t *chunk_bounds_nest)
bool kmp_calc_original_ivs_for_chunk_end(const bounds_info_t *original_bounds_nest, kmp_index_t n, const bounds_info_internal_t *updated_bounds_nest, const kmp_point_t original_ivs_start, kmp_loop_nest_iv_t new_iv, kmp_point_t original_ivs)
kmp_loop_nest_iv_t kmp_process_one_loop_XX(bounds_info_internalXX_template< T > *bounds, bounds_info_internal_t *bounds_nest)
kmp_loop_nest_iv_t kmp_calculate_trip_count(bounds_info_t *bounds)
kmp_loop_nest_iv_t kmp_calculate_trip_count_XX(bounds_infoXX_template< T > *bounds)
nested_loop_type_t kmp_identify_nested_loop_structure(bounds_info_t *original_bounds_nest, kmp_index_t n)
kmp_loop_nest_iv_t __kmpc_process_loop_nest_rectang(ident_t *loc, kmp_int32 gtid, bounds_info_t *original_bounds_nest, kmp_index_t n)
void kmp_calc_new_bounds_XX(bounds_info_internalXX_template< T > *bounds, bounds_info_internal_t *bounds_nest)
kmp_loop_nest_iv_t kmp_calc_new_iv_from_original_ivs(const bounds_info_internal_t *bounds_nest, const kmp_point_t original_ivs, kmp_index_t n)
void kmp_calc_one_iv_end(const bounds_info_t *bounds, kmp_point_t original_ivs, kmp_index_t ind)
#define level_of_precision
void kmp_canonicalize_one_loop_XX(ident_t *loc, bounds_infoXX_template< T > *bounds)
bool kmp_calc_one_iv(const bounds_info_t *bounds, kmp_point_t original_ivs, const kmp_iterations_t iterations, kmp_index_t ind, bool start_with_lower_bound, bool checkBounds)
kmp_loop_nest_iv_t * kmp_iterations_t
@ nested_loop_type_unkown
@ nested_loop_type_lower_triangular_matrix
@ nested_loop_type_upper_triangular_matrix
kmp_uint64 kmp_loop_nest_iv_t
#define KMP_DEBUG_ASSERT(cond)
unsigned long long kmp_uint64
void __kmp_push_workshare(int gtid, enum cons_type ct, ident_t const *ident)
void __kmp_error_construct(kmp_i18n_id_t id, enum cons_type ct, ident_t const *ident)
Functions for collecting statistics.
Describes the structure for rectangular nested loops.
kmp_loop_nest_iv_t trip_count
bounds_infoXX_template< T > b
bool loop_bounds_adjusted
Interface struct for rectangular nested loops.
kmp_loop_nest_iv_t trip_count