fast random
Mar. 9th, 2021 06:07 pmКогда-то Олег мне подсказал функцию быстрого псевдорандома:
factor ^= factor << 13;
factor ^= factor >> 17;
factor ^= factor << 5;
Когда я был в недрах piston'а и очень далеко от criterion'а, я не мог её проверить. Сейчас (научившись работать criterion'ом и cargo asm'ом) я могу с уверенностью сказать, что функция эта много медленее, чем кажется. Причина - она не конвейеризируется. Если тело цикла большей частью состоит из рандома (и записи оного), то мы получаем, что каждая следующая строка зависит от предыдущей, и это полностью тормозит конвейер (за вычетом инструкций цикла).
По моим замерам одна инструкция примерно на 70% быстрее, чем три (т.е. трёхкратная разница), и ~25x кратная по сравнению с отсутствием математики (но тут могут быть какие-то ещё спецоптимизации).
Я планирую попробовать сделать рандом конвейеризируемым.
Мораль: viva Criterion.