Skip to content

Commit 0836071

Browse files
authored
[Snippets] Fix exec_num precision issues in LinearIR expression ordering (#31975)
### Details: Improve precision of the execution number assignment in `LinearIR::get_inserted_expr_exec_num()` by replacing simple arithmetic operations (+1, -1) with std::nextafter() calls. This ensures proper FP precision when determining execution order for inserted expressions, preventing precision issues. Example: ``` 2.76568e+307 + 1 == 2.76568e+307 ``` ### Tickets: - required for #31950
1 parent 30cac1e commit 0836071

File tree

1 file changed

+4
-5
lines changed

1 file changed

+4
-5
lines changed

src/common/snippets/src/lowered/linear_ir.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <algorithm>
88
#include <cassert>
9+
#include <cmath>
910
#include <cstddef>
1011
#include <cstdint>
1112
#include <cstdlib>
@@ -578,21 +579,19 @@ double LinearIR::get_inserted_expr_exec_num(constExprIt insertion_pos) const {
578579
if (right_pos->get()->get_exec_num() == -1 * std::numeric_limits<double>::max()) {
579580
enumerate_expressions();
580581
}
581-
return right_pos->get()->get_exec_num() - 1;
582+
return std::nextafter(right_pos->get()->get_exec_num(), -std::numeric_limits<double>::infinity());
582583
}
583584
if (right_pos == cend()) { // On the list end
584585
if (left_pos->get()->get_exec_num() == std::numeric_limits<double>::max()) {
585586
enumerate_expressions();
586587
}
587-
return left_pos->get()->get_exec_num() + 1;
588+
return std::nextafter(left_pos->get()->get_exec_num(), std::numeric_limits<double>::infinity());
588589
} // In the list middle
589590
left_order = left_pos->get()->get_exec_num();
590591
right_order = right_pos->get()->get_exec_num();
591592
OPENVINO_ASSERT(right_order > left_order, "Incorrect expression enumeration!");
592593

593-
// sync point to enumerate expressions
594-
// 10 * eps - is to avoid meaningless result after (right_order + left_order) / 2 below
595-
if (std::abs(1 - left_order / right_order) <= 10 * std::numeric_limits<double>::epsilon()) {
594+
if (std::nextafter(left_order, right_order) >= right_order) {
596595
enumerate_expressions();
597596
left_order = left_pos->get()->get_exec_num();
598597
right_order = right_pos->get()->get_exec_num();

0 commit comments

Comments
 (0)