-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Bench against vcl and optimize #5
base: main
Are you sure you want to change the base?
Conversation
С
С |
После отпимизаций В процессе выяснилось, что:
|
Посмотрел ассемблерный выхлоп и обраружил, что
|
16d710f
to
361155c
Compare
Обгоняет VCL-евский синус на
Откуда ускорение? Схема Горнера в для квадратичного многочлена использует просто 2 FMA инструкции. А схема Эстрина возводит в квадрат, а затем тоже делает две FMA. Разница в целое умножение, которое, что важно, является зависимостью следующих двух инструкций. Если посмотреть на кубический многочлен, там тоже вроде как будет разница между Горнером и Эстрином в одно умножение (по 3 FMA и для обоих), но там для Эстрина две из этих FMA можно считать параллельно, и видимо поэтому эффекта это не дает. |
Перезапустил вместе с
|
Оказывается, для разных функций разный оптимальный размер
Насчет округления: rust-lang/portable-simd#421 |
Резальтат запуска на Xeon с AVX512
|
By the way |
Результаты бенчмарка:
А |
bench_func!($range, $func, $ftype, 64); | ||
}; | ||
|
||
($range: expr, $func: tt, $ftype: ty, $vecsize: literal) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А в этом макросе нигде не надо black_box
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А в этом макросе нигде не надо
black_box
?
Тут как раз важно, что оно не black_box
, т.к. это ломает оптимизации. Там даже удаление assert
-а замедляет бенчмарк.
Наверное можно в black_box
засунуть сразу весь слайс типа такого:
let input_data = black_box(data);
assert(input_data.len() == BENCH_POINTS);
...
но кажется это не должно ничего поменять (я попробую).
sin_vals | ||
.sign_combine(self) | ||
.sign_combine(Simd::from_bits(quadrants << 62)) | ||
sin_vals.sign_combine(Simd::from_bits(self.to_bits() ^ (quadrants << 62))) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А давай тут коммент, почему quadrants << 62
? Либо я туплю, либо неочевидно.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Это вытаскивание второго (если считать с младших) бита
C++ рулит :)
(для плюсов специально выставлены флаги
-Ofast
и-fveclib=libmvec
, чтобы скалярный код векторизовался)