Самый простой способ создать ядра CUDA ® - разместить coder.gpu.kernelfun pragma в основную функцию MATLAB ®. Основная функция также известна как функция верхнего уровня или начального уровня. При обнаружении Coder™ графического процессораkernelfun pragma пытается распараллелить все вычисления в рамках этой функции, а затем отображает их в графический процессор.
В этом учебном пособии вы узнаете, как:
Подготовьте код MATLAB для создания кода CUDA с помощью kernelfun прагматика.
Создайте и настройте проект кодера графического процессора.
Определите свойства ввода функции.
Проверьте готовность к созданию кода и проблемы времени выполнения.
Укажите свойства создания кода.
Создание кода CUDA с помощью codegen команда.
Для этого учебного пособия требуются следующие продукты:
MATLAB
MATLAB Coder™
Кодер графического процессора
Компилятор C
Графический процессор NVIDIA ® с поддержкой CUDA
Набор инструментов и драйвер CUDA
Переменные среды для компиляторов и библиотек. Дополнительные сведения см. в разделе Переменные среды
Множество Мандельброта - это область в комплексной плоскости, состоящая из значений z0, для которых траектории, определенные этим уравнением, остаются ограниченными в k→∞.
0, 1,...
Общая геометрия набора Мандельброта показана на рисунке. Этот вид не имеет разрешения, чтобы показать богато детализированную структуру цветовых полей непосредственно за границей набора. При увеличении увеличений набор Мандельброта показывает сложную границу, которая показывает постепенно более тонкую рекурсивную деталь.

В этом учебном пособии выберите набор пределов, определяющих сильно увеличенную часть набора Мандельброта в долине между основным кардиоидом и лампочкой p/q слева от него. Между этими двумя пределами создается сетка из вещественных частей (x) и мнимых частей (y) размером 1000 на 1000. Алгоритм Мандельброта затем итерируется в каждом местоположении сетки. Число итераций 500 позволяет визуализировать изображение в полном разрешении.
maxIterations = 500; gridSize = 1000; xlim = [-0.748766713922161,-0.748766707771757]; ylim = [0.123640844894862,0.123640851045266];
В этом учебном пособии используется реализация набора Mandelbrot с использованием стандартных команд MATLAB, выполняемых на CPU. Этот расчет векторизируется таким образом, что каждое местоположение обновляется одновременно.
Создание сценария MATLAB с именем mandelbrot_count.m со следующими строками кода. Этот код является базовой векторизированной реализацией MATLAB набора Мандельброта. Далее в этом учебном пособии этот файл будет изменен, чтобы сделать его пригодным для создания кода.
function count = mandelbrot_count(maxIterations, xGrid, yGrid) % mandelbrot computation z0 = xGrid + 1i*yGrid; count = ones(size(z0)); z = z0; for n = 0:maxIterations z = z.*z + z0; inside = abs(z)<=2; count = count + inside; end count = log(count);
Создание сценария MATLAB с именем mandelbrot_test.m со следующими строками кода. Сценарий создает сетку 1000 на 1000 вещественных частей (x) и мнимых частей (y) между пределами, определенными xlim и ylim. Он также вызывает mandelbrot_count и строит график результирующего набора Мандельброта.
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 computation in MATLAB count = mandelbrot_count(maxIterations, xGrid, yGrid); % Show figure(1) imagesc( x, y, count ); colormap([jet();flipud( jet() );0 0 0]); axis off title('Mandelbrot set with MATLAB');
Прежде чем сделать версию MATLAB алгоритма набора Мандельброта подходящей для генерации кода, можно проверить функциональность исходного кода.
Измените текущую рабочую папку MATLAB на папку, содержащую два файла, созданных на предыдущем шаге. Программа GPU Coder помещает созданный код в эту папку, изменяя текущую рабочую папку, если у вас нет полного доступа к этой папке.
Откройте окно mandelbrot_test в редакторе MATLAB.
Запустите сценарий тестирования, нажав кнопку run
или введя mandelbrot_test в окне команд MATLAB.
Сценарий тестирования выполняется и отображает геометрию мандельброта в пределах границы, заданной переменными. xlim и ylim.

