Совместный спектральный радиус матриц: приложения и методы вычисления.
Автоматическая оптимизация алгоритмов с помощью...
-
Upload
alexander-borzunov -
Category
Software
-
view
333 -
download
4
Transcript of Автоматическая оптимизация алгоритмов с помощью...
![Page 1: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/1.jpg)
cpmoptimize
Автоматическая оптимизация алгоритмовв Python
Автор: Александр Борзунов,студент ИМКН УрФУ
![Page 2: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/2.jpg)
Простой пример
Задача. Вычислить N-ое число Фибоначчи.
![Page 3: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/3.jpg)
Простой пример
Тривиальный алгоритм:
N = 10 млн
25 минут 31 секунда
Ускоренный алгоритм:
18 секунд
(в 85 раз быстрее)
![Page 4: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/4.jpg)
Теория
Рассмотрим такой язык программирования:• Имеется несколько числовых переменных• С ними можно производить операции:
x = y
x = 5
x += y
x += 6
x -= y
x -= 7
x *= 8
• Используется интересный метод, описанный Александром Скидановым в 2012 году
![Page 5: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/5.jpg)
Теория
• Для выполнения программ на этом языке можно хранить вектор переменных, дополненный единицей:
• Описанные операции можно выполнять, домножая вектор на некоторую матрицу.
![Page 6: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/6.jpg)
Теория• Присваивание другой переменной (x = y):
• Присваивание константы (x = 5):
![Page 7: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/7.jpg)
Теория• Прибавление другой переменной (x += y):
• Домножение на константу (x *= 8):
![Page 8: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/8.jpg)
Теория• Исполнение нескольких операций друг за другом:
• Самое интересное – циклы:
• Если использовать бинарное возведение в степень, то можно выполнять циклы значительно быстрее (не за O(n), а за O(log n) *)
* — при условии, что каждая итерация цикла работает за одинаковое время
![Page 9: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/9.jpg)
Теория
![Page 10: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/10.jpg)
Переходим к реализации
• Практически применимой реализации описанного метода с матрицами не существовало.
• Я решил реализовать этот метод для языка Python.
Поставленные задачи:
• Простота в использовании
• Требуется, чтобы декоратор ни при каких условиях не мог «сломать» программу
![Page 11: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/11.jpg)
Идея
• Сейчас компиляторы умеют заменять операции на более эффективные, предсказывать значения выражений, удалять или менять местами части кода.
• Задача создания эффективного кода частично переносится на компиляторы и интерпретаторы.
• Но компиляторы ещё не заменяют сам алгоритм вычислений на асимптотически более эффективный.
x * 4 x << 2
![Page 12: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/12.jpg)
Пример: длинные циклыЗадача. Вычислить N-ый член последовательности, соответствующей правилу:
• Интуитивно понятно, как появляется очередной член последовательности, однако требуется время, чтобы придумать соответствующую математическую формулу.
![Page 13: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/13.jpg)
Пример: длинные циклы• При использовании декоратора компьютер сам придумает, как быстро считать ответ на нашу задачу:
При N = 101000:
445 мс
![Page 14: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/14.jpg)
Пример: линейно-рекуррентные соотношения
• Тогда придётся либо потратить усилия на составление и реализацию быстрого алгоритма, либо написать тривиальное решение и воспользоваться декоратором.• В обоих случаях производительность программ получится почти одинаковой.
• Помимо чисел Фибоначчи, иногда требуется быстро вычислять значения более сложных рекуррентных формул:
![Page 15: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/15.jpg)
Почему именно Python?
+ Байт-код можно анализировать и изменять без вмешательства в интерпретатор
+ Преимущества метода с матрицами особенно проявляются при наличии длинной арифметики
‒ Проверки типов, выполняемые из-за динамической типизации
‒ Компиляторы C++ могли бы создавать ещё более быстрые программы
![Page 16: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/16.jpg)
Описание библиотеки
cpmoptimize - compute the power of a matrix and optimize
cpmoptimize.xrange(…)
• Замена стандартному xrange, поддерживающая long
cpmoptimize.cpmoptimize(strict=False, iters_limit=5000, …)
• Можно указать, в каких случаях стоит применять оптимизацию, и что делать, когда применить её не удалось
![Page 17: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/17.jpg)
Алгоритм работы декоратора
I. Этап применения декоратора:
1. Найти следующий цикл for
2. Проверить, что тело цикла состоит только из допустимых операций
3. Преобразовать тело цикла в список элементарных операций с ограниченным кругом переменных
4. Установить перед циклом «ловушку»
![Page 18: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/18.jpg)
Выражения и вынос кода за цикл
• Декоратор определит, что значения k и m в выражении (k ** m) & 676 не зависят от того, на какой итерации цикла они используются, а значит значение всего выражения можно вычислить один раз перед циклом.
• Код справа уже можно оптимизировать с помощью матриц.
![Page 19: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/19.jpg)
Алгоритм работы декоратораII. Этап срабатывания «ловушки»:
1. Проверим, что объект, по которому проходится цикл, и используемые переменные имеют нужные типы (это можно сделать только в run-time)
2. Если проверка не удалась, то оптимизацию применить нельзя и нужно запустить исходный байт-код цикла
3. Иначе построим необходимые матрицы
4. Возведём их в степень
5. Присвоим переменным конечные значения
![Page 20: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/20.jpg)
Что ещё можно реализовать?• Замена операций (требуется сохранение
ассоциативности умножения матриц или подобного свойства):
Пример:
• Поддержка вложенных циклов
• Обработка предсказуемых условий
![Page 21: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/21.jpg)
Установка и документация
• Установить библиотеку можно одной командой:
$ sudo pip install cpmoptimize
• Если прописать её в зависимостях у своего проекта, при установке через pip она докачается автоматически.
Хабрахабрhttp://habrahabr.ru/post/236689/
GitHubhttps://github.com/borzunov/cpmoptimize
Python Package Indexhttps://pypi.python.org/pypi/cpmoptimize
![Page 22: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/22.jpg)
Вопросы?
![Page 23: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень](https://reader033.fdocument.pub/reader033/viewer/2022042518/55a5c73a1a28abf46d8b479d/html5/thumbnails/23.jpg)
Спасибо за внимание!