2021-03-09

amarao: (Default)
2021-03-09 01:38 pm

APython

troll mode:

Специальный интерпретатор питона, написанный на ансибле с помощью конечного автомата на хэндлерах. В начале делается set_fact для code с содержимым желаемого python-файла, а дальше он парсится с помощью набора when и рекурсивных include, потом исполняется посредством хэндлеров от include_role, которые делают notify/listen друг другу, разумеется, вместе с when. В некоторых случаях приходится делать в качестве таски для хэндлера include_role (так, например, всё IO делается).

В принципе, внутри кода можно написать import remote_pdb; remote_pdb.set_trace() и тогда ансибл в хэндлерах будет поллить сокеты и давать repr-шелл внутрь этого питона.

Enjoy your debugging.

Для слабых духом можно предложить транспайлер из питона в ансибл py2ansible - всё то же самое, но уже транспилированное в плейбуки. Вот тогда можно будет программировать на ансибле.
amarao: (Default)
2021-03-09 06:07 pm

fast random

Когда-то Олег мне подсказал функцию быстрого псевдорандома:

        factor ^= factor << 13;
        factor ^= factor >> 17;
        factor ^= factor << 5;

Когда я был в недрах piston'а и очень далеко от criterion'а, я не мог её проверить. Сейчас (научившись работать criterion'ом и cargo asm'ом) я могу с уверенностью сказать, что функция эта много медленее, чем кажется. Причина - она не конвейеризируется. Если тело цикла большей частью состоит из рандома (и записи оного), то мы получаем, что каждая следующая строка зависит от предыдущей, и это полностью тормозит конвейер (за вычетом инструкций цикла).

По моим замерам одна инструкция примерно на 70% быстрее, чем три (т.е. трёхкратная разница), и ~25x кратная по сравнению с отсутствием математики (но тут могут быть какие-то ещё спецоптимизации).

Я планирую попробовать сделать рандом конвейеризируемым.

Мораль: viva Criterion.