exponenta event banner

Генерация кода GPU: набор Mandelbrot

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

Предварительные условия для сторонних производителей

Необходимый

В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.

  • Графический процессор NVIDIA ® с поддержкой CUDA и совместимый драйвер.

Дополнительный

Для построений, отличных от MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

Проверка среды графического процессора

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

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

Набор Мандельброта

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

$$z_{k+1} = {z_k}^2 + z_0, k = 0,1,...$$

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

Определение входных областей

Выберите набор пределов, которые определяют сильно увеличенную часть набора Мандельброта в долине между основным кардиоидом и$p/q$ луковицей слева от него. A 1000x1000 и$Re\{x\}$$Im\{y\}$ создается между этими двумя пределами. Алгоритм Мандельброта затем итерируется в каждом местоположении сетки. Для визуализации изображения в полном разрешении достаточно числа итераций 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 для функции

Создание 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

После генерации функции 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

См. также

Приложения

Функции

Объекты

Связанные темы