Этот пример показывает, как сгенерировать код 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