Фрактальный анализ. Построение фрактала Джулиа с использованием 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 обладают огромным потенциалом и могут продолжить развитие основных направлений науки, таких как понимание изощренной структуры человеческого мозга, изучение квантовой химии и происхождения вселенной.

Библиографический список

  1. 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

  1. Durant L., Szalay T., McClellan R. Recitation 5: CUDA fractals. - Lecture CS 179: GPU Programming. http://courses.cms.caltech.edu/cs101gpu/lec11_rec5.pdf
  2. Сандерс Дж., Кэнрод Э. Технология CUDA в примерах : введение в программирование графических процессоров : Пер. с англ. Слинкина А. А., научный редактор Боресков А.В. - М.: ДМК  Пресс, 2011. - 232 с.: ил.
  • Нет меток