Чтобы начать процесс создания кода MATLAB для создания кода, используйте файл mandelbrot_count.m.
Установите текущую папку MATLAB в рабочую папку, содержащую файлы для данного учебного пособия.
В редакторе MATLAB откройте mandelbrot_count.m. Файл открывается в редакторе MATLAB. Индикатор сообщения Code Analyzer в правом верхнем углу редактора MATLAB имеет зеленый цвет. Анализатор не обнаружил ошибок, предупреждений или возможностей для улучшения кода.
Включите MATLAB для проверки ошибок генерации кода. После объявления функции добавьте %#codegen директива.
function count = mandelbrot_count(maxIterations, xGrid, yGrid) %#codegen
Индикатор сообщения анализатора кода остается зеленым, указывая, что он не обнаружил проблем с генерацией кода.
Для отображения mandelbrot_count в ядро CUDA, измените исходный код MATLAB, разместив coder.gpu.kernelfun pragma за пределами for-закольцовывание тела.
function count = mandelbrot_count(maxIterations, xGrid, yGrid) %#codegen % mandelbrot computation z0 = xGrid + 1i*yGrid; count = ones(size(z0)); % Add Kernelfun pragma to trigger kernel creation coder.gpu.kernelfun; z = z0; for n = 0:maxIterations z = z.*z + z0; inside = abs(z)<=2; count = count + inside; end count = log(count);
При использовании coder.gpu.kernelfun pragma, GPU Coder пытается отобразить вычисления в функции mandelbrot_count в ГПУ.
Сохраните файл. Теперь можно скомпилировать код с помощью интерфейса командной строки.
Вы можете использовать codegen для преобразования функций MATLAB в статическую или динамическую библиотеку, исполняемый файл или функцию MEX, совместимую с CUDA, вместо использования приложения GPU Coder.
Во время компиляции кодер GPU должен знать типы данных всех входов в функцию точки входа. Поэтому, если входная функция имеет входные данные, необходимо указать ее тип данных во время компиляции файла с помощью codegen функция.
Можно создать входные данные, а затем использовать -args опции в codegen функция, позволяющая кодеру графического процессора определять класс, размер и сложность входных параметров. Создание входных данных для mandelbrot_count используйте следующие команды:
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 );
Кроме того, можно указать размер, тип и сложность входных данных для функций точки входа без генерации входных данных с помощью coder.typeof функция.
ARGS = cell(1,1);
ARGS{1} = cell(3,1);
ARGS{1}{1} = coder.typeof(0);
ARGS{1}{2} = coder.typeof(0,[1000 1000]);
ARGS{1}{3} = coder.typeof(0,[1000 1000]);
Для настройки таких параметров построения, как имя выходного файла, расположение, тип, необходимо создать объекты конфигурации кодера. Для создания объектов используйте coder.gpuConfig функция. Например, для создания coder.MexCodeConfig объект генерации кода для использования с codegen при создании функции MEX используйте:
cfg = coder.gpuConfig('mex');
Другие доступные варианты:
cfg = coder.gpuConfig('lib');, для создания объекта конфигурации генерации кода для использования с codegen при создании статической библиотеки CUDA.
cfg = coder.gpuConfig('dll');, для создания объекта конфигурации генерации кода для использования с codegen при создании динамической библиотеки CUDA.
cfg = coder.gpuConfig('exe');, для создания объекта конфигурации генерации кода для использования с codegen при создании исполняемого файла CUDA.
Дополнительные сведения см. в разделе coder.gpuConfig.
Каждый объект конфигурации поставляется с набором параметров, инициализированных значениями по умолчанию. Точечную нотацию можно использовать для изменения значения одного параметра объекта конфигурации одновременно. Используйте следующий синтаксис:
configuration_object.property = value
Можно включить те же параметры, что и в разделе Создание кода с помощью приложения кодера графического процессора, используя следующие эквиваленты командной строки:
cfg = coder.gpuConfig('mex'); cfg.GpuConfig.CompilerFlags = '--fmad=false'; cfg.GenerateReport = true;
cfg объект конфигурации имеет параметры конфигурации, общие для кодера MATLAB и кодера GPU, и параметры, специфичные для кодера GPU. Все свойства графического процессора, доступные в cfg объект конфигурации путем ввода cfg.GpuConfig в окне команд MATLAB.
>> cfg.GpuConfig
ans =
config with properties:
Enabled: 1
MallocMode: 'discrete'
KernelNamePrefix: ''
EnableCUBLAS: 1
EnableCUSOLVER: 1
EnableCUFFT: 1
Benchmarking: 0
SafeBuild: 0
ComputeCapability: '3.5'
CustomComputeCapability: ''
CompilerFlags: ''
StackLimitPerThread: 1024
MallocThreshold: 200
SelectCudaDevice: -1
--fmad=false флаг при передаче в nvcc, предписывает компилятору отключить оптимизацию умножения с плавающей запятой (FMAD). Эта опция предназначена для предотвращения численного несоответствия в сгенерированном коде из-за архитектурных различий в CPU и GPU. Дополнительные сведения см. в разделе Числовые различия между ЦП и графическим процессором.
Для получения дополнительной информации о параметрах конфигурации, общих для кодера MATLAB и кодера графического процессора, см. coder.CodeConfig класс.
Можно создать сценарий построения mandelbrot_codegen.m автоматизирует последовательность команд, упомянутых выше.
% GPU code generation for getting started example (mandelbrot_count.m) %% Create configuration object of class 'coder.MexCodeConfig'. cfg = coder.gpuConfig('mex'); cfg.GenerateReport = true; cfg.GpuConfig.CompilerFlags = '--fmad=false'; %% Define argument types for entry-point 'mandelbrot_count'. ARGS = cell(1,1); ARGS{1} = cell(3,1); ARGS{1}{1} = coder.typeof(0); ARGS{1}{2} = coder.typeof(0,[1000 1000]); ARGS{1}{3} = coder.typeof(0,[1000 1000]); %% Invoke GPU Coder. codegen -config cfg mandelbrot_count -args ARGS{1}
codegen команда открывает файл mandelbrot_count.m и преобразует код MATLAB в код CUDA.
-report опция инструктирует codegen для создания отчета о создании кода, который можно использовать для отладки кода MATLAB.
-args опция инструктирует codegen для компиляции файла mandelbrot_count.m используя класс, размер и сложность входных параметров maxIterations, xGrid и yGrid.
-config опция инструктирует codegen для использования указанного объекта конфигурации для создания кода.
После успешного создания кода можно просмотреть полученный отчет о создании кода, щелкнув Просмотр отчета в окне команд MATLAB.
>> mandelbrot_codegen Code generation successful: View report

Для проверки правильности созданного MEX-файла см. раздел Проверка правильности сгенерированного кода.