Основная идея этого проекта - на примере построения множества Мандельброта изучить различные методы аппаратно-ориентированной оптимизации.
Множество Мандельброта ℳ определяется как множество комплексных чисел c ∈ ℂ, для которых рекуррентная последовательность:
$Z_n = Z_{n-1}^2 + Z_0$
остается ограниченной при n → ∞.
Выражение в координатах выглядит следующим образом:
$x_{n+1} = x_n^2 - y_n^2 + x_0$
$y_{n+1} = 2x_ny_n ~~~ + y_0$
Точка c принадлежит ℳ тогда и только тогда, когда для всех n ∈ ℕ:
На практике вычисляется до конечного числа итераций N.
В работе принято N = 256 и R = 10.
- Отсутствие оптимизации.
Функция для вычисления принадледности точки множеству Мандельброта написана каких-либо оптимизаций, обрабатываем по одной точке за раз.
- Использование флагов компилятора.
Я использую компилятор g++ с флагом:
-O3- Автоматическая векторизация компилятором.
В функции для вычисления принадледности точки множеству Мандельброта вместо обработки по одной точке, начинаем обрабатывать сразу по 8 точек плоскости, в результате чего компилятор оптимизирует код.
- Ручная векторизация при помощи intrinsic-ов.
В функции для вычисления принадледности точки множеству Мандельброта также обрабатываем по 8 точек за раз, но теперь оптимизируем код вручную, используя intrinsic-и.
Для сборки необходимо написать в коммандной строке:
makeДля запуска программы необходимо написать в командной строке имя исполняемого файла:
./doПосле запуска программы будет открыто окно с изображением множества Мандельброта. Предусмотрена возможность взаимодействия:
-
Перемещение по графику:
W- ВверхA- ВлевоS- ВнизD- Вправо
-
Zoom графика:
Z- УвеличениеX- Уменьшение
-
Режимы работы.
В зависимости от режима работы будет вызываться функция с той или иной оптимизацией.
1- Без ручных оптимизаций2- Векторизация компилятором3- Векторизация intrinsic-ами
-
Завершение программы:
Q
Для оценки эффективности оптимизаций будем использовать значение fps, полученное встроенной функцией.
Измерения проводились на ноутбуке Thunderobot 911S Core D
Измерения проводились на начальном положении рисунка (при перемещении по рисунку fps может значительно меняться). Для более точных результатов также была ограничена частота процессора до 2Ghz.
| - | Без использования флага -O3 | С использованием флага -O3 |
|---|---|---|
| Без ручных оптимизаций | 5 | 11 |
| Векторизация компилятором | 5 | 26 |
| Векторизация intrinsic-ами | 12 | 48 |