Pull to refresh

Comments 6

Деление на константу нынче не такое уж и медленное. Компиляторы умеют заменять его умножением на обратное значение: https://godbolt.org/z/1achaeK8W
Да, это несколько инструкций и операция всё ещё дороже других, но при этом значительно быстрее, чем честное деление.

Ссылкой порадовали, залип)
Премного благодарен.

Ну насколько я понимаю, эта оптимизация основана на том, что вычисления в unsigned происходят в кольце вычетов по 2^32, и поэтому там есть обратный элемент. В signed так не получится, во всяком случае в лоб (не работает для отрицательных). Другое дело, что тут компилятор всё равно мог бы доказать, что при отрицательном индексе у него будет UB, при условии, что этот индекс когда-то станет меньше -6. В общем, попробовать поприседать можно, но в данном случае от деления избавиться довольно трудно.

Но наблюдение отличное!

Еще одна выгода от размотки цикла - спекулятивное выполнение: все вероятные и невероятные продолжения посчитаются параллельно и выигрыш в производительности на нескольких ядрах будет в разы.

А в каком языке выполнение возможно на нескольких ядрах без специальных конструкций/вызовов в коде?

Не очень понял, как связано спекулятивное исполнение и несколько ядер. Для этого бы пришлось задействовать (как минимум) протоколы когерентности кэша, а это довольно дорого. Насколько я понимаю, процессоры спекулируют на одном ядре.

А что мешает процессору, который умеет спекулировать обе ветки, делать это на неразмотанном цикле?

Sign up to leave a comment.

Articles