exponenta event banner

Создание кода с помощью интерфейса командной строки

Самый простой способ создать ядра CUDA ® - разместить coder.gpu.kernelfun pragma в основную функцию MATLAB ®. Основная функция также известна как функция верхнего уровня или начального уровня. При обнаружении Coder™ графического процессораkernelfun pragma пытается распараллелить все вычисления в рамках этой функции, а затем отображает их в графический процессор.

Цели обучения

В этом учебном пособии вы узнаете, как:

  • Подготовьте код MATLAB для создания кода CUDA с помощью kernelfun прагматика.

  • Создайте и настройте проект кодера графического процессора.

  • Определите свойства ввода функции.

  • Проверьте готовность к созданию кода и проблемы времени выполнения.

  • Укажите свойства создания кода.

  • Создание кода CUDA с помощью codegen команда.

Предварительные условия учебного пособия

Для этого учебного пособия требуются следующие продукты:

  • MATLAB

  • MATLAB Coder™

  • Кодер графического процессора

  • Компилятор C

  • Графический процессор NVIDIA ® с поддержкой CUDA

  • Набор инструментов и драйвер CUDA

  • Переменные среды для компиляторов и библиотек. Дополнительные сведения см. в разделе Переменные среды

Пример: Набор Мандельброта

Описание

Множество Мандельброта - это область в комплексной плоскости, состоящая из значений z0, для которых траектории, определенные этим уравнением, остаются ограниченными в k→∞.

zk + 1 = zk2 + z0, k = 0, 1,...

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

Geometry of the Mandelbrot set

Алгоритм

В этом учебном пособии выберите набор пределов, определяющих сильно увеличенную часть набора Мандельброта в долине между основным кардиоидом и лампочкой 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

Выполнить пример Mandelbrot

Прежде чем сделать версию MATLAB алгоритма набора Мандельброта подходящей для генерации кода, можно проверить функциональность исходного кода.

  1. Измените текущую рабочую папку MATLAB на папку, содержащую два файла, созданных на предыдущем шаге. Программа GPU Coder помещает созданный код в эту папку, изменяя текущую рабочую папку, если у вас нет полного доступа к этой папке.

  2. Откройте окно mandelbrot_test в редакторе MATLAB.

  3. Запустите сценарий тестирования, нажав кнопку run или введя mandelbrot_test в окне команд MATLAB.

    Сценарий тестирования выполняется и отображает геометрию мандельброта в пределах границы, заданной переменными. xlim и ylim.

    Plot of Mandelbrot set in MATLAB

Использование кода MATLAB для создания кода

Чтобы начать процесс создания кода MATLAB для создания кода, используйте файл mandelbrot_count.m.

  1. Установите текущую папку MATLAB в рабочую папку, содержащую файлы для данного учебного пособия.

  2. В редакторе MATLAB откройте mandelbrot_count.m. Файл открывается в редакторе MATLAB. Индикатор сообщения Code Analyzer в правом верхнем углу редактора MATLAB имеет зеленый цвет. Анализатор не обнаружил ошибок, предупреждений или возможностей для улучшения кода.

  3. Включите MATLAB для проверки ошибок генерации кода. После объявления функции добавьте %#codegen директива.

    function count = mandelbrot_count(maxIterations, xGrid, yGrid) %#codegen
    

    Индикатор сообщения анализатора кода остается зеленым, указывая, что он не обнаружил проблем с генерацией кода.

  4. Для отображения 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 в ГПУ.

  5. Сохраните файл. Теперь можно скомпилировать код с помощью интерфейса командной строки.

Создание кода из командной строки

Вы можете использовать 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

Code generation report window

Проверка правильности сгенерированного кода

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

См. также

Приложения

Функции

Объекты

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