Фрактальный анализ. Построение фрактала Джулиа с использованием CUDA.
Алёшина О.В., Семенов С.А.
Аннотация
Затрагивается тема фрактального анализа. В статье рассматривается часть фрактала Джулиа. Главной задачей является показать, как с помощью возможностей видеокарты решить задачу классификации точек комплексной плоскости. Программа, решающая задачу классификации, написана на CUDA и имеет графическое представление.
Ключевые слова
CUDA; параллелизм; фрактальный анализ; фрактал Джулиа; программа; графическое представление.
Фрактал Джулиа [3] - это граница класса функций комплексных переменных. Речь идет о рекуррентной формуле для точек комплексной плоскости [1].
(1)
Определение. Точка не является частью фрактала, если в процессе рекуррентных вычислений по этой формуле получается расходящаяся последовательность. Если последовательность значений, образующихся в результате повторного применения формулы, стремится к бесконечности, то точка не принадлежит фракталу. Если последовательность остается ограниченной, то точка принадлежит фракталу.
Рассмотрим задачу классификации точек в виде программы. Программа использует ресурсы графической карты (GPU) для решения задачи.
Создается растровое изображение размером DIM x DIM [2].
CPUBitmap FractalJulia(DIM, DIM);
Задается число параллельных блоков (grid). Каждую точку растрового рисунка можно обсчитывать независимо от остальных.
dim3 grid(DIM, DIM);
kernel<<<grid, 1>>>(dev_FractalJulia);
Функция julia() возвращает 1, если точка принадлежит фракталу, и 0 в противном случае. Задается для точки синий цвет, если julia() вернула 1, и чёрный - если 0.
int juliaValue = julia( x, y );
mas[offset*4+0] = 0;
mas[offset*4+1] = 0;
mas[offset*4+2] = 255*juliaValue;
mas[offset*4+3] = 255;
Сначала идет преобразование координаты пиксела в координаты на комплексной плоскости. Располагаем начало координат в центре изображения, произведя сдвиг на DIM/2. Затем масштабируем с таким же коэффициентом.
const float scale = 1.5;
float Real = scale*(float)(DIM/2 - x)/(DIM/2);
float Image = scale*(float)(DIM/2 - y)/(DIM/2);
Здесь происходит вычисление 200 итераций формулы. Проверяется, произошла ли абсолютная величина порогового значения ( 1000 ). Если да, то последовательность расходится, возвращаем 0 - точка не принадлежит фракталу. Если нет, возвращаем 1 - точка принадлежит фракталу.
for(int i = 0; i < 200; i++)
{
a = a*a+c;
if(a. value() > 1000) return 0;
}
Результат работы программы:
Выводы
Благодаря CUDA, поддерживаемой всеми продуктами NVIDIA на сегодняшний день, программисты могут воспользоваться возможностью «параллельных вычислений» на GPU, что значит распределить работу между сотнями вычислительными механизмами или «ядрами» и получить результаты еще быстрее. В то время как стандартный микропроцессор x86 обычно оснащен двумя или четырьмя ядрами.
Вычисления при помощи графических процессоров NVIDIA CUDA обладают огромным потенциалом и могут продолжить развитие основных направлений науки, таких как понимание изощренной структуры человеческого мозга, изучение квантовой химии и происхождения вселенной.
Библиографический список
- Sanders J., Kandrot E. CUDA by example : an introduction to general-purpose GPU programming. - Addison-Wesley, 2010.
http://developer.download.nvidia.com/books/cuda-by-example/cuda-by-example-sample.pdf
- Durant L., Szalay T., McClellan R. Recitation 5: CUDA fractals. - Lecture CS 179: GPU Programming. http://courses.cms.caltech.edu/cs101gpu/lec11_rec5.pdf
- Сандерс Дж., Кэнрод Э. Технология CUDA в примерах : введение в программирование графических процессоров : Пер. с англ. Слинкина А. А., научный редактор Боресков А.В. - М.: ДМК Пресс, 2011. - 232 с.: ил.