Ускорение симуляции при помощи GPU Coder

Можно использовать GPU Coder™, чтобы ускорить выполнение модели Simulink® при помощи NVIDIA® графические процессоры. Если вам написали алгоритмы в коде MATLAB®, можно включать код MATLAB в модель Simulink или подсистему при помощи блока MATLAB Function (Simulink). Когда вы симулируете модель, которая содержит блок MATLAB Function, программное обеспечение генерирует исполняемый файл CUDA® MATLAB (MEX) код от блока и динамически соединяет сгенерированный код с Simulink. Для получения дополнительной информации о рабочих процессах генерации кода, поддержанных GPU Coder, смотрите Рабочий процесс Генерации кода графического процессора.

Основные шаги для ускорения симуляции при помощи графического процессора:

  • Создайте или откройте модель

  • Сконфигурируйте модель для ускорения графического процессора путем выбора решателя, языка и других специфичных для графического процессора параметров конфигурации

  • Запустите графический процессор ускоренная модель

Пример: обнаружение ребра Sobel

Алгоритм обнаружения ребра Sobel является популярным все же простым алгоритмом обнаружения ребра, который выполняет 2D пространственную операцию градиента на полутоновом изображении. Эта операция подчеркивает высокие пространственные области частоты, который соответствует ребрам входного изображения.

Алгоритм ребра Sobel вычисляет горизонтальный градиент (H) и вертикальный градиент (V) из входа отображают при помощи двух ортогональных ядер фильтра (k и k'). После операции фильтрации алгоритм вычисляет величину градиента и применяет порог, чтобы найти области изображений, которые считаются ребрами.

k = single([1 2 1; 0 0 0; -1 -2 -1]);
H = conv2(single(grayImage),k, 'same');
V = conv2(single(grayImage),k','same');
E = sqrt(H.*H + V.*V);
edgeImage = uint8((E > threshold) * 255);

MATLAB peppers.png test image and its edge detected output.

Создайте модель обнаружения ребра

  1. Создайте новую модель Simulink и вставьте два блока MATLAB Function из библиотеки User-Defined Functions.

  2. Добавьте блок Constant (Simulink) и установите его значение к 0.4. Добавьте блок From Multimedia File (Computer Vision Toolbox) из библиотеки Computer Vision Toolbox™.

  3. Откройте диалоговое окно Block Parameters для блока From Multimedia File и установите параметр File name на rhinos.avi.

    Установите параметр Image signal на One multidimensional signal.

  4. Добавьте два Video Viewer (Computer Vision Toolbox) блоки от библиотеки Computer Vision Toolbox до модели.

    Simulink model containing blocks for implementing edge detection algorithm.

  5. Дважды кликните на одном из блоков MATLAB Function. Функциональная подпись по умолчанию появляется в Редакторе Блока MATLAB Function.

  6. Задайте функцию под названием sobel, который реализует алгоритм обнаружения ребра Sobel. Функциональный заголовок объявляет grayImage и threshold в качестве аргумента к sobel функция, с edgeImage как возвращаемое значение. Сохраните документ Редактора к файлу.

    function edgeImage  = sobel(grayImage,threshold)   %#codegen
    
    % Define Kernel for Sobel edge detection
    k = single([1 2 1; 0 0 0; -1 -2 -1]);
    
    % Detect Edge
    H = conv2(single(grayImage),k, 'same');
    V = conv2(single(grayImage),k','same');
    E = sqrt(H.*H + V.*V);
    edgeImage = uint8((E > threshold) * 255);
    
    end
    

  7. Щелкните правой кнопкой по блоку MATLAB Function и выберите Block Parameters (Subsystem).

  8. На вкладке Code Generation выберите Reusable function для Function packaging.

  9. Повторите шаги 3 и 4 для другого блока MATLAB Function. Этот блок реализует RGB к полутоновому преобразованию до операции обнаружения ребра Sobel.

    function gray = RGB2gray(RGB)   %#codegen
    % Convert color image to grey image
    
    gray = (0.2989 * double(RGB(:,:,1)) + ...
        0.5870 * double(RGB(:,:,2)) + ...
        0.1140 * double(RGB(:,:,3)));
    
    end
  10. Соедините эти блоки как показано в схеме. Сохраните модель как edgeDetection.slx.

    Simulink model showing connection between the blocks.

  11. Чтобы протестировать на ошибки, симулируйте модель в Редакторе Simulink с помощью кнопки Run на панели инструментов. Чтобы видеть все видеокадры в процессе моделирования, отключите опцию Simulation > Drop Frames to improve Performance блока Video Viewer.

    Edge detected output from the Video Viewer block.

Сконфигурируйте модель для ускорения графического процессора

Параметры конфигурации модели определяют ускоряющий метод, используемый в процессе моделирования.

  1. Откройте диалоговое окно Configuration Parameters, панель Solver. Чтобы скомпилировать вашу модель для ускорения и сгенерировать код CUDA, необходимо сконфигурировать модель, чтобы использовать решатель фиксированного шага. Следующая таблица показывает настройку решателя для этого примера.

    ПараметрУстановкаЭффект на сгенерированном коде
    TypeFixed-stepОбеспечивает постоянный (фиксированный) размер шага, который требуется для генерации кода
    Solverdiscrete (no continuous states)Применяет метод интегрирования фиксированного шага для вычисления производной состояния модели
    Fixed-step sizeautoSimulink выбирает размер шага

    Snapshot of the configuration parameters dialog showing solver options for simulation.

  2. Выберите панель Simulation Target. Выберите GPU acceleration.

    Примечание

    Параметр Language автоматически устанавливается на C++.

  3. GPU Coder определенные опции теперь отображается в панели Simulation Target > GPU Acceleration. В целях этого примера можно использовать значения по умолчанию этих параметров.

    GPU Acceleration pane on the configuration parameters dialog of the model.

  4. Нажмите OK, чтобы сохранить и закрыть диалоговое окно Configuration Parameters.

  5. В качестве альтернативы можно использовать set_param (Simulink), чтобы сконфигурировать программно параметр модели из Окна команды MATLAB. Например,

    set_param('edgeDetection','GPUAcceleration','on');
    

Создание графического процессора ускоренная модель

Чтобы создать графический процессор ускоренная модель и симулировать его, можно запустить модель путем выбора Run на вкладке Simulation или путем выполнения команды:

sim('edgeDetection');

в подсказке MATLAB.

Edge detected output from the Video Viewer block.

Программное обеспечение сначала проверяет, чтобы видеть, был ли код CUDA ранее скомпилирован для модели. Если код был создан ранее, программное обеспечение запускает модель. Если код не был ранее создан, программное обеспечение сначала генерирует и компилирует код CUDA, и затем запускает модель. Инструмент генерации кода помещает сгенерированный код в подпапку рабочей папки под названием slprj/_slprj/edgeDetection.

Ограничения

  • Использование блоков MATLAB Function в графиках Stateflow® не поддерживается.

  • То, когда GPU acceleration включен, генератор кода не поддерживает Import custom code для импорта пользовательского, создало исходные файлы CUDA (*.cu). Вместо этого используйте coder.ceval в блоке MATLAB Function.

  • Блок MATLAB Function не поддерживает все типы данных с языка MATLAB. Для поддерживаемых типов данных обратитесь к документации блока.

Смотрите также

Функции

Похожие темы