Этот пример показывает, как сгенерировать код 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);
Множество Мандельброта является областью в комплексной плоскости, состоящей из значений
для который траектории, заданные

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

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