СЯУ про оптимизации floating-point
Feb. 16th, 2021 12:57 pmПосле невероятно плодотворного срача на хабре, обнаружилось что:
1. fdiv очень медленный. Даже в конвейере он медленнее умножения (+71.244%).
2. Rust (LLVM?) оптимизирует деление на 2.0 заменой его на умножение на 0.5. Применимо ко всем положительным степеням двойки (вплоть до 2u128 << 126).
3. Деление на 0.5 вообще превращается в сложение. (А вот оптимизации умножения на ноль в цикле не происходит - честные 10 умножений на ноль).
4. criterion, как всегда, на высоте. black_box отлично работает: a = black_box(b/black_box(2.0)) отключает все оптимизации.
5. Интереснейший сайт https://godbolt.org/
И я не знаю как его работу воспроизвести руками (посмотреть дизассемблер для кода конкретной функции в rust). Я это себе в качестве домашнего задания по lore оставлю.
PS. Я медленно переползаю на dreamwidth, но без фанфар. Кому удобно ЖЖ, будет жж.
1. fdiv очень медленный. Даже в конвейере он медленнее умножения (+71.244%).
2. Rust (LLVM?) оптимизирует деление на 2.0 заменой его на умножение на 0.5. Применимо ко всем положительным степеням двойки (вплоть до 2u128 << 126).
3. Деление на 0.5 вообще превращается в сложение. (А вот оптимизации умножения на ноль в цикле не происходит - честные 10 умножений на ноль).
4. criterion, как всегда, на высоте. black_box отлично работает: a = black_box(b/black_box(2.0)) отключает все оптимизации.
5. Интереснейший сайт https://godbolt.org/
И я не знаю как его работу воспроизвести руками (посмотреть дизассемблер для кода конкретной функции в rust). Я это себе в качестве домашнего задания по lore оставлю.
PS. Я медленно переползаю на dreamwidth, но без фанфар. Кому удобно ЖЖ, будет жж.