Генерация кода графического процессора: множество Мандельброта

Этот пример показывает, как сгенерировать код CUDA® от простой функции MATLAB® при помощи GPU Coder™. Реализация Множества Мандельброта при помощи стандартных команд MATLAB действует как функция точки входа. Этот пример использует команду codegen, чтобы сгенерировать MEX-функцию, которая работает на графическом процессоре. Можно запустить MEX-функцию, чтобы проверять на ошибки времени выполнения.

Предпосылки

  • CUDA включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.

  • NVIDIA инструментарий CUDA.

  • Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Переменные окружения.

Создайте папку и скопируйте соответствующие файлы

Следующая строка кода создает папку в вашей текущей рабочей папке (pwd) и копирует все соответствующие файлы в эту папку. Если вы не хотите выполнять эту операцию или если вы не можете сгенерировать файлы в этой папке, изменить вашу текущую рабочую папку.

gpucoderdemo_setup('gpucoderdemo_mandelbrot');

Проверьте среду графического процессора

Используйте coder.checkGpuInstall, функционируют и проверяют, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.

envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

Множество Мандельброта

Множество Мандельброта является областью в комплексной плоскости, состоящей из значений для который траектории, заданные

останьтесь ограниченными в. Полную геометрию Множества Мандельброта показывают в фигуре. Это представление не имеет разрешения, чтобы показать богато подробную структуру края недалеко от контура набора.

Входные Define области

Для этого примера выберите набор пределов, которые задают высоко масштабируемую часть Множества Мандельброта в долине между основной кардиоидой и лампой с ее левой стороны от него. Сетка 1000x1000 и создается между этими двумя пределами. Алгоритм Мандельброта затем выполнен с помощью итераций в каждом местоположении сетки. Количества итерации 500 достаточно, чтобы представить изображение в полном разрешении.

maxIterations = 500;
gridSize = 1000;
xlim = [-0.748766713922161, -0.748766707771757];
ylim = [ 0.123640844894862,  0.123640851045266];

x = linspace( xlim(1), xlim(2), gridSize );
y = linspace( ylim(1), ylim(2), gridSize );
[xGrid,yGrid] = meshgrid( x, y );

О функции Мандельброта

Функция mandelbrot_count.m содержит векторизованную реализацию Множества Мандельброта на основе кода, предоставленного в электронной книге Эксперименты в MATLAB Кливом Moler. % #codegen директива включает MATLAB для проверки ошибок генерации кода. Когда GPU Coder сталкивается с прагмой coder.gpu.kernelfun, он пытается параллелизировать все вычисление в этой функции и затем сопоставляет его с графическим процессором.

type mandelbrot_count
% getting started example (mandelbrot_count.m)
function count = mandelbrot_count(maxIterations, xGrid, yGrid) %#codegen
% mandelbrot computation

z0 = xGrid + 1i*yGrid;
count = ones(size(z0));

% Map computation to GPU
coder.gpu.kernelfun;

z = z0;
for n = 0:maxIterations
    z = z.*z + z0;
    inside = abs(z)<=2;
    count = count + inside;
end
count = log(count);

Протестируйте функциональность mandelbrot_count

Запустите функцию mandelbrot_count с xGrid, yGrid значения, которые были ранее сгенерированы и строят результаты.

count = mandelbrot_count(maxIterations, xGrid, yGrid);

figure(2), imagesc( x, y, count );
colormap( [jet();flipud( jet() );0 0 0] );
title('Mandelbrot Set on MATLAB');
axis off

Сгенерируйте MEX CUDA для функции

Чтобы сгенерировать MEX CUDA для функции mandelbrot_count, создайте настройку графического процессора кода, возражают и используют функцию codegen. Из-за архитектурных различий между центральным процессором и графическим процессором, не всегда соответствует числовая верификация. Этот сценарий специально верен при использовании одного типа данных в вашем коде MATLAB и операциях накопления выполнения на этих одном значениях типа данных. Однако существуют случаи как этот пример Мандельброта, где даже удваиваются, типы данных вызывают числовые ошибки. Одна причина этого несоответствия состоит в том, что использование сопроцессоров для операций с плавающей точкой графического процессора соединилось С плавающей точкой, Умножаются - Добавляют инструкции (FMAD), в то время как центральный процессор не использует эти инструкции. Опция fmad=false, которая передается компилятору nvcc, выключает эту оптимизацию FMAD.

cfg = coder.gpuConfig('mex');
cfg.GpuConfig.CompilerFlags = '--fmad=false';
codegen -config cfg -args {maxIterations,xGrid,yGrid} mandelbrot_count

Запустите MEX-функцию

После того, как вы генерируете MEX-функцию, можно проверить, что она имеет ту же функциональность как исходная функция точки входа MATLAB. Запустите сгенерированный mandelbrot_count_mex и постройте результаты.

countGPU = mandelbrot_count_mex(maxIterations, xGrid, yGrid);

figure(2), imagesc( x, y, countGPU );
colormap( [jet();flipud( jet() );0 0 0] );
title('Mandelbrot Set on GPU');
axis off

Заключение

В этом примере код CUDA был сгенерирован для простой функции MATLAB, реализующей Множество Мандельброта. Реализация была выполнена при помощи прагмы coder.gpu.kernelfun и вызова команды codegen, чтобы сгенерировать MEX-функцию. Дополнительные флаги компилятора, а именно, FMAD=false был передан компилятору nvcc, чтобы отключить оптимизацию FMAD, которую выполняют компиляторы NVIDIA.

Команда выполнения: Очистка

Удалите сгенерированные файлы и возвратитесь к исходной папке.

cleanup