В этом примере показано, как создать код CUDA ® из простой функции MATLAB ® с помощью графического процессора Coder™. Реализация набора Мандельброта с использованием стандартных команд MATLAB действует как функция точки входа. В этом примере используется codegen для создания функции MEX, выполняемой на графическом процессоре. Для проверки ошибок времени выполнения можно запустить функцию MEX.
Необходимый
В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.
Графический процессор NVIDIA ® с поддержкой CUDA и совместимый драйвер.
Дополнительный
Для построений, отличных от MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
Переменные среды для компиляторов и библиотек. Дополнительные сведения см. в разделах Аппаратное обеспечение сторонних производителей и Настройка необходимых продуктов.
Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте coder.checkGpuInstall функция.
envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);
Множество Мандельброта - это область в комплексной плоскости, состоящая из значений
, для которых траектории определяются

остаются ограниченными в.
Общая геометрия набора Мандельброта показана на рисунке. Этот вид не имеет разрешения, чтобы показать богато детализированную структуру цветовых полей непосредственно за границей набора.

Выберите набор пределов, которые определяют сильно увеличенную часть набора Мандельброта в долине между основным кардиоидом и
луковицей слева от него. A 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» Клеве Молер. Директива% # codegen включает MATLAB для проверки ошибок генерации кода. Когда кодер графического процессора сталкивается с coder.gpu.kernelfun pragma, он пытается распараллелить все вычисления внутри этой функции, а затем сопоставляет его с GPU.
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

Создание CUDA MEX для mandelbrot_count создайте объект конфигурации кода графического процессора и запустите codegen команда. Из-за архитектурных различий между CPU и GPU числовая проверка не всегда совпадает. Этот сценарий применим при использовании одного типа данных в коде MATLAB и выполнении операций накопления для этих значений одного типа данных. Подобно этому примеру Мандельброта, даже двойные типы данных вызывают числовые ошибки. Одна из причин этого несоответствия заключается в том, что блоки GPU с плавающей запятой используют плавающие команды умножения-сложения (FMAD), а CPU не использует эти команды. 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
