В этом примере показано, как сгенерировать код CUDA® от простой функции MATLAB® при помощи GPU Coder™. Реализация Множества Мандельброта при помощи стандартных команд MATLAB действует как функция точки входа. Этот пример использует codegen команда, чтобы сгенерировать MEX-функцию, которая работает на графическом процессоре. Можно запустить MEX-функцию, чтобы проверять на ошибки времени выполнения.
Необходимый
Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.
CUDA включил NVIDIA® графический процессор и совместимый драйвер.
Дополнительный
Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Стороннее Оборудование и Подготовку Необходимых как условие продуктов.
Чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно, используйте 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
function count = mandelbrot_count(maxIterations, xGrid, yGrid) %#codegen
% Copyright 2016-2019 The MathWorks, Inc.
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
Code generation successful: To view the report, open('codegen/mex/mandelbrot_count/html/report.mldatx').
После генерации 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